From 529ade25d5c9381e55de0c7437cefa692d86eb1b Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Fri, 12 Dec 2025 21:53:40 +0800 Subject: [PATCH] Update package.json Remove options section from README for clarity Add 'waiting' event emission during seeking in mediabunnyEngine This change emits a 'waiting' event when the seeking process begins, improving the event handling and allowing for better synchronization during media playback. fix(audioEngine): adjust audio context suspension timing for improved playback responsiveness refactor(mediabunnyVideoShim): remove redundant width and height getters; enhance poster setter and add setAttribute method feat: initialize artplayer-proxy-mediabunny with essential files and structure feat: implement audio and video engines for mediabunny integration - Added audioEngine.js to handle audio playback using MediaBunny. - Created mediabunnyEngine.js to manage both audio and video playback. - Implemented videoEngine.js for rendering video on a canvas. - Introduced canvasProxy.js to create a canvas element and manage its methods. - Developed mediabunnyVideoShim.js to bridge ArtPlayer and MediaBunny functionalities. - Added videoEvents.js for custom event handling related to video playback. - Included a utility function clamp.js for value clamping. feat: add playback rate control to audio and video engines - Introduced playback rate management in the audio engine, allowing dynamic adjustment of playback speed. - Updated the mediabunny engine to expose the new setPlaybackRate method. - Enhanced the mediabunny video shim to support playback rate adjustments, including getter and setter for playbackRate. - Added event emission for rate changes to ensure proper handling in the application. Enhance audio engine and video shim functionality - Added a check to ensure the audio context is initialized before playing audio in the audio engine. - Introduced a new 'playing' getter in the video shim to accurately reflect the playback state, indicating when the video is neither paused nor ended. Refactor audio context initialization to handle errors and remove async/await - Changed `ensureAudioContext` from async to synchronous to simplify error handling. - Added a try-catch block to handle potential errors when creating the AudioContext with a specified sample rate. - Updated calls to `ensureAudioContext` to remove unnecessary await statements. Enhance Mediabunny Engine and Video Shim with State Management and Error Handling - Added readyState, networkState, and error properties to the Mediabunny Engine for better state management. - Implemented error handling during media loading, emitting appropriate events on error. - Updated the Video Engine to emit a 'timeupdate' event for better synchronization. - Extended the Mediabunny Video Shim to expose new properties (readyState, networkState, error) and methods for improved functionality. - Added seekable property to the Video Shim to provide seekable range based on media duration. - Implemented additional properties and methods in the Video Shim for autoplay, loop, controls, currentSrc, poster, preload, defaultMuted, and defaultPlaybackRate. - Enhanced requestVideoFrameCallback and cancelVideoFrameCallback methods for better frame handling. refactor: streamline audio and video engine implementations - Updated audioEngine.js to improve readability and maintainability by using consistent formatting and simplifying function structures. - Refactored mediabunnyEngine.js to enhance clarity and ensure consistent coding style. - Enhanced videoEngine.js with improved async handling and clearer function definitions. - Modified canvasProxy.js to maintain consistent formatting and improve readability. - Updated mediabunnyVideoShim.js to streamline event handling and improve clarity. - Refactored videoEvents.js for better readability and consistency in event listener management. - Simplified clamp.js for improved readability. feat: enhance audio and video loading with metadata callbacks - Updated audioEngine to accept an optional onMetadata callback in the load function, which is triggered upon loading completion. - Modified mediabunnyEngine to handle video and audio loading concurrently, emitting loadedmetadata and durationchange events only when both are ready. - Enhanced videoEngine to include an onMetadata callback in the load function, ensuring metadata events are emitted appropriately. - Implemented a throttling mechanism for the timeupdate event in videoEngine to reduce event emissions and improve performance. feat: add seeking state and played property to mediabunny engine and video shim - Introduced a `_seeking` state in the mediabunny engine to track seek operations. - Emitted 'seeking' and 'seeked' events during seek operations. - Added a `seeking` getter to expose the seeking state. - Implemented a `played` property in the video shim to provide playback range information. - Added `width` and `height` getters to the video shim for better video dimension access. - Enhanced cross-origin handling in the video shim. feat(audioEngine): enhance audio playback management with starvation detection - Added an event emitter to notify when the audio context is waiting. - Implemented a starvation check that suspends the audio context if playback is delayed. - Introduced a mechanism to track the latest scheduled end time of audio buffers. - Updated the handling of audio buffer playback to ensure proper state transitions. refactor: remove unnecessary comments and streamline code in audio, video, and mediabunny engines feat: add resize functionality to canvas proxy and update type definitions - Implemented a resize function in canvasProxy.js to adjust canvas size based on player dimensions and video metadata. - Updated TypeScript definitions for artplayer-proxy-mediabunny to include option and result types. - Modified build-ts script to include all plugin type definitions. - Added TypeScript definitions for artplayer-proxy-canvas and artplayer-proxy-mediabunny. refactor: remove unused properties from Artplayer instance and make option parameter optional in artplayerProxyCanvas type definition Enhance Mediabunny and Video Engine functionality - Added event listener for 'ended' event in mediabunnyEngine to handle playback state. - Modified seek function to check if playback should resume after seeking. - Reset canvas dimensions to zero in videoEngine when video track is not available or cannot be decoded. - Ensured canvas is cleared when video track is invalid to prevent rendering issues. Emit 'waiting' event during loadstart in mediabunnyEngine Refactor event emission in mediabunnyEngine and add sleep utility function - Changed the event emission for 'loadstart' to be asynchronous using setTimeout. - Introduced a new utility function 'sleep' to facilitate delayed execution in promises. feat: enhance mediabunny proxy with new options and source handling - Added options for event delay, load timeout, timeupdate interval, AV sync tolerance, poster, and source in README. - Implemented source normalization in audio and video engines to support URL, Blob, and ReadableStream. - Updated mediabunny engine to handle new options and improve load handling with timeout and error management. - Enhanced video engine to draw a poster when no video source is available and manage playback rate. - Modified shim to accept source option and integrate with the new engine options. - Updated TypeScript definitions to reflect new options and source types. feat: add dropLateFrames option to video and mediabunny engines - Introduced dropLateFrames option in mediabunnyEngine and videoEngine to control frame dropping behavior. - Updated videoEngine logic to handle frame rendering based on the dropLateFrames setting. - Added type definition for dropLateFrames in TypeScript declaration file. fix: delay loadstart event emission to ensure proper event handling The 'loadstart' event emission is now wrapped in a setTimeout to ensure it is triggered after the current call stack is cleared. This change aims to improve the timing of event emissions and prevent potential issues with event handling in the mediabunny engine. feat: add preflight range check and drop late frames option - Updated README.md to include new options: dropLateFrames and preflightRange. - Enhanced mediabunnyEngine to support new options with default values. - Implemented preflight function in videoEngine to check server support for Range requests. - Adjusted videoEngine to utilize preflight check before loading media. - Updated TypeScript definitions to include preflightRange option. Remove aspectRatio option from Artplayer configuration Update README and mediabunny example URL for consistency Refactor code structure for improved readability and maintainability Update dependencies and fix play/seek state management in mediabunnyEngine --- README.md | 1 + docs/assets/example/mediabunny.js | 19 + docs/assets/js/common.js | 2 + docs/assets/ts/artplayer-plugin-ads.d.ts | 4 +- .../assets/ts/artplayer-plugin-ambilight.d.ts | 4 +- docs/assets/ts/artplayer-plugin-asr.d.ts | 4 +- .../ts/artplayer-plugin-auto-thumbnail.d.ts | 4 +- docs/assets/ts/artplayer-plugin-chapter.d.ts | 4 +- .../ts/artplayer-plugin-chromecast.d.ts | 4 +- .../ts/artplayer-plugin-danmuku-mask.d.ts | 4 +- docs/assets/ts/artplayer-plugin-danmuku.d.ts | 4 +- .../ts/artplayer-plugin-dash-control.d.ts | 4 +- .../ts/artplayer-plugin-document-pip.d.ts | 4 +- .../ts/artplayer-plugin-hls-control.d.ts | 4 +- docs/assets/ts/artplayer-plugin-iframe.d.ts | 4 +- docs/assets/ts/artplayer-plugin-libass.d.ts | 4 +- .../artplayer-plugin-multiple-subtitles.d.ts | 4 +- docs/assets/ts/artplayer-plugin-vast.d.ts | 4 +- .../ts/artplayer-plugin-vtt-thumbnail.d.ts | 4 +- docs/assets/ts/artplayer-proxy-canvas.d.ts | 10 + .../assets/ts/artplayer-proxy-mediabunny.d.ts | 19 + docs/assets/ts/artplayer.d.ts | 36 +- docs/compiled/artplayer-proxy-mediabunny.js | 8 + .../artplayer-proxy-mediabunny.legacy.js | 8 + docs/compiled/artplayer-proxy-mediabunny.mjs | 8 + docs/compiled/artplayer.js | 2 +- docs/compiled/artplayer.legacy.js | 2 +- docs/compiled/artplayer.mjs | 2 +- docs/document/404.html | 4 +- docs/document/advanced/built-in.html | 25 +- docs/document/advanced/class.html | 8 +- docs/document/advanced/event.html | 8 +- docs/document/advanced/global.html | 22 +- docs/document/advanced/plugin.html | 8 +- docs/document/advanced/property.html | 46 +- ...gK.js => advanced_built-in.md.DiyRIcIA.js} | 15 +- ... => advanced_built-in.md.DiyRIcIA.lean.js} | 2 +- ...tmUD.js => advanced_global.md.Bdw3azKs.js} | 14 +- ...js => advanced_global.md.Bdw3azKs.lean.js} | 2 +- ...H1.js => advanced_property.md.CA7GaeI3.js} | 33 +- ... => advanced_property.md.CA7GaeI3.lean.js} | 2 +- .../{app.BlRCrxkx.js => app.BCRud2d5.js} | 2 +- .../{theme.eweRVmWa.js => theme.Njr0hWwi.js} | 2 +- .../chunks/virtual_search-data.BYUjhbX8.js | 1403 ++ .../chunks/virtual_search-data.lPsPwGvM.js | 1368 -- ...js => en_advanced_built-in.md.XdT81JC0.js} | 59 +- ... en_advanced_built-in.md.XdT81JC0.lean.js} | 2 +- .../assets/en_advanced_class.md.BLyA7rxa.js | 8 + ... => en_advanced_class.md.BLyA7rxa.lean.js} | 2 +- .../assets/en_advanced_class.md.C3V-LDO3.js | 8 - ...YW.js => en_advanced_event.md.CtQl1IYg.js} | 119 +- .../en_advanced_event.md.CtQl1IYg.lean.js | 1 + .../en_advanced_event.md.D5Yv5LYW.lean.js | 1 - ...t.js => en_advanced_global.md.D5Nz8wyo.js} | 113 +- ...=> en_advanced_global.md.D5Nz8wyo.lean.js} | 2 +- ...D.js => en_advanced_plugin.md.BOuMu80J.js} | 8 +- .../en_advanced_plugin.md.BOuMu80J.lean.js | 1 + .../en_advanced_plugin.md.hspsx5uD.lean.js | 1 - ...js => en_advanced_property.md.urRMaqHe.js} | 178 +- ... en_advanced_property.md.urRMaqHe.lean.js} | 2 +- ...> en_component_contextmenu.md.COLfX45a.js} | 10 +- ...component_contextmenu.md.COLfX45a.lean.js} | 2 +- ...s => en_component_controls.md.BbQsn0wJ.js} | 8 +- .../en_component_controls.md.BbQsn0wJ.lean.js | 1 + .../en_component_controls.md.Bj2oItzY.lean.js | 1 - ....js => en_component_layers.md.CX93a7QS.js} | 22 +- ...> en_component_layers.md.CX93a7QS.lean.js} | 2 +- ...js => en_component_setting.md.C6o2AWtX.js} | 67 +- ... en_component_setting.md.C6o2AWtX.lean.js} | 2 +- ...md.CS_tThma.js => en_index.md.C1_6xfSn.js} | 28 +- .../assets/en_index.md.C1_6xfSn.lean.js | 1 + .../assets/en_index.md.CS_tThma.lean.js | 1 - ...Vsjwvu.js => en_start_i18n.md.B_wMV7AZ.js} | 8 +- ...n.js => en_start_i18n.md.B_wMV7AZ.lean.js} | 2 +- ...hU8Q.js => en_start_option.md.Bk4YXvof.js} | 224 +- ...js => en_start_option.md.Bk4YXvof.lean.js} | 2 +- ...ex.md.BiU-7WW0.js => index.md.BfiYqSM4.js} | 10 +- ...7WW0.lean.js => index.md.BfiYqSM4.lean.js} | 0 ...ZOFMk.js => plugin_danmuku.md.B7E5dRUy.js} | 2 +- ....js => plugin_danmuku.md.B7E5dRUy.lean.js} | 0 ....Dd9hEcJD.js => start_i18n.md.CO8qytwE.js} | 2 +- ...lean.js => start_i18n.md.CO8qytwE.lean.js} | 0 ...5CHO-We.js => start_option.md.D52S8Ynf.js} | 12 +- ...an.js => start_option.md.D52S8Ynf.lean.js} | 2 +- docs/document/component/contextmenu.html | 8 +- docs/document/component/controls.html | 8 +- docs/document/component/layers.html | 8 +- docs/document/component/setting.html | 8 +- docs/document/en/advanced/built-in.html | 69 +- docs/document/en/advanced/class.html | 12 +- docs/document/en/advanced/event.html | 131 +- docs/document/en/advanced/global.html | 123 +- docs/document/en/advanced/plugin.html | 16 +- docs/document/en/advanced/property.html | 193 +- docs/document/en/component/contextmenu.html | 20 +- docs/document/en/component/controls.html | 18 +- docs/document/en/component/layers.html | 32 +- docs/document/en/component/setting.html | 77 +- docs/document/en/index.html | 38 +- docs/document/en/start/i18n.html | 18 +- docs/document/en/start/option.html | 232 +- docs/document/hashmap.json | 2 +- docs/document/index.html | 18 +- docs/document/plugin/danmuku.html | 10 +- docs/document/start/i18n.html | 12 +- docs/document/start/option.html | 22 +- docs/index.html | 3 + .../artplayer-proxy-mediabunny/index.js | 16613 ++++++++++++++++ .../artplayer-proxy-mediabunny/index.js.map | 1 + .../types/artplayer-proxy-canvas.d.ts | 2 +- .../artplayer-proxy-mediabunny/.npmignore | 6 + packages/artplayer-proxy-mediabunny/README.md | 11 + .../dist/artplayer-proxy-mediabunny.js | 8 + .../dist/artplayer-proxy-mediabunny.legacy.js | 8 + .../dist/artplayer-proxy-mediabunny.mjs | 8 + .../mediabunny/llms-full.txt | 5067 +++++ .../mediabunny/mediabunny.d.ts | 3174 +++ .../artplayer-proxy-mediabunny/package.json | 40 + .../src/engine/audioEngine.js | 316 + .../src/engine/mediabunnyEngine.js | 220 + .../src/engine/videoEngine.js | 308 + .../artplayer-proxy-mediabunny/src/index.js | 11 + .../src/proxy/canvasProxy.js | 64 + .../src/shim/mediabunnyVideoShim.js | 278 + .../src/shim/videoEvents.js | 28 + .../src/utils/clamp.js | 3 + .../src/utils/sleep.js | 5 + .../types/artplayer-proxy-mediabunny.d.ts | 18 + packages/artplayer/dist/artplayer.js | 2 +- packages/artplayer/dist/artplayer.legacy.js | 2 +- packages/artplayer/dist/artplayer.mjs | 2 +- scripts/build-ts.js | 2 +- 132 files changed, 29076 insertions(+), 2258 deletions(-) create mode 100644 docs/assets/example/mediabunny.js create mode 100644 docs/assets/ts/artplayer-proxy-canvas.d.ts create mode 100644 docs/assets/ts/artplayer-proxy-mediabunny.d.ts create mode 100644 docs/compiled/artplayer-proxy-mediabunny.js create mode 100644 docs/compiled/artplayer-proxy-mediabunny.legacy.js create mode 100644 docs/compiled/artplayer-proxy-mediabunny.mjs rename docs/document/assets/{advanced_built-in.md.B5ccy6gK.js => advanced_built-in.md.DiyRIcIA.js} (93%) rename docs/document/assets/{advanced_built-in.md.B5ccy6gK.lean.js => advanced_built-in.md.DiyRIcIA.lean.js} (77%) rename docs/document/assets/{advanced_global.md.C-56tmUD.js => advanced_global.md.Bdw3azKs.js} (95%) rename docs/document/assets/{advanced_global.md.C-56tmUD.lean.js => advanced_global.md.Bdw3azKs.lean.js} (87%) rename docs/document/assets/{advanced_property.md.D59FnDH1.js => advanced_property.md.CA7GaeI3.js} (90%) rename docs/document/assets/{advanced_property.md.D59FnDH1.lean.js => advanced_property.md.CA7GaeI3.lean.js} (60%) rename docs/document/assets/{app.BlRCrxkx.js => app.BCRud2d5.js} (95%) rename docs/document/assets/chunks/{theme.eweRVmWa.js => theme.Njr0hWwi.js} (99%) create mode 100644 docs/document/assets/chunks/virtual_search-data.BYUjhbX8.js delete mode 100644 docs/document/assets/chunks/virtual_search-data.lPsPwGvM.js rename docs/document/assets/{en_advanced_built-in.md.CY71IZlq.js => en_advanced_built-in.md.XdT81JC0.js} (69%) rename docs/document/assets/{en_advanced_built-in.md.CY71IZlq.lean.js => en_advanced_built-in.md.XdT81JC0.lean.js} (76%) create mode 100644 docs/document/assets/en_advanced_class.md.BLyA7rxa.js rename docs/document/assets/{en_advanced_class.md.C3V-LDO3.lean.js => en_advanced_class.md.BLyA7rxa.lean.js} (94%) delete mode 100644 docs/document/assets/en_advanced_class.md.C3V-LDO3.js rename docs/document/assets/{en_advanced_event.md.D5Yv5LYW.js => en_advanced_event.md.CtQl1IYg.js} (79%) create mode 100644 docs/document/assets/en_advanced_event.md.CtQl1IYg.lean.js delete mode 100644 docs/document/assets/en_advanced_event.md.D5Yv5LYW.lean.js rename docs/document/assets/{en_advanced_global.md.BbhNIAMt.js => en_advanced_global.md.D5Nz8wyo.js} (71%) rename docs/document/assets/{en_advanced_global.md.BbhNIAMt.lean.js => en_advanced_global.md.D5Nz8wyo.lean.js} (79%) rename docs/document/assets/{en_advanced_plugin.md.hspsx5uD.js => en_advanced_plugin.md.BOuMu80J.js} (90%) create mode 100644 docs/document/assets/en_advanced_plugin.md.BOuMu80J.lean.js delete mode 100644 docs/document/assets/en_advanced_plugin.md.hspsx5uD.lean.js rename docs/document/assets/{en_advanced_property.md.COS94_z7.js => en_advanced_property.md.urRMaqHe.js} (70%) rename docs/document/assets/{en_advanced_property.md.COS94_z7.lean.js => en_advanced_property.md.urRMaqHe.lean.js} (75%) rename docs/document/assets/{en_component_contextmenu.md.DgD64wIy.js => en_component_contextmenu.md.COLfX45a.js} (83%) rename docs/document/assets/{en_component_contextmenu.md.DgD64wIy.lean.js => en_component_contextmenu.md.COLfX45a.lean.js} (90%) rename docs/document/assets/{en_component_controls.md.Bj2oItzY.js => en_component_controls.md.BbQsn0wJ.js} (87%) create mode 100644 docs/document/assets/en_component_controls.md.BbQsn0wJ.lean.js delete mode 100644 docs/document/assets/en_component_controls.md.Bj2oItzY.lean.js rename docs/document/assets/{en_component_layers.md.BNGRBNoB.js => en_component_layers.md.CX93a7QS.js} (88%) rename docs/document/assets/{en_component_layers.md.BNGRBNoB.lean.js => en_component_layers.md.CX93a7QS.lean.js} (90%) rename docs/document/assets/{en_component_setting.md.Dqvlpr4j.js => en_component_setting.md.C6o2AWtX.js} (77%) rename docs/document/assets/{en_component_setting.md.Dqvlpr4j.lean.js => en_component_setting.md.C6o2AWtX.lean.js} (65%) rename docs/document/assets/{en_index.md.CS_tThma.js => en_index.md.C1_6xfSn.js} (78%) create mode 100644 docs/document/assets/en_index.md.C1_6xfSn.lean.js delete mode 100644 docs/document/assets/en_index.md.CS_tThma.lean.js rename docs/document/assets/{en_start_i18n.md.CXVsjwvu.js => en_start_i18n.md.B_wMV7AZ.js} (79%) rename docs/document/assets/{en_start_i18n.md.CXVsjwvu.lean.js => en_start_i18n.md.B_wMV7AZ.lean.js} (70%) rename docs/document/assets/{en_start_option.md.6JX4hU8Q.js => en_start_option.md.Bk4YXvof.js} (68%) rename docs/document/assets/{en_start_option.md.6JX4hU8Q.lean.js => en_start_option.md.Bk4YXvof.lean.js} (51%) rename docs/document/assets/{index.md.BiU-7WW0.js => index.md.BfiYqSM4.js} (96%) rename docs/document/assets/{index.md.BiU-7WW0.lean.js => index.md.BfiYqSM4.lean.js} (100%) rename docs/document/assets/{plugin_danmuku.md.oENZOFMk.js => plugin_danmuku.md.B7E5dRUy.js} (99%) rename docs/document/assets/{plugin_danmuku.md.oENZOFMk.lean.js => plugin_danmuku.md.B7E5dRUy.lean.js} (100%) rename docs/document/assets/{start_i18n.md.Dd9hEcJD.js => start_i18n.md.CO8qytwE.js} (98%) rename docs/document/assets/{start_i18n.md.Dd9hEcJD.lean.js => start_i18n.md.CO8qytwE.lean.js} (100%) rename docs/document/assets/{start_option.md.B5CHO-We.js => start_option.md.D52S8Ynf.js} (96%) rename docs/document/assets/{start_option.md.B5CHO-We.lean.js => start_option.md.D52S8Ynf.lean.js} (58%) create mode 100644 docs/uncompiled/artplayer-proxy-mediabunny/index.js create mode 100644 docs/uncompiled/artplayer-proxy-mediabunny/index.js.map create mode 100644 packages/artplayer-proxy-mediabunny/.npmignore create mode 100644 packages/artplayer-proxy-mediabunny/README.md create mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js create mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js create mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs create mode 100644 packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt create mode 100644 packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts create mode 100644 packages/artplayer-proxy-mediabunny/package.json create mode 100644 packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/index.js create mode 100644 packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js create mode 100644 packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js create mode 100644 packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js create mode 100644 packages/artplayer-proxy-mediabunny/src/utils/clamp.js create mode 100644 packages/artplayer-proxy-mediabunny/src/utils/sleep.js create mode 100644 packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts diff --git a/README.md b/README.md index 17f3f18c9..68ec72d30 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ let art = new Artplayer({ ## Proxys - [Canvas](https://artplayer.org/?libs=./uncompiled/artplayer-proxy-canvas/index.js&example=canvas) +- [Mediabunny](https://artplayer.org/?libs=./uncompiled/artplayer-proxy-mediabunny/index.js&example=mediabunny) (WIP) ## Changelog diff --git a/docs/assets/example/mediabunny.js b/docs/assets/example/mediabunny.js new file mode 100644 index 000000000..9eafa3e2c --- /dev/null +++ b/docs/assets/example/mediabunny.js @@ -0,0 +1,19 @@ +// npm i artplayer-proxy-mediabunny +// import artplayerProxyMediabunny from 'artplayer-proxy-mediabunny'; + +const art = new Artplayer({ + container: '.artplayer-app', + url: '/assets/sample/frag_bunny.mp4', + autoSize: false, + screenshot: true, + setting: true, + loop: true, + flip: true, + playbackRate: true, + fullscreen: true, + fullscreenWeb: true, + miniProgressBar: true, + autoPlayback: true, + autoOrientation: true, + proxy: artplayerProxyMediabunny(), +}) diff --git a/docs/assets/js/common.js b/docs/assets/js/common.js index 922b95baf..d61ebfe27 100644 --- a/docs/assets/js/common.js +++ b/docs/assets/js/common.js @@ -63,6 +63,8 @@ './assets/ts/artplayer-plugin-vast.d.ts', './assets/ts/artplayer-plugin-vtt-thumbnail.d.ts', './assets/ts/artplayer-plugin-document-pip.d.ts', + './assets/ts/artplayer-proxy-canvas.d.ts', + './assets/ts/artplayer-proxy-mediabunny.d.ts', './assets/ts/artplayer.d.ts', ] diff --git a/docs/assets/ts/artplayer-plugin-ads.d.ts b/docs/assets/ts/artplayer-plugin-ads.d.ts index 618fdd6c1..dd3cde90e 100644 --- a/docs/assets/ts/artplayer-plugin-ads.d.ts +++ b/docs/assets/ts/artplayer-plugin-ads.d.ts @@ -48,5 +48,5 @@ declare const artplayerPluginAds: (option: Option) => (art: Artplayer) => Ads export default artplayerPluginAds -export = artplayerPluginAds -export as namespace artplayerPluginAds; +export = artplayerPluginAds; +export as namespace artplayerPluginAds; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-ambilight.d.ts b/docs/assets/ts/artplayer-plugin-ambilight.d.ts index 50abda15a..786b884f4 100644 --- a/docs/assets/ts/artplayer-plugin-ambilight.d.ts +++ b/docs/assets/ts/artplayer-plugin-ambilight.d.ts @@ -16,5 +16,5 @@ declare const artplayerPluginAmbilight: (option: Option) => (art: Artplayer) => export default artplayerPluginAmbilight -export = artplayerPluginAmbilight -export as namespace artplayerPluginAmbilight; +export = artplayerPluginAmbilight; +export as namespace artplayerPluginAmbilight; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-asr.d.ts b/docs/assets/ts/artplayer-plugin-asr.d.ts index 769e0b30f..a134e7348 100644 --- a/docs/assets/ts/artplayer-plugin-asr.d.ts +++ b/docs/assets/ts/artplayer-plugin-asr.d.ts @@ -22,5 +22,5 @@ declare function artplayerPluginAsr(option?: AsrPluginOption): (art: Artplayer) export default artplayerPluginAsr -export = artplayerPluginAsr -export as namespace artplayerPluginAsr; +export = artplayerPluginAsr; +export as namespace artplayerPluginAsr; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-auto-thumbnail.d.ts b/docs/assets/ts/artplayer-plugin-auto-thumbnail.d.ts index e6f616aa0..dff0302ce 100644 --- a/docs/assets/ts/artplayer-plugin-auto-thumbnail.d.ts +++ b/docs/assets/ts/artplayer-plugin-auto-thumbnail.d.ts @@ -13,5 +13,5 @@ declare const artplayerPluginAutoThumbnail: (option: Option) => (art: Artplayer) export default artplayerPluginAutoThumbnail -export = artplayerPluginAutoThumbnail -export as namespace artplayerPluginAutoThumbnail; +export = artplayerPluginAutoThumbnail; +export as namespace artplayerPluginAutoThumbnail; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-chapter.d.ts b/docs/assets/ts/artplayer-plugin-chapter.d.ts index 5d6f7b378..0c16baa40 100644 --- a/docs/assets/ts/artplayer-plugin-chapter.d.ts +++ b/docs/assets/ts/artplayer-plugin-chapter.d.ts @@ -17,5 +17,5 @@ declare const artplayerPluginChapter: (option: Option) => (art: Artplayer) => Re export default artplayerPluginChapter -export = artplayerPluginChapter -export as namespace artplayerPluginChapter; +export = artplayerPluginChapter; +export as namespace artplayerPluginChapter; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-chromecast.d.ts b/docs/assets/ts/artplayer-plugin-chromecast.d.ts index 5069b042d..4d3aadd12 100644 --- a/docs/assets/ts/artplayer-plugin-chromecast.d.ts +++ b/docs/assets/ts/artplayer-plugin-chromecast.d.ts @@ -13,5 +13,5 @@ declare const artplayerPluginChromecast: (option: Option) => (art: Artplayer) => export default artplayerPluginChromecast -export = artplayerPluginChromecast -export as namespace artplayerPluginChromecast; +export = artplayerPluginChromecast; +export as namespace artplayerPluginChromecast; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-danmuku-mask.d.ts b/docs/assets/ts/artplayer-plugin-danmuku-mask.d.ts index 68515f8f8..b2c996b79 100644 --- a/docs/assets/ts/artplayer-plugin-danmuku-mask.d.ts +++ b/docs/assets/ts/artplayer-plugin-danmuku-mask.d.ts @@ -21,5 +21,5 @@ declare const artplayerPluginDanmukuMask: (option?: Option) => (art: Artplayer) export default artplayerPluginDanmukuMask -export = artplayerPluginDanmukuMask -export as namespace artplayerPluginDanmukuMask; +export = artplayerPluginDanmukuMask; +export as namespace artplayerPluginDanmukuMask; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-danmuku.d.ts b/docs/assets/ts/artplayer-plugin-danmuku.d.ts index 554ce0fe2..6f6a5ec04 100644 --- a/docs/assets/ts/artplayer-plugin-danmuku.d.ts +++ b/docs/assets/ts/artplayer-plugin-danmuku.d.ts @@ -255,5 +255,5 @@ declare const artplayerPluginDanmuku: (option: Option) => (art: Artplayer) => Re export default artplayerPluginDanmuku -export = artplayerPluginDanmuku -export as namespace artplayerPluginDanmuku; +export = artplayerPluginDanmuku; +export as namespace artplayerPluginDanmuku; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-dash-control.d.ts b/docs/assets/ts/artplayer-plugin-dash-control.d.ts index 39a52d129..35057bb07 100644 --- a/docs/assets/ts/artplayer-plugin-dash-control.d.ts +++ b/docs/assets/ts/artplayer-plugin-dash-control.d.ts @@ -13,5 +13,5 @@ declare const artplayerPluginDashControl: (option: { quality?: Config, audio?: C export default artplayerPluginDashControl -export = artplayerPluginDashControl -export as namespace artplayerPluginDashControl; +export = artplayerPluginDashControl; +export as namespace artplayerPluginDashControl; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-document-pip.d.ts b/docs/assets/ts/artplayer-plugin-document-pip.d.ts index df061d9f4..dee9d2c41 100644 --- a/docs/assets/ts/artplayer-plugin-document-pip.d.ts +++ b/docs/assets/ts/artplayer-plugin-document-pip.d.ts @@ -18,5 +18,5 @@ declare const artplayerPluginDocumentPip: (option: Option) => (art: Artplayer) = export default artplayerPluginDocumentPip -export = artplayerPluginDocumentPip -export as namespace artplayerPluginDocumentPip; +export = artplayerPluginDocumentPip; +export as namespace artplayerPluginDocumentPip; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-hls-control.d.ts b/docs/assets/ts/artplayer-plugin-hls-control.d.ts index f047513e8..01c881339 100644 --- a/docs/assets/ts/artplayer-plugin-hls-control.d.ts +++ b/docs/assets/ts/artplayer-plugin-hls-control.d.ts @@ -13,5 +13,5 @@ declare const artplayerPluginHlsControl: (option: { quality?: Config, audio?: Co export default artplayerPluginHlsControl -export = artplayerPluginHlsControl -export as namespace artplayerPluginHlsControl; +export = artplayerPluginHlsControl; +export as namespace artplayerPluginHlsControl; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-iframe.d.ts b/docs/assets/ts/artplayer-plugin-iframe.d.ts index 88cfd5bad..f5ebf54f5 100644 --- a/docs/assets/ts/artplayer-plugin-iframe.d.ts +++ b/docs/assets/ts/artplayer-plugin-iframe.d.ts @@ -28,5 +28,5 @@ declare class ArtplayerPluginIframe { export default ArtplayerPluginIframe -export = artplayerPluginIframe -export as namespace artplayerPluginIframe; +export = artplayerPluginIframe; +export as namespace artplayerPluginIframe; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-libass.d.ts b/docs/assets/ts/artplayer-plugin-libass.d.ts index ff0632692..ae373d1b6 100644 --- a/docs/assets/ts/artplayer-plugin-libass.d.ts +++ b/docs/assets/ts/artplayer-plugin-libass.d.ts @@ -11,5 +11,5 @@ declare const artplayerPluginAss: (options: Options) => (art: Artplayer) => { export default artplayerPluginAss -export = artplayerPluginLibass -export as namespace artplayerPluginLibass; +export = artplayerPluginLibass; +export as namespace artplayerPluginLibass; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-multiple-subtitles.d.ts b/docs/assets/ts/artplayer-plugin-multiple-subtitles.d.ts index a6f710bc1..4d6161dff 100644 --- a/docs/assets/ts/artplayer-plugin-multiple-subtitles.d.ts +++ b/docs/assets/ts/artplayer-plugin-multiple-subtitles.d.ts @@ -12,5 +12,5 @@ declare const artplayerPluginMultipleSubtitles: (option: { export default artplayerPluginMultipleSubtitles -export = artplayerPluginMultipleSubtitles -export as namespace artplayerPluginMultipleSubtitles; +export = artplayerPluginMultipleSubtitles; +export as namespace artplayerPluginMultipleSubtitles; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-vast.d.ts b/docs/assets/ts/artplayer-plugin-vast.d.ts index 41d815667..b34e73c10 100644 --- a/docs/assets/ts/artplayer-plugin-vast.d.ts +++ b/docs/assets/ts/artplayer-plugin-vast.d.ts @@ -29,5 +29,5 @@ declare function artplayerPluginVast( export default artplayerPluginVast -export = artplayerPluginVast -export as namespace artplayerPluginVast; +export = artplayerPluginVast; +export as namespace artplayerPluginVast; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-plugin-vtt-thumbnail.d.ts b/docs/assets/ts/artplayer-plugin-vtt-thumbnail.d.ts index 4e8307e77..aaed1e528 100644 --- a/docs/assets/ts/artplayer-plugin-vtt-thumbnail.d.ts +++ b/docs/assets/ts/artplayer-plugin-vtt-thumbnail.d.ts @@ -6,5 +6,5 @@ declare const artplayerPluginVttThumbnail: (option: { vtt?: string, style?: Part export default artplayerPluginVttThumbnail -export = artplayerPluginVttThumbnail -export as namespace artplayerPluginVttThumbnail; +export = artplayerPluginVttThumbnail; +export as namespace artplayerPluginVttThumbnail; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-proxy-canvas.d.ts b/docs/assets/ts/artplayer-proxy-canvas.d.ts new file mode 100644 index 000000000..caf16cc42 --- /dev/null +++ b/docs/assets/ts/artplayer-proxy-canvas.d.ts @@ -0,0 +1,10 @@ +type Option = (ctx: CanvasRenderingContext2D, video: HTMLVideoElement) => void + +type Result = HTMLCanvasElement + +declare const artplayerProxyCanvas: (option?: Option) => (art: Artplayer) => Result + +export default artplayerProxyCanvas + +export = artplayerProxyCanvas; +export as namespace artplayerProxyCanvas; \ No newline at end of file diff --git a/docs/assets/ts/artplayer-proxy-mediabunny.d.ts b/docs/assets/ts/artplayer-proxy-mediabunny.d.ts new file mode 100644 index 000000000..ce8161e1d --- /dev/null +++ b/docs/assets/ts/artplayer-proxy-mediabunny.d.ts @@ -0,0 +1,19 @@ +type Option = { + eventDelay?: number + loadTimeout?: number + timeupdateInterval?: number + avSyncTolerance?: number + dropLateFrames?: boolean + poster?: string + source?: string | Blob | ReadableStream + preflightRange?: boolean +} + +type Result = HTMLCanvasElement + +declare const artplayerProxyMediabunny: (option?: Option) => (art: Artplayer) => Result + +export default artplayerProxyMediabunny + +export = artplayerProxyMediabunny; +export as namespace artplayerProxyMediabunny; \ No newline at end of file diff --git a/docs/assets/ts/artplayer.d.ts b/docs/assets/ts/artplayer.d.ts index 401974c9a..964913abc 100644 --- a/docs/assets/ts/artplayer.d.ts +++ b/docs/assets/ts/artplayer.d.ts @@ -126,6 +126,8 @@ export interface Subtitle { onVttLoad?: (vtt: string) => string } + + export interface SettingOption extends Omit { html: string icon: string | undefined @@ -237,6 +239,10 @@ export interface Quality { url: string } + + + + export type AspectRatio = 'default' | '4:3' | '16:9' | (`${number}:${number}` & Record) export type PlaybackRate = 0.5 | 0.75 | 1.0 | 1.25 | 1.5 | 1.75 | 2.0 | (number & Record) export type Flip = 'normal' | 'horizontal' | 'vertical' | (string & Record) @@ -346,6 +352,15 @@ export declare class Player { reset(): void } + + + + + + + + + export type CustomType = | 'flv' | 'm3u8' @@ -754,6 +769,9 @@ declare module 'artplayer/i18n/*' { export default lang } + + + export type Bar = 'loaded' | 'played' | 'hover' export interface Events { @@ -977,6 +995,8 @@ export interface Config { ] } + + export interface Selector { /** * Whether the default is selected @@ -1108,6 +1128,18 @@ export interface ComponentOption { onSelect?: (this: Artplayer, selector: Selector, element: HTMLElement, event: Event) => void } + + + + + + + + + + + + export type { Config, Events, @@ -1297,5 +1329,5 @@ export default class Artplayer extends Player { } & Record } -export = Artplayer -export as namespace Artplayer; +export = Artplayer; +export as namespace Artplayer; \ No newline at end of file diff --git a/docs/compiled/artplayer-proxy-mediabunny.js b/docs/compiled/artplayer-proxy-mediabunny.js new file mode 100644 index 000000000..da2602984 --- /dev/null +++ b/docs/compiled/artplayer-proxy-mediabunny.js @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},m=d.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!m[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=m[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return m[r].exports;function u(e){var r=u.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=m,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"ln3T4","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],ln3T4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"aLQUP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aLQUP:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,m=!!i.muted,h=1;n.setVolume(u,m);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return h},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;h=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),m=!1,n.setVolume(u,m),s.emit("volumechange")},get muted(){return m},set muted(v){m=!!v,n.setVolume(u,m),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"hMkle","../utils/clamp.js":"i5ob4","./videoEvents.js":"5969H","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hMkle:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,m=0,h=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,h=null,m=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,m=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;h={code:4,message:e.message},m=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,h={code:4,message:e.message},m=3,a.emit("error")}else await p}async function k(){l&&(l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return m},get error(){return h},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"d0iOY","./videoEngine.js":"8o8Re","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d0iOY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,m=!0,h=.7,p=!1,f=1,g=0,k=new Set;function b(){return m?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:h;s.gain.value=e*e}function S(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function y(){for(let e of k)e.stop();k.clear()}async function x(){await o?.return(),o=null}async function I(r){if(a)for(await x(),o=a.buffers(b());;){let a;if(r!==g||m)return;let n=o.next(),u=setInterval(()=>{if(r!==g||m)return void clearInterval(u);"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||m)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:h,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=h,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,S=T+h.duration/f;S>d&&(d=S),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function w(){m||(c=b(),m=!0,x(),y())}return{load:async function e(e,i){let s=++g;await x(),y(),m=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,S(),i&&i();return}S(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){m&&(i||S(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,m=!1,I(++g))},pause:w,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,m||I(g)},destroy:function(){g++,w(),i?.close(),i=null,r=null,a=null},setVolume(e,r){h=e,p=r,T()},setPlaybackRate(e){e!==f&&(m||(c=b(),l=i.currentTime),f=e,m||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return m}}}},{mediabunny:"5c8Rl","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5c8Rl":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Output",()=>n.Output),s.export(a,"OutputFormat",()=>o.OutputFormat),s.export(a,"AdtsOutputFormat",()=>o.AdtsOutputFormat),s.export(a,"FlacOutputFormat",()=>o.FlacOutputFormat),s.export(a,"IsobmffOutputFormat",()=>o.IsobmffOutputFormat),s.export(a,"MkvOutputFormat",()=>o.MkvOutputFormat),s.export(a,"MovOutputFormat",()=>o.MovOutputFormat),s.export(a,"Mp3OutputFormat",()=>o.Mp3OutputFormat),s.export(a,"Mp4OutputFormat",()=>o.Mp4OutputFormat),s.export(a,"OggOutputFormat",()=>o.OggOutputFormat),s.export(a,"WavOutputFormat",()=>o.WavOutputFormat),s.export(a,"WebMOutputFormat",()=>o.WebMOutputFormat),s.export(a,"MediaSource",()=>l.MediaSource),s.export(a,"VideoSource",()=>l.VideoSource),s.export(a,"AudioSource",()=>l.AudioSource),s.export(a,"SubtitleSource",()=>l.SubtitleSource),s.export(a,"AudioBufferSource",()=>l.AudioBufferSource),s.export(a,"AudioSampleSource",()=>l.AudioSampleSource),s.export(a,"CanvasSource",()=>l.CanvasSource),s.export(a,"EncodedAudioPacketSource",()=>l.EncodedAudioPacketSource),s.export(a,"EncodedVideoPacketSource",()=>l.EncodedVideoPacketSource),s.export(a,"MediaStreamAudioTrackSource",()=>l.MediaStreamAudioTrackSource),s.export(a,"MediaStreamVideoTrackSource",()=>l.MediaStreamVideoTrackSource),s.export(a,"TextSubtitleSource",()=>l.TextSubtitleSource),s.export(a,"VideoSampleSource",()=>l.VideoSampleSource),s.export(a,"VIDEO_CODECS",()=>c.VIDEO_CODECS),s.export(a,"AUDIO_CODECS",()=>c.AUDIO_CODECS),s.export(a,"PCM_AUDIO_CODECS",()=>c.PCM_AUDIO_CODECS),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c.NON_PCM_AUDIO_CODECS),s.export(a,"SUBTITLE_CODECS",()=>c.SUBTITLE_CODECS),s.export(a,"canEncode",()=>d.canEncode),s.export(a,"canEncodeVideo",()=>d.canEncodeVideo),s.export(a,"canEncodeAudio",()=>d.canEncodeAudio),s.export(a,"canEncodeSubtitles",()=>d.canEncodeSubtitles),s.export(a,"getEncodableCodecs",()=>d.getEncodableCodecs),s.export(a,"getEncodableVideoCodecs",()=>d.getEncodableVideoCodecs),s.export(a,"getEncodableAudioCodecs",()=>d.getEncodableAudioCodecs),s.export(a,"getEncodableSubtitleCodecs",()=>d.getEncodableSubtitleCodecs),s.export(a,"getFirstEncodableVideoCodec",()=>d.getFirstEncodableVideoCodec),s.export(a,"getFirstEncodableAudioCodec",()=>d.getFirstEncodableAudioCodec),s.export(a,"getFirstEncodableSubtitleCodec",()=>d.getFirstEncodableSubtitleCodec),s.export(a,"Quality",()=>d.Quality),s.export(a,"QUALITY_VERY_LOW",()=>d.QUALITY_VERY_LOW),s.export(a,"QUALITY_LOW",()=>d.QUALITY_LOW),s.export(a,"QUALITY_MEDIUM",()=>d.QUALITY_MEDIUM),s.export(a,"QUALITY_HIGH",()=>d.QUALITY_HIGH),s.export(a,"QUALITY_VERY_HIGH",()=>d.QUALITY_VERY_HIGH),s.export(a,"Target",()=>u.Target),s.export(a,"BufferTarget",()=>u.BufferTarget),s.export(a,"FilePathTarget",()=>u.FilePathTarget),s.export(a,"NullTarget",()=>u.NullTarget),s.export(a,"StreamTarget",()=>u.StreamTarget),s.export(a,"ALL_TRACK_TYPES",()=>n.ALL_TRACK_TYPES),s.export(a,"Source",()=>m.Source),s.export(a,"BlobSource",()=>m.BlobSource),s.export(a,"BufferSource",()=>m.BufferSource),s.export(a,"FilePathSource",()=>m.FilePathSource),s.export(a,"StreamSource",()=>m.StreamSource),s.export(a,"ReadableStreamSource",()=>m.ReadableStreamSource),s.export(a,"UrlSource",()=>m.UrlSource),s.export(a,"InputFormat",()=>h.InputFormat),s.export(a,"AdtsInputFormat",()=>h.AdtsInputFormat),s.export(a,"IsobmffInputFormat",()=>h.IsobmffInputFormat),s.export(a,"MatroskaInputFormat",()=>h.MatroskaInputFormat),s.export(a,"Mp3InputFormat",()=>h.Mp3InputFormat),s.export(a,"Mp4InputFormat",()=>h.Mp4InputFormat),s.export(a,"OggInputFormat",()=>h.OggInputFormat),s.export(a,"QuickTimeInputFormat",()=>h.QuickTimeInputFormat),s.export(a,"WaveInputFormat",()=>h.WaveInputFormat),s.export(a,"WebMInputFormat",()=>h.WebMInputFormat),s.export(a,"FlacInputFormat",()=>h.FlacInputFormat),s.export(a,"ALL_FORMATS",()=>h.ALL_FORMATS),s.export(a,"ADTS",()=>h.ADTS),s.export(a,"MATROSKA",()=>h.MATROSKA),s.export(a,"MP3",()=>h.MP3),s.export(a,"MP4",()=>h.MP4),s.export(a,"OGG",()=>h.OGG),s.export(a,"QTFF",()=>h.QTFF),s.export(a,"WAVE",()=>h.WAVE),s.export(a,"WEBM",()=>h.WEBM),s.export(a,"FLAC",()=>h.FLAC),s.export(a,"Input",()=>p.Input),s.export(a,"InputDisposedError",()=>p.InputDisposedError),s.export(a,"InputTrack",()=>f.InputTrack),s.export(a,"InputVideoTrack",()=>f.InputVideoTrack),s.export(a,"InputAudioTrack",()=>f.InputAudioTrack),s.export(a,"EncodedPacket",()=>g.EncodedPacket),s.export(a,"AudioSample",()=>k.AudioSample),s.export(a,"VideoSample",()=>k.VideoSample),s.export(a,"AudioBufferSink",()=>b.AudioBufferSink),s.export(a,"AudioSampleSink",()=>b.AudioSampleSink),s.export(a,"BaseMediaSampleSink",()=>b.BaseMediaSampleSink),s.export(a,"CanvasSink",()=>b.CanvasSink),s.export(a,"EncodedPacketSink",()=>b.EncodedPacketSink),s.export(a,"VideoSampleSink",()=>b.VideoSampleSink),s.export(a,"Conversion",()=>T.Conversion),s.export(a,"CustomVideoDecoder",()=>S.CustomVideoDecoder),s.export(a,"CustomVideoEncoder",()=>S.CustomVideoEncoder),s.export(a,"CustomAudioDecoder",()=>S.CustomAudioDecoder),s.export(a,"CustomAudioEncoder",()=>S.CustomAudioEncoder),s.export(a,"registerDecoder",()=>S.registerDecoder),s.export(a,"registerEncoder",()=>S.registerEncoder),s.export(a,"RichImageData",()=>y.RichImageData),s.export(a,"AttachedFile",()=>y.AttachedFile);var n=e("./output.js"),o=e("./output-format.js"),l=e("./media-source.js"),c=e("./codec.js"),d=e("./encode.js"),u=e("./target.js"),m=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),f=e("./input-track.js"),g=e("./packet.js"),k=e("./sample.js"),b=e("./media-sink.js"),T=e("./conversion.js"),S=e("./custom-coder.js"),y=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"d2urb","./input-format.js":"eC3Vq","./input.js":"cI9DB","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"h5xyX","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8wd8o":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>S),s.export(a,"extractVideoCodecString",()=>y),s.export(a,"buildAudioCodecString",()=>x),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>w),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>C),s.export(a,"buildAacAudioSpecificConfig",()=>P),s.export(a,"OPUS_SAMPLE_RATE",()=>A),s.export(a,"parsePcmCodec",()=>_),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>F),s.export(a,"getAudioEncoderConfigExtension",()=>M),s.export(a,"validateVideoChunkMetadata",()=>j),s.export(a,"validateAudioChunkMetadata",()=>z),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],m=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],h=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=m.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(m),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=h.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(h);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split("."),a=Number(r[1]),i=Number(r[2]);return[1,1,a,2,1,i,3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},S=e=>{let r=e.split("."),a=Number(r[1]),i=r[2],s=Number(i.slice(0,-1)),n=+("H"===i.slice(-1)),o=Number(r[3]),l=r[4]?Number(r[4]):0,c=r[5]?Number(r[5][0]):1;return[129,(a<<5)+s,(n<<7)+((8!==o)<<6)+0+(l<<4)+(c<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},y=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),m=`vp09.${r}.${a}.${i}.${s}`;return(m+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(m=m.slice(0,-g.length)),m}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,m=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,h=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},x=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=C(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},w=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],C=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},P=e=>{let r=w.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},A=48e3,B=/^pcm-([usf])(\d+)+(be)?$/,_=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=B.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(B.test(e))return e;return"webvtt"===e?"webvtt":null},F=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},M=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,O=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,N=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,j=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!O.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},V=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],z=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!V.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dpOkn:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>m),s.export(a,"writeBits",()=>h),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>S),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>y),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>x),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>w),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>C),s.export(a,"isAllowSharedBufferSource",()=>P),s.export(a,"AsyncMutex",()=>A),s.export(a,"bytesToHexString",()=>B),s.export(a,"reverseBitsU32",()=>_),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>F),s.export(a,"insertSorted",()=>M),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>O),s.export(a,"toAsyncIterator",()=>N),s.export(a,"validateAnyIterable",()=>j),s.export(a,"assertNever",()=>V),s.export(a,"getUint24",()=>z),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>W),s.export(a,"setInt24",()=>q),s.export(a,"setInt64",()=>G),s.export(a,"mapAsyncGenerator",()=>K),s.export(a,"clamp",()=>Q),s.export(a,"UNDETERMINED_LANGUAGE",()=>$),s.export(a,"roundIfAlmostInteger",()=>X),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>em),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>eS),s.export(a,"uint8ArraysAreEqual",()=>ey),s.export(a,"polyfillSymbolDispose",()=>ex),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},h=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),S={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},y=T(S),x={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(x),w={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(w),C=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,P=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class A{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let B=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),_=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},M=(e,r,a)=>{let i=F(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},O=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},N=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},j=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},V=e=>{throw Error(`Unexpected value: ${e}`)},z=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>z(e,r,a)<<8>>8,W=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},q=(e,r,a,i)=>{(a=Q(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),W(e,r,a,i)},G=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},K=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),Q=(e,r,a)=>Math.max(r,Math.min(a,e)),$="und",X=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,em=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),eh=null,ep=()=>{if(null!==eh)return eh;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eh=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],d2urb:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Source",()=>d),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>m),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class m extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??h,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),m=0,h=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),h=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ad),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"eC3Vq","./misc.js":"dpOkn","./reader.js":"3hF2Q","./source.js":"d2urb","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eC3Vq:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>S),s.export(a,"Mp4InputFormat",()=>y),s.export(a,"QuickTimeInputFormat",()=>x),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>w),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>C),s.export(a,"OggInputFormat",()=>P),s.export(a,"FlacInputFormat",()=>A),s.export(a,"AdtsInputFormat",()=>B),s.export(a,"MP4",()=>_),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>F),s.export(a,"WEBM",()=>M),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>O),s.export(a,"FLAC",()=>N),s.export(a,"ALL_FORMATS",()=>j);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),m=e("./mp3/mp3-reader.js"),h=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class S extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class y extends S{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class x extends S{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class w extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,m.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,m.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,h.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class A extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class B extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let _=new y,D=new x,F=new I,M=new w,R=new E,U=new C,L=new P,O=new B,N=new A,j=[_,D,F,M,U,L,N,R,O]},{"./isobmff/isobmff-demuxer.js":"c6bfa","./matroska/ebml.js":"B0jDs","./matroska/matroska-demuxer.js":"fOHz2","./mp3/mp3-demuxer.js":"i9O6t","../shared/mp3-misc.js":"25tyg","./id3.js":"69HAt","./mp3/mp3-reader.js":"8Pxtf","./ogg/ogg-demuxer.js":"5cgt7","./wave/wave-demuxer.js":"lUIAt","./adts/adts-reader.js":"5Z778","./adts/adts-demuxer.js":"2HibR","./reader.js":"3hF2Q","./flac/flac-demuxer.js":"h7VU7","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c6bfa:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),m=e("./isobmff-misc.js"),h=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,m.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,h.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-h.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,h.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),m=r.sampleTimingEntries[u],h=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[h],f=m.startDecodeTimestamp+(l-m.startIndex)*m.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)w(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&w(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,h.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,h.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,h.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let m=null;4&i&&(m=(0,p.readU32Be)(e));let h=u;if(0===c){this.currentFragment.implicitBaseDataOffset=h;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=S(i,a),n=await this.fetchPacketForSampleIndex(s,r);return C(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=x(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let m=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==m?this.internalTrack.fragmentLookupTable[m]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,h.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let S=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},y=(e,r)=>{if(!e.keySampleIndices)return S(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=S(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},x=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let m=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),h=e.chunkOffsets[m],p=u.startSampleIndex+(m-u.startChunkIndex)*u.samplesPerChunk,f=0,g=h;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},w=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},C=e=>0===e.sampleSizes.length},{"../codec.js":"8wd8o","../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","./isobmff-misc.js":"8o5uh","./isobmff-reader.js":"8Phe1","../reader.js":"3hF2Q","../metadata.js":"fFgR1","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4Hepu":[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>S),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>y),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>x),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>w),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>C),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>O),u.export(a,"parseOpusIdentificationHeader",()=>N),u.export(a,"parseOpusTocByte",()=>V),u.export(a,"parseModesFromVorbisSetupPacket",()=>z),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>W),u.export(a,"createVorbisComments",()=>q);var m=e("./codec.js"),h=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,h.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,h.assertNever)(r),(0,h.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,h.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],S=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,h.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},y=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,h.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,h.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,h.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,h.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,h.readExpGolomb)(r),c=(0,h.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,h.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,C=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,h.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:m,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:S}=P(l,d);(0,h.readExpGolomb)(l);let y=(0,h.readExpGolomb)(l);3===y&&l.skipBits(1),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&((0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l));let x=(0,h.readExpGolomb)(l),I=(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l);let w=l.readBits(1)?0:d;for(let e=w;e<=d;e++)(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&A(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.skipBits(1));let C=(0,h.readExpGolomb)(l);if(B(l,C),l.readBits(1)){let e=(0,h.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,h.Bitstream)(g(e));r.skipBits(16),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);F=a||i?a&&!i?2:!a&&i?3:0:0}let M=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:m,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:S,minSpatialSegmentationIdc:_,parallelismType:F,chromaFormatIdc:y,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:M}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},P=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,h.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,h.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,h.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,h.readExpGolomb)(e),a=(0,h.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,h.readExpGolomb)(e),e.readBits(1)&&F(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,h.readExpGolomb)(e);return(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),r}return 0},F=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,h.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,h.readExpGolomb)(e)+1),i&&M(e,l,n),s&&M(e,l,n)}},M=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,h.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=r.readBits(16),d=(c+1)*(r.readBits(16)+1),u=(0,h.last)(m.VP9_LEVEL_TABLE).level;for(let e of m.VP9_LEVEL_TABLE)if(d<=e.maxPictureSize){u=e.level;break}return{profile:i,level:u,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,h.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,h.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},O=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,h.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let m=d+1;e.skipBits(m);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},N=e=>{let r=(0,h.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},j=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],V=e=>({durationInSamples:j[e[0]>>3]}),z=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,h.isChromium)()||(0,h.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,h.Bitstream)(e);r.pos=8*a;let s=(0,h.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,h.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,h.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,h.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,h.assertNever)(e),(0,h.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let W=(e,r)=>{let a=(0,h.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=h.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,h.base64ToBytes)(c),a=(0,h.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=h.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},q=(e,r,a)=>{let i=[e],s=h.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=h.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,h.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),m=0;for(let e of i)u.set(e,m),m+=e.length;return u}},{"./codec.js":"8wd8o","./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6cHW1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8ofmg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>m),s.export(a,"InputAudioTrack",()=>h);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof m}isAudioTrack(){return this instanceof h}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./media-sink.js":"h5xyX","./misc.js":"dpOkn","./packet.js":"i61Hy","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3RBiS":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>m),s.export(a,"customAudioEncoders",()=>h),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],m=[],h=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(m.includes(e))return void console.warn("Video encoder already registered.");m.push(e)}else if(e.prototype instanceof c){if(h.includes(e))return void console.warn("Audio encoder already registered.");h.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h5xyX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>S),s.export(a,"VideoSampleSink",()=>w),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>A),s.export(a,"AudioBufferSink",()=>B);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),m=e("./packet.js"),h=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof m.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof m.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!h&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class S{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),m=!1,h=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{if(d(),l.timestamp>=r&&(h=!0),h)return void l.close();s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)())},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),S=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let x=b.packets(T??void 0,c);for(await x.next();S&&!h&&!this._track.input._disposed;){let e=y(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(S);let r=await x.next();if(r.done)break;S=r.value}await x.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),m=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(m)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,h=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,h=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),m)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{h||(r.stack=e.stack,h=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!m;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(m)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},S=async()=>{await s.flush();for(let e=0;e{h||(h=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(h)throw k(),h;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let y=e=>0===e?40:8;class x extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;let c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{let e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){let e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){let r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");let e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class w extends S{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new x(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");let a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s],c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new w(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class C extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;let s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class P extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;let{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,h.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,h.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class A extends S{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new P(e,r,i):new C(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class B{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new A(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"8wd8o","./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./input.js":"cI9DB","./input-track.js":"8ofmg","./misc.js":"dpOkn","./packet.js":"i61Hy","./pcm.js":"bPgId","./sample.js":"9Wy36","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i61Hy:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"PLACEHOLDER_DATA",()=>o),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bPgId:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>m),s.export(a,"validateCropRectangle",()=>h),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");let s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,m=this.displayWidth,h=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,m=i,h=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=m,k=h)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(m)||m<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(h)||h<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:m,sHeight:h}=this._rotateSourceRegion(d,u,m,h,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,S=f+k/2;e.translate(T,S),e.rotate(this.rotation*Math.PI/180);let y=this.rotation%180==0?1:g/k;e.scale(1/y,y),e.drawImage(b,d,u,m,h,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&h(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&m(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],m="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*m,n=c*m,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,m=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},h=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,S(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");let a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");let i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let m=void 0!==s?s:c-u;if(m>c-u)throw RangeError("frameCount out of range");let h=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let y=f?m:m*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},S=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o5uh":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8Phe1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>m),s.export(a,"readFixed_2_30",()=>h),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},m=e=>(0,l.readI32Be)(e)/65536,h=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"fFgR1","../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fFgR1:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3hF2Q":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>m),s.export(a,"readU16",()=>h),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>S),s.export(a,"readI32Le",()=>y),s.export(a,"readU64",()=>x),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>w),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>C),s.export(a,"readF64Be",()=>P),s.export(a,"readAscii",()=>A);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},m=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),h=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),w=e=>0x100000000*S(e)+b(e),E=e=>{let r=T(e);return 0x100000000*y(e)+r},C=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},P=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=(e,r)=>{d(e,r);let a="";for(let i=0;id),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>m),o.export(a,"EBMLUnicodeString",()=>h),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>S),o.export(a,"EBMLWriter",()=>y),o.export(a,"MAX_VAR_INT_SIZE",()=>x),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>w),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>C),o.export(a,"readUnsignedInt",()=>P),o.export(a,"readUnsignedBigInt",()=>A),o.export(a,"readSignedInt",()=>B),o.export(a,"readElementId",()=>_),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>F),o.export(a,"readAsciiString",()=>M),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>O),o.export(a,"CODEC_STRING_MAP",()=>N),o.export(a,"assertDefinedSize",()=>j);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},S=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class y{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=S(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof m){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof h){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let x=8,I=2,w=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},C=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=P(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},_=e=>{let r=E(e);return null===r?null:P(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=C(e))&&(r=null)),r},F=e=>{let r=_(e);return null===r?null:{id:r,size:D(e)}},M=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},O=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var m=e("../codec-data.js"),h=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),S=e("./matroska-misc.js"),y=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let x=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,S.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=x[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=x.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=h.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new C(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,y.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,y.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=(0,y.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,y.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,y.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,y.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,y.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class w{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let m=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),h=-1!==m?this.internalTrack.cuePoints[m]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(h?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,m=(0,T.readElementHeader)(e);if(!m||!T.LEVEL_1_EBML_IDS.includes(m.id)&&m.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let h=m.id,p=m.size,f=e.filePos;if(h===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(h!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(h&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,h.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,m.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,m.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,m.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,m.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class C extends w{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,h.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"4Hepu","../codec.js":"8wd8o","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","./ebml.js":"B0jDs","./matroska-misc.js":"axlni","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],axlni:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9O6t:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),m=e("../id3.js"),h=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,m.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,h.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,m.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,m.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,m.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=m.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-m.ID3_V1_TAG_SIZE,m.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,m.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>m),s.export(a,"readFrameHeader",()=>h),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,h=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,m=0;16&s?d=8&s?0:1:(d=1,m=1);let h=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+m,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"69HAt":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>h),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>S),c.export(a,"Id3V2Writer",()=>y);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),m=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let h=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,m.readBytes)(e,h-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,m.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,m.readU8)(e);d{let a=(0,m.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,m.readAscii)(e,3),i=(0,m.readU8)(e),s=(0,m.readU8)(e),n=(0,m.readU8)(e),o=(0,m.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,m.readBytes)(e,r.size),s=new S(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class S{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class y{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let m=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&m),1<<(m>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,m.EncodedPacket)(a.metadataOnly?m.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let S=null,y=g,x=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,S=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){S=e+1;break}if(null===S)throw Error("Invalid page with granule position: no packets end on this page.");x=S-1;let e={data:m.PLACEHOLDER_DATA,endPage:y,endSegmentIndex:x};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,S);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,S=r.segmentIndex)}else for(;;){let e=T(k,g,S);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,S=r.segmentIndex,e.page.headerStartPos!==y.headerStartPos){y=e.page,x=e.segmentIndex;break}}}let I=null,w=null;for(;null!==g;){(0,u.assert)(null!==S);let e=await this.demuxer.readPacket(g,S);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&Ss||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,S=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>m);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},m=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"4Hepu","../misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9qmX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>m);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:m+h,dataStartPos:r+m,dataSize:h,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},m=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"3hF2Q","./ogg-misc.js":"7ByLQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lUIAt:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,h.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,h.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,h.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,h.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,h.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,h.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,h.readAscii)(i,4),r=(0,h.readU32)(i,a),s=(0,h.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=m.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,h.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,m.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../id3.js":"69HAt","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5Z778":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let m=i.readBits(2)+1;if(1!==m)throw Error("ADTS frames with more than one AAC frame are not supported.");let h=null;return 1===s?e.filePos-=2:h=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:m,crcCheck:h,startPos:r}}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2HibR":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,h.MIN_FRAME_HEADER_SIZE,h.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?h.MAX_FRAME_HEADER_SIZE:h.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,h.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,h.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,h.readCodedNumber)(e),d=(0,h.readBlockSize)(e,n),m=(0,h.readSampleRate)(e,o);if(null===m||m!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,h.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:m}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../metadata.js":"fFgR1","./flac-misc.js":"aXiDm","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aXiDm:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>m),s.export(a,"calculateCrc8",()=>h);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),m=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,h=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o8Re":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,m=null,h=null,p=0,f=0,g=0,k=0,b=NaN,T=null,S=0,y=!1,x=1,I=!1;async function w(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function C(){await m?.return(),m=null}function P(){r.clearRect(0,0,e.width,e.height)}async function A(e){if(await C(),!u)return;m=u.canvases(e);let i=(await m.next()).value??null;h=(await m.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function B(a){if(m)for(;;){let i=(await m.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,x));if(i.timestamp=i&&(a.emit("timeupdate"),S=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}h&&h.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(h.canvas,0,0),h=null,B(f),y&&(a.emit("canplay"),a.emit("playing"),y=!1)):!h&&(B(f),!h&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5969H":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}]},["1qMFK"],"1qMFK","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/docs/compiled/artplayer-proxy-mediabunny.legacy.js b/docs/compiled/artplayer-proxy-mediabunny.legacy.js new file mode 100644 index 000000000..27bf5d10e --- /dev/null +++ b/docs/compiled/artplayer-proxy-mediabunny.legacy.js @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,n,a,i,s,o,c){var u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},l="function"==typeof u[a]&&u[a],d=l.i||{},f=l.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,n){if(!f[r]){if(!e[r]){if(i[r])return i[r];var s="function"==typeof u[a]&&u[a];if(!n&&s)return s(r,!0);if(l)return l(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}d.resolve=function(n){var a=e[r][1][n];return null!=a?a:n},d.cache={};var c=f[r]=new p.Module(r);e[r][0].call(c.exports,d,c,c.exports,u)}return f[r].exports;function d(e){var r=d.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=f,p.parent=l,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=d,p.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]},Object.defineProperty(p,"root",{get:function(){return u[a]}}),u[a]=p;for(var m=0;m0&&void 0!==arguments[0]?arguments[0]:{};return function(r){return(0,o.default)(r,e)}}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=c)},{"./proxy/canvasProxy.js":"hTxiw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hTxiw:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"default",function(){return u});var s=e("@swc/helpers/cjs/_to_consumable_array.cjs"),o=e("../shim/mediabunnyVideoShim.js"),c=i.interopDefault(o);function u(e,r){var n,a=function(e){e in o||Object.defineProperty(o,e,{get:function(){var r=l[e];return"function"==typeof r?r.bind(l):r},set:function(r){l[e]=r},configurable:!0,enumerable:!0})},i=function(e){o[e]=function(){for(var r=arguments.length,a=Array(r),i=0;ie.length)&&(r=e.length);for(var n=0,a=Array(r);n0?new Promise(function(e,r){a=setTimeout(function(){return r(Error("Load timeout"))},n)}):null,c=(0,s._)(function(){var n,i,s,c;return(0,o._)(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,3,4]),n=!1,i=!1,s=function(){n&&i&&(S=1,p.emit("loadedmetadata"),p.emit("durationchange"))},[4,Promise.all([k.load(e,function(){r===I&&(n=!0,s())}),b.load(e,function(){r===I&&(i=!0,s())})])];case 1:if(o.sent(),r!==I)return[2];return S=4,w=1,p.emit("loadeddata"),p.emit("canplay"),p.emit("canplaythrough"),[3,4];case 2:if(c=o.sent(),r!==I)return[2];return T={code:4,message:c.message},w=3,p.emit("error"),console.error(c),[3,4];case 3:return a&&clearTimeout(a),[7];case 4:return[2]}})})(),!i)return[3,5];l.label=1;case 1:return l.trys.push([1,3,,4]),[4,Promise.race([c,i])];case 2:return l.sent(),[3,4];case 3:if(u=l.sent(),r!==I)return[2];return I++,T={code:4,message:u.message},w=3,p.emit("error"),[3,4];case 4:return[3,7];case 5:return[4,c];case 6:l.sent(),l.label=7;case 7:return[2]}})})()},play:E,pause:j,seek:function(e){return(0,s._)(function(){var r;return(0,o._)(this,function(n){switch(n.label){case 0:return r=!_,x=!0,p.emit("seeking"),p.emit("waiting"),j(),[4,b.seek(e)];case 1:return n.sent(),[4,k.seek(e)];case 2:if(n.sent(),x=!1,p.emit("seeked"),!(r&&!y))return[3,4];return[4,E()];case 3:n.sent(),n.label=4;case 4:return[2]}})})()},destroy:function(){j(),b.destroy(),k.destroy()},setVolume:b.setVolume,setPlaybackRate:function(e){b.setPlaybackRate(e),k.setPlaybackRate(e)},get currentTime(){return b.currentTime},get duration(){return b.duration||k.duration},get paused(){return _},get seeking(){return x},get ended(){return y},get readyState(){return S},get networkState(){return w},get error(){return T},get videoWidth(){return k.width},get videoHeight(){return k.height}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./audioEngine.js":"avNjw","./videoEngine.js":"iWP57","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cZn0e:[function(e,r,n,a){"use strict";function i(e,r,n,a,i,s,o){try{var c=e[s](o),u=c.value}catch(e){n(e);return}c.done?r(u):Promise.resolve(u).then(a,i)}n._=function(e){return function(){var r=this,n=arguments;return new Promise(function(a,s){var o=e.apply(r,n);function c(e){i(o,a,s,c,u,"next",e)}function u(e){i(o,a,s,c,u,"throw",e)}c(void 0)})}}},{}],eltGh:[function(e,r,n,a){"use strict";n._=e("eb260df52bffddd").__generator},{eb260df52bffddd:"6yrAu"}],"6yrAu":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"__extends",function(){return c}),i.export(n,"__assign",function(){return u}),i.export(n,"__rest",function(){return l}),i.export(n,"__decorate",function(){return d}),i.export(n,"__param",function(){return f}),i.export(n,"__esDecorate",function(){return h}),i.export(n,"__runInitializers",function(){return p}),i.export(n,"__propKey",function(){return m}),i.export(n,"__setFunctionName",function(){return g}),i.export(n,"__metadata",function(){return b}),i.export(n,"__awaiter",function(){return k}),i.export(n,"__generator",function(){return _}),i.export(n,"__createBinding",function(){return y}),i.export(n,"__exportStar",function(){return S}),i.export(n,"__values",function(){return w}),i.export(n,"__read",function(){return T}),i.export(n,"__spread",function(){return x}),i.export(n,"__spreadArrays",function(){return I}),i.export(n,"__spreadArray",function(){return E}),i.export(n,"__await",function(){return j}),i.export(n,"__asyncGenerator",function(){return P}),i.export(n,"__asyncDelegator",function(){return C}),i.export(n,"__asyncValues",function(){return A}),i.export(n,"__makeTemplateObject",function(){return B}),i.export(n,"__importStar",function(){return F}),i.export(n,"__importDefault",function(){return R}),i.export(n,"__classPrivateFieldGet",function(){return U}),i.export(n,"__classPrivateFieldSet",function(){return O}),i.export(n,"__classPrivateFieldIn",function(){return L}),i.export(n,"__addDisposableResource",function(){return N}),i.export(n,"__disposeResources",function(){return z}),i.export(n,"__rewriteRelativeImportExtension",function(){return H});var s=e("@swc/helpers/cjs/_type_of.cjs"),o=function(e,r){return(o=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])})(e,r)};function c(e,r){if("function"!=typeof r&&null!==r)throw TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}o(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var u=function(){return(u=Object.assign||function(e){for(var r,n=1,a=arguments.length;nr.indexOf(a)&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,a=Object.getOwnPropertySymbols(e);ir.indexOf(a[i])&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(n[a[i]]=e[a[i]]);return n}function d(e,r,n,a){var i,o=arguments.length,c=o<3?r:null===a?a=Object.getOwnPropertyDescriptor(r,n):a;if(("undefined"==typeof Reflect?"undefined":(0,s._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,r,n,a);else for(var u=e.length-1;u>=0;u--)(i=e[u])&&(c=(o<3?i(c):o>3?i(r,n,c):i(r,n))||c);return o>3&&c&&Object.defineProperty(r,n,c),c}function f(e,r){return function(n,a){r(n,a,e)}}function h(e,r,n,a,i,o){function c(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var u,l=a.kind,d="getter"===l?"get":"setter"===l?"set":"value",f=!r&&e?a.static?e:e.prototype:null,h=r||(f?Object.getOwnPropertyDescriptor(f,a.name):{}),p=!1,m=n.length-1;m>=0;m--){var g={};for(var b in a)g[b]="access"===b?{}:a[b];for(var b in a.access)g.access[b]=a.access[b];g.addInitializer=function(e){if(p)throw TypeError("Cannot add initializers after decoration has completed");o.push(c(e||null))};var k=(0,n[m])("accessor"===l?{get:h.get,set:h.set}:h[d],g);if("accessor"===l){if(void 0===k)continue;if(null===k||(void 0===k?"undefined":(0,s._)(k))!=="object")throw TypeError("Object expected");(u=c(k.get))&&(h.get=u),(u=c(k.set))&&(h.set=u),(u=c(k.init))&&i.unshift(u)}else(u=c(k))&&("field"===l?i.unshift(u):h[d]=u)}f&&Object.defineProperty(f,a.name,h),p=!0}function p(e,r,n){for(var a=arguments.length>2,i=0;i0&&i[i.length-1])&&(6===l[0]||2===l[0])){s=0;continue}if(3===l[0]&&(!i||l[1]>i[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")}function T(e,r){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var a,i,s=n.call(e),o=[];try{for(;(void 0===r||r-- >0)&&!(a=s.next()).done;)o.push(a.value)}catch(e){i={error:e}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(i)throw i.error}}return o}function x(){for(var e=[],r=0;r1||c(e,r)})},r&&(a[e]=r(a[e])))}function c(e,r){try{var n;(n=i[e](r)).value instanceof j?Promise.resolve(n.value.v).then(u,l):d(s[0][2],n)}catch(e){d(s[0][3],e)}}function u(e){c("next",e)}function l(e){c("throw",e)}function d(e,r){e(r),s.shift(),s.length&&c(s[0][0],s[0][1])}}function C(e){var r,n;return r={},a("next"),a("throw",function(e){throw e}),a("return"),r[Symbol.iterator]=function(){return this},r;function a(a,i){r[a]=e[a]?function(r){return(n=!n)?{value:j(e[a](r)),done:!1}:i?i(r):r}:i}}function A(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var r,n=e[Symbol.asyncIterator];return n?n.call(e):(e=w(e),r={},a("next"),a("throw"),a("return"),r[Symbol.asyncIterator]=function(){return this},r);function a(n){r[n]=e[n]&&function(r){return new Promise(function(a,i){var s,o,c;s=a,o=i,c=(r=e[n](r)).done,Promise.resolve(r.value).then(function(e){s({value:e,done:c})},o)})}}}function B(e,r){return Object.defineProperty?Object.defineProperty(e,"raw",{value:r}):e.raw=r,e}var M=Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r},D=function(e){return(D=Object.getOwnPropertyNames||function(e){var r=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[r.length]=n);return r})(e)};function F(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n=D(e),a=0;a=p-.2&&(a.suspend(),e.emit("waiting"))},50),o=void 0,c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,n];case 2:return o=c.sent(),[3,5];case 3:return console.error(c.sent()),[2,"break"];case 4:return clearInterval(s),[7];case 5:if(r!==y||g)return[2,{v:void 0}];if("suspended"!==a.state)return[3,7];return[4,a.resume()];case 6:c.sent(),e.emit("canplay"),e.emit("playing"),c.label=7;case 7:if(o.done)return[2,"break"];return l=(u=o.value).buffer,m=u.timestamp,(b=a.createBufferSource()).buffer=l,b.connect(i),b.playbackRate.value=_,(w=(k=f+(m-h)/_)+l.duration/_)>p&&(p=w),k>=a.currentTime?b.start(k):b.start(a.currentTime,(a.currentTime-k)*_),S.add(b),b.onended=function(){return S.delete(b)},[2]}})},!n)return[2];return[4,E()];case 1:m.sent(),d=n.buffers(w()),m.label=2;case 2:return[5,(0,u._)(s())];case 3:if(l=m.sent(),"object"===(0,o._)(l))return[2,l.v];if("break"===l)return[3,4];return[3,2];case 4:return[2]}})})()}function P(){g||(h=w(),g=!0,E(),I())}return{load:function(e,a){return(0,s._)(function(){var i,s,o,u;return(0,c._)(this,function(c){switch(c.label){case 0:return i=++y,[4,E()];case 1:if(c.sent(),I(),g=!0,h=0,f=0,!(s="string"==typeof e?new(0,l.UrlSource)(e):e instanceof Blob?new(0,l.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,l.ReadableStreamSource)(e):e))return[2];return[4,(r=new(0,l.Input)({source:s,formats:l.ALL_FORMATS})).computeDuration()];case 2:if(m=c.sent(),i!==y)return[2];return[4,r.getPrimaryAudioTrack()];case 3:if(!(o=c.sent()))return n=null,x(),a&&a(),[2];if(u=null===o.codec)return[3,5];return[4,o.canDecode()];case 4:u=!c.sent(),c.label=5;case 5:if(u)return n=null,x(),a&&a(),[2];return x(o.sampleRate),n=new(0,l.AudioBufferSink)(o),a&&a(),[2]}})})()},play:function(){return(0,s._)(function(){return(0,c._)(this,function(e){switch(e.label){case 0:if(!g)return[2];if(a||x(),"suspended"!==a.state)return[3,2];return[4,a.resume()];case 1:e.sent(),e.label=2;case 2:return p=f=a.currentTime,g=!1,j(++y),[2]}})})()},pause:P,seek:function(e){return(0,s._)(function(){return(0,c._)(this,function(r){return h=Math.max(0,e),p=f=a.currentTime,y++,g||j(y),[2]})})()},destroy:function(){y++,P(),null==a||a.close(),a=null,r=null,n=null},setVolume:function(e,r){b=e,k=r,T()},setPlaybackRate:function(e){e!==_&&(g||(h=w(),f=a.currentTime),_=e,g||j(++y))},get currentTime(){return w()},get duration(){return m},get paused(){return g}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","@swc/helpers/cjs/_ts_values.cjs":"94P5Q",mediabunny:"b8Ej9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"94P5Q":[function(e,r,n,a){"use strict";n._=e("2ed00358a4809745").__values},{"2ed00358a4809745":"6yrAu"}],b8Ej9:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Output",function(){return s.Output}),i.export(n,"OutputFormat",function(){return o.OutputFormat}),i.export(n,"AdtsOutputFormat",function(){return o.AdtsOutputFormat}),i.export(n,"FlacOutputFormat",function(){return o.FlacOutputFormat}),i.export(n,"IsobmffOutputFormat",function(){return o.IsobmffOutputFormat}),i.export(n,"MkvOutputFormat",function(){return o.MkvOutputFormat}),i.export(n,"MovOutputFormat",function(){return o.MovOutputFormat}),i.export(n,"Mp3OutputFormat",function(){return o.Mp3OutputFormat}),i.export(n,"Mp4OutputFormat",function(){return o.Mp4OutputFormat}),i.export(n,"OggOutputFormat",function(){return o.OggOutputFormat}),i.export(n,"WavOutputFormat",function(){return o.WavOutputFormat}),i.export(n,"WebMOutputFormat",function(){return o.WebMOutputFormat}),i.export(n,"MediaSource",function(){return c.MediaSource}),i.export(n,"VideoSource",function(){return c.VideoSource}),i.export(n,"AudioSource",function(){return c.AudioSource}),i.export(n,"SubtitleSource",function(){return c.SubtitleSource}),i.export(n,"AudioBufferSource",function(){return c.AudioBufferSource}),i.export(n,"AudioSampleSource",function(){return c.AudioSampleSource}),i.export(n,"CanvasSource",function(){return c.CanvasSource}),i.export(n,"EncodedAudioPacketSource",function(){return c.EncodedAudioPacketSource}),i.export(n,"EncodedVideoPacketSource",function(){return c.EncodedVideoPacketSource}),i.export(n,"MediaStreamAudioTrackSource",function(){return c.MediaStreamAudioTrackSource}),i.export(n,"MediaStreamVideoTrackSource",function(){return c.MediaStreamVideoTrackSource}),i.export(n,"TextSubtitleSource",function(){return c.TextSubtitleSource}),i.export(n,"VideoSampleSource",function(){return c.VideoSampleSource}),i.export(n,"VIDEO_CODECS",function(){return u.VIDEO_CODECS}),i.export(n,"AUDIO_CODECS",function(){return u.AUDIO_CODECS}),i.export(n,"PCM_AUDIO_CODECS",function(){return u.PCM_AUDIO_CODECS}),i.export(n,"NON_PCM_AUDIO_CODECS",function(){return u.NON_PCM_AUDIO_CODECS}),i.export(n,"SUBTITLE_CODECS",function(){return u.SUBTITLE_CODECS}),i.export(n,"canEncode",function(){return l.canEncode}),i.export(n,"canEncodeVideo",function(){return l.canEncodeVideo}),i.export(n,"canEncodeAudio",function(){return l.canEncodeAudio}),i.export(n,"canEncodeSubtitles",function(){return l.canEncodeSubtitles}),i.export(n,"getEncodableCodecs",function(){return l.getEncodableCodecs}),i.export(n,"getEncodableVideoCodecs",function(){return l.getEncodableVideoCodecs}),i.export(n,"getEncodableAudioCodecs",function(){return l.getEncodableAudioCodecs}),i.export(n,"getEncodableSubtitleCodecs",function(){return l.getEncodableSubtitleCodecs}),i.export(n,"getFirstEncodableVideoCodec",function(){return l.getFirstEncodableVideoCodec}),i.export(n,"getFirstEncodableAudioCodec",function(){return l.getFirstEncodableAudioCodec}),i.export(n,"getFirstEncodableSubtitleCodec",function(){return l.getFirstEncodableSubtitleCodec}),i.export(n,"Quality",function(){return l.Quality}),i.export(n,"QUALITY_VERY_LOW",function(){return l.QUALITY_VERY_LOW}),i.export(n,"QUALITY_LOW",function(){return l.QUALITY_LOW}),i.export(n,"QUALITY_MEDIUM",function(){return l.QUALITY_MEDIUM}),i.export(n,"QUALITY_HIGH",function(){return l.QUALITY_HIGH}),i.export(n,"QUALITY_VERY_HIGH",function(){return l.QUALITY_VERY_HIGH}),i.export(n,"Target",function(){return d.Target}),i.export(n,"BufferTarget",function(){return d.BufferTarget}),i.export(n,"FilePathTarget",function(){return d.FilePathTarget}),i.export(n,"NullTarget",function(){return d.NullTarget}),i.export(n,"StreamTarget",function(){return d.StreamTarget}),i.export(n,"ALL_TRACK_TYPES",function(){return s.ALL_TRACK_TYPES}),i.export(n,"Source",function(){return f.Source}),i.export(n,"BlobSource",function(){return f.BlobSource}),i.export(n,"BufferSource",function(){return f.BufferSource}),i.export(n,"FilePathSource",function(){return f.FilePathSource}),i.export(n,"StreamSource",function(){return f.StreamSource}),i.export(n,"ReadableStreamSource",function(){return f.ReadableStreamSource}),i.export(n,"UrlSource",function(){return f.UrlSource}),i.export(n,"InputFormat",function(){return h.InputFormat}),i.export(n,"AdtsInputFormat",function(){return h.AdtsInputFormat}),i.export(n,"IsobmffInputFormat",function(){return h.IsobmffInputFormat}),i.export(n,"MatroskaInputFormat",function(){return h.MatroskaInputFormat}),i.export(n,"Mp3InputFormat",function(){return h.Mp3InputFormat}),i.export(n,"Mp4InputFormat",function(){return h.Mp4InputFormat}),i.export(n,"OggInputFormat",function(){return h.OggInputFormat}),i.export(n,"QuickTimeInputFormat",function(){return h.QuickTimeInputFormat}),i.export(n,"WaveInputFormat",function(){return h.WaveInputFormat}),i.export(n,"WebMInputFormat",function(){return h.WebMInputFormat}),i.export(n,"FlacInputFormat",function(){return h.FlacInputFormat}),i.export(n,"ALL_FORMATS",function(){return h.ALL_FORMATS}),i.export(n,"ADTS",function(){return h.ADTS}),i.export(n,"MATROSKA",function(){return h.MATROSKA}),i.export(n,"MP3",function(){return h.MP3}),i.export(n,"MP4",function(){return h.MP4}),i.export(n,"OGG",function(){return h.OGG}),i.export(n,"QTFF",function(){return h.QTFF}),i.export(n,"WAVE",function(){return h.WAVE}),i.export(n,"WEBM",function(){return h.WEBM}),i.export(n,"FLAC",function(){return h.FLAC}),i.export(n,"Input",function(){return p.Input}),i.export(n,"InputDisposedError",function(){return p.InputDisposedError}),i.export(n,"InputTrack",function(){return m.InputTrack}),i.export(n,"InputVideoTrack",function(){return m.InputVideoTrack}),i.export(n,"InputAudioTrack",function(){return m.InputAudioTrack}),i.export(n,"EncodedPacket",function(){return g.EncodedPacket}),i.export(n,"AudioSample",function(){return b.AudioSample}),i.export(n,"VideoSample",function(){return b.VideoSample}),i.export(n,"AudioBufferSink",function(){return k.AudioBufferSink}),i.export(n,"AudioSampleSink",function(){return k.AudioSampleSink}),i.export(n,"BaseMediaSampleSink",function(){return k.BaseMediaSampleSink}),i.export(n,"CanvasSink",function(){return k.CanvasSink}),i.export(n,"EncodedPacketSink",function(){return k.EncodedPacketSink}),i.export(n,"VideoSampleSink",function(){return k.VideoSampleSink}),i.export(n,"Conversion",function(){return _.Conversion}),i.export(n,"CustomVideoDecoder",function(){return y.CustomVideoDecoder}),i.export(n,"CustomVideoEncoder",function(){return y.CustomVideoEncoder}),i.export(n,"CustomAudioDecoder",function(){return y.CustomAudioDecoder}),i.export(n,"CustomAudioEncoder",function(){return y.CustomAudioEncoder}),i.export(n,"registerDecoder",function(){return y.registerDecoder}),i.export(n,"registerEncoder",function(){return y.registerEncoder}),i.export(n,"RichImageData",function(){return S.RichImageData}),i.export(n,"AttachedFile",function(){return S.AttachedFile});var s=e("./output.js"),o=e("./output-format.js"),c=e("./media-source.js"),u=e("./codec.js"),l=e("./encode.js"),d=e("./target.js"),f=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),m=e("./input-track.js"),g=e("./packet.js"),b=e("./sample.js"),k=e("./media-sink.js"),_=e("./conversion.js"),y=e("./custom-coder.js"),S=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"7vKle","./input-format.js":"1jhAI","./input.js":"3sapy","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"k0V9R","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fXWqW:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"VIDEO_CODECS",function(){return u}),i.export(n,"PCM_AUDIO_CODECS",function(){return l}),i.export(n,"NON_PCM_AUDIO_CODECS",function(){return d}),i.export(n,"AUDIO_CODECS",function(){return f}),i.export(n,"SUBTITLE_CODECS",function(){return h}),i.export(n,"VP9_LEVEL_TABLE",function(){return g}),i.export(n,"buildVideoCodecString",function(){return y}),i.export(n,"generateVp9CodecConfigurationFromCodecString",function(){return S}),i.export(n,"generateAv1CodecConfigurationFromCodecString",function(){return w}),i.export(n,"extractVideoCodecString",function(){return T}),i.export(n,"buildAudioCodecString",function(){return x}),i.export(n,"extractAudioCodecString",function(){return I}),i.export(n,"aacFrequencyTable",function(){return E}),i.export(n,"aacChannelMap",function(){return j}),i.export(n,"parseAacAudioSpecificConfig",function(){return P}),i.export(n,"buildAacAudioSpecificConfig",function(){return C}),i.export(n,"OPUS_SAMPLE_RATE",function(){return A}),i.export(n,"parsePcmCodec",function(){return M}),i.export(n,"inferCodecFromCodecString",function(){return D}),i.export(n,"getVideoEncoderConfigExtension",function(){return F}),i.export(n,"getAudioEncoderConfigExtension",function(){return R}),i.export(n,"validateVideoChunkMetadata",function(){return z}),i.export(n,"validateAudioChunkMetadata",function(){return G}),i.export(n,"validateSubtitleMetadata",function(){return q});var s=e("@swc/helpers/cjs/_to_consumable_array.cjs"),o=e("@swc/helpers/cjs/_type_of.cjs"),c=e("./misc.js"),u=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],d=["aac","opus","mp3","vorbis","flac"],f=(0,s._)(d).concat((0,s._)(l)),h=["webvtt"],p=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],m=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],g=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],b=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],k=".01.01.01.01.00",_=".0.110.01.01.01.0",y=function(e,r,n,a){if("avc"===e){var i,s=Math.ceil(r/16)*Math.ceil(n/16),o=null!=(i=p.find(function(e){return s<=e.maxMacroblocks&&a<=e.maxBitrate}))?i:(0,c.last)(p),u=o?o.level:0,l="64".padStart(2,"0"),d=u.toString(16).padStart(2,"0");return"avc1.".concat(l).concat("00").concat(d)}if("hevc"===e){var f,h=r*n,k=null!=(f=m.find(function(e){return h<=e.maxPictureSize&&a<=e.maxBitrate}))?f:(0,c.last)(m);return"hev1."+"".concat("").concat(1,".")+"".concat("6",".")+"".concat(k.tier).concat(k.level,".")+"".concat("B0")}if("vp8"===e)return"vp8";if("vp9"===e){var _,y=r*n,S=null!=(_=g.find(function(e){return y<=e.maxPictureSize&&a<=e.maxBitrate}))?_:(0,c.last)(g);return"vp09.".concat("00",".").concat(S.level.toString().padStart(2,"0"),".").concat("08")}if("av1"===e){var w,T=r*n,x=null!=(w=b.find(function(e){return T<=e.maxPictureSize&&a<=e.maxBitrate}))?w:(0,c.last)(b),I=x.level.toString().padStart(2,"0");return"av01.".concat(0,".").concat(I).concat(x.tier,".").concat("08")}throw TypeError("Unhandled codec '".concat(e,"'."))},S=function(e){var r=e.split(".");return[1,1,Number(r[1]),2,1,Number(r[2]),3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},w=function(e){var r=e.split("."),n=Number(r[1]),a=r[2];return[129,(n<<5)+Number(a.slice(0,-1)),(("H"===a.slice(-1))<<7)+((8!==Number(r[3]))<<6)+0+((r[4]?Number(r[4]):0)<<4)+((r[5]?Number(r[5][0]):1)<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},T=function(e){var r=e.codec,n=e.codecDescription,a=e.colorSpace,i=e.avcCodecInfo,o=e.hevcCodecInfo,u=e.vp9CodecInfo,l=e.av1CodecInfo;if("avc"===r){if((0,c.assert)(null!==e.avcType),i){var d=new Uint8Array([i.avcProfileIndication,i.profileCompatibility,i.avcLevelIndication]);return"avc".concat(e.avcType,".").concat((0,c.bytesToHexString)(d))}if(!n||n.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return"avc".concat(e.avcType,".").concat((0,c.bytesToHexString)(n.subarray(1,4)))}if("hevc"===r){if(o)f=o.generalProfileSpace,h=o.generalProfileIdc,p=(0,c.reverseBitsU32)(o.generalProfileCompatibilityFlags),m=o.generalTierFlag,b=o.generalLevelIdc,y=(0,s._)(o.generalConstraintIndicatorFlags);else{if(!n||n.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");var f,h,p,m,b,y,S=(0,c.toDataView)(n),w=S.getUint8(1);f=w>>6&3,h=31&w,p=(0,c.reverseBitsU32)(S.getUint32(2)),m=w>>5&1,b=S.getUint8(12),y=[];for(var T=0;T<6;T++)y.push(S.getUint8(6+T))}var x="hev1.";for(x+=["","A","B","C"][f]+h,x+=".",x+=p.toString(16).toUpperCase(),x+=".",x+=0===m?"L":"H",x+=b;y.length>0&&0===y[y.length-1];)y.pop();return y.length>0&&(x+=".",x+=y.map(function(e){return e.toString(16).toUpperCase()}).join(".")),x}if("vp8"===r)return"vp8";if("vp9"===r){if(!u){var I=e.width*e.height,E=(0,c.last)(g).level,j=!0,P=!1,C=void 0;try{for(var A,B=g[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value;if(I<=M.maxPictureSize){E=M.level;break}}}catch(e){P=!0,C=e}finally{try{j||null==B.return||B.return()}finally{if(P)throw C}}return"vp09.00.".concat(E.toString().padStart(2,"0"),".08")}var D=u.profile.toString().padStart(2,"0"),F=u.level.toString().padStart(2,"0"),R=u.bitDepth.toString().padStart(2,"0"),U=u.chromaSubsampling.toString().padStart(2,"0"),O=u.colourPrimaries.toString().padStart(2,"0"),L=u.transferCharacteristics.toString().padStart(2,"0"),N=u.matrixCoefficients.toString().padStart(2,"0"),V=u.videoFullRangeFlag.toString().padStart(2,"0"),z="vp09.".concat(D,".").concat(F,".").concat(R,".").concat(U);return(z+=".".concat(O,".").concat(L,".").concat(N,".").concat(V)).endsWith(k)&&(z=z.slice(0,-k.length)),z}if("av1"===r){if(!l){var H=e.width*e.height,G=(0,c.last)(g).level,q=!0,W=!1,K=void 0;try{for(var X,Q=g[Symbol.iterator]();!(q=(X=Q.next()).done);q=!0){var Z=X.value;if(H<=Z.maxPictureSize){G=Z.level;break}}}catch(e){W=!0,K=e}finally{try{q||null==Q.return||Q.return()}finally{if(W)throw K}}return"av01.0.".concat(G.toString().padStart(2,"0"),"M.08")}var Y=l.profile,J=l.level.toString().padStart(2,"0"),$=l.tier?"H":"M",ee=l.bitDepth.toString().padStart(2,"0"),et=l.monochrome?"1":"0",er=100*l.chromaSubsamplingX+10*l.chromaSubsamplingY+ +(l.chromaSubsamplingX&&l.chromaSubsamplingY?l.chromaSamplePosition:0),en=(null==a?void 0:a.primaries)?c.COLOR_PRIMARIES_MAP[a.primaries]:1,ea=(null==a?void 0:a.transfer)?c.TRANSFER_CHARACTERISTICS_MAP[a.transfer]:1,ei=(null==a?void 0:a.matrix)?c.MATRIX_COEFFICIENTS_MAP[a.matrix]:1,es=+(null!=a&&!!a.fullRange),eo="av01.".concat(Y,".").concat(J).concat($,".").concat(ee);return eo+=".".concat(et,".").concat(er.toString().padStart(3,"0")),eo+=".".concat(en.toString().padStart(2,"0")),eo+=".".concat(ea.toString().padStart(2,"0")),eo+=".".concat(ei.toString().padStart(2,"0")),(eo+=".".concat(es)).endsWith(_)&&(eo=eo.slice(0,-_.length)),eo}throw TypeError("Unhandled codec '".concat(r,"'."))},x=function(e,r,n){if("aac"===e)return r>=2&&n<=24e3?"mp4a.40.29":n<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError("Unhandled codec '".concat(e,"'."))},I=function(e){var r=e.codec,n=e.codecDescription,a=e.aacCodecInfo;if("aac"===r){if(!a)throw TypeError("AAC codec info must be provided.");if(a.isMpeg2)return"mp4a.67";var i=P(n);return"mp4a.40.".concat(i.objectType)}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError("Unhandled codec '".concat(r,"'."))},E=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],j=[-1,1,2,3,4,5,6,8],P=function(e){if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");var r=new(0,c.Bitstream)(e),n=r.readBits(5);31===n&&(n=32+r.readBits(6));var a=r.readBits(4),i=null;15===a?i=r.readBits(24):a=1&&s<=7&&(o=j[s]),{objectType:n,frequencyIndex:a,sampleRate:i,channelConfiguration:s,numberOfChannels:o}},C=function(e){var r=E.indexOf(e.sampleRate),n=null;-1===r&&(r=15,n=e.sampleRate);var a=j.indexOf(e.numberOfChannels);if(-1===a)throw TypeError("Unsupported number of channels: ".concat(e.numberOfChannels));var i=13;e.objectType>=32&&(i+=6),15===r&&(i+=24);var s=new Uint8Array(Math.ceil(i/8)),o=new(0,c.Bitstream)(s);return e.objectType<32?o.writeBits(5,e.objectType):(o.writeBits(5,31),o.writeBits(6,e.objectType-32)),o.writeBits(4,r),15===r&&o.writeBits(24,n),o.writeBits(4,a),s},A=48e3,B=/^pcm-([usf])(\d+)+(be)?$/,M=function(e){if((0,c.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};var r=B.exec(e);return(0,c.assert)(r),{dataType:"u"===r[1]?"unsigned":"s"===r[1]?"signed":"float",sampleSize:Number(r[2])/8,littleEndian:"be"!==r[3],silentValue:128*("pcm-u8"===e)}},D=function(e){if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(B.test(e))return e;return"webvtt"===e?"webvtt":null},F=function(e){return"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{}},R=function(e){return"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{}},U=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],O=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,N=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,V=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,z=function(e){if(!e)throw TypeError("Video chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!U.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){var r=e.decoderConfig.colorSpace;if((void 0===r?"undefined":(0,o._)(r))!=="object")throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");var n=Object.keys(c.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!n.includes(r.primaries))throw TypeError("Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of"+" ".concat(n.join(", "),"."));var a=Object.keys(c.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!a.includes(r.transfer))throw TypeError("Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of"+" ".concat(a.join(", "),"."));var i=Object.keys(c.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!i.includes(r.matrix))throw TypeError("Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of"+" ".concat(i.join(", "),"."));if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!O.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!V.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},H=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],G=function(e){if(!e)throw TypeError("Audio chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!H.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM"+" codecs (".concat(l.join(", "),")."))},q=function(e){if(!e)throw TypeError("Subtitle metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!==(0,o._)(e.config))throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j7iGm:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"assert",function(){return _}),i.export(n,"normalizeRotation",function(){return y}),i.export(n,"last",function(){return S}),i.export(n,"isU32",function(){return w}),i.export(n,"Bitstream",function(){return T}),i.export(n,"readExpGolomb",function(){return x}),i.export(n,"readSignedExpGolomb",function(){return I}),i.export(n,"writeBits",function(){return E}),i.export(n,"toUint8Array",function(){return j}),i.export(n,"toDataView",function(){return P}),i.export(n,"textDecoder",function(){return C}),i.export(n,"textEncoder",function(){return A}),i.export(n,"isIso88591Compatible",function(){return B}),i.export(n,"COLOR_PRIMARIES_MAP",function(){return D}),i.export(n,"COLOR_PRIMARIES_MAP_INVERSE",function(){return F}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP",function(){return R}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",function(){return U}),i.export(n,"MATRIX_COEFFICIENTS_MAP",function(){return O}),i.export(n,"MATRIX_COEFFICIENTS_MAP_INVERSE",function(){return L}),i.export(n,"colorSpaceIsComplete",function(){return N}),i.export(n,"isAllowSharedBufferSource",function(){return V}),i.export(n,"AsyncMutex",function(){return z}),i.export(n,"bytesToHexString",function(){return H}),i.export(n,"reverseBitsU32",function(){return G}),i.export(n,"binarySearchExact",function(){return q}),i.export(n,"binarySearchLessOrEqual",function(){return W}),i.export(n,"insertSorted",function(){return K}),i.export(n,"promiseWithResolvers",function(){return X}),i.export(n,"removeItem",function(){return Q}),i.export(n,"findLast",function(){return Z}),i.export(n,"findLastIndex",function(){return Y}),i.export(n,"toAsyncIterator",function(){return J}),i.export(n,"validateAnyIterable",function(){return $}),i.export(n,"assertNever",function(){return ee}),i.export(n,"getUint24",function(){return et}),i.export(n,"getInt24",function(){return er}),i.export(n,"setUint24",function(){return en}),i.export(n,"setInt24",function(){return ea}),i.export(n,"setInt64",function(){return ei}),i.export(n,"mapAsyncGenerator",function(){return es}),i.export(n,"clamp",function(){return eo}),i.export(n,"UNDETERMINED_LANGUAGE",function(){return ec}),i.export(n,"roundIfAlmostInteger",function(){return eu}),i.export(n,"roundToMultiple",function(){return el}),i.export(n,"ilog",function(){return ed}),i.export(n,"isIso639Dash2LanguageCode",function(){return eh}),i.export(n,"SECOND_TO_MICROSECOND_FACTOR",function(){return ep}),i.export(n,"mergeRequestInit",function(){return em}),i.export(n,"retriedFetch",function(){return ev}),i.export(n,"computeRationalApproximation",function(){return eb}),i.export(n,"CallSerializer",function(){return ek}),i.export(n,"isWebKit",function(){return ey}),i.export(n,"isFirefox",function(){return ew}),i.export(n,"isChromium",function(){return ex}),i.export(n,"getChromiumVersion",function(){return eE}),i.export(n,"coalesceIndex",function(){return ej}),i.export(n,"closedIntervalsOverlap",function(){return eP}),i.export(n,"keyValueIterator",function(){return eC}),i.export(n,"imageMimeTypeToExtension",function(){return eA}),i.export(n,"base64ToBytes",function(){return eB}),i.export(n,"bytesToBase64",function(){return eM}),i.export(n,"uint8ArraysAreEqual",function(){return eD}),i.export(n,"polyfillSymbolDispose",function(){return eF}),i.export(n,"isNumber",function(){return eR});var s=e("@swc/helpers/cjs/_async_generator_delegate.cjs"),o=e("@swc/helpers/cjs/_async_iterator.cjs"),c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_object_spread.cjs"),h=e("@swc/helpers/cjs/_sliced_to_array.cjs"),p=e("@swc/helpers/cjs/_to_consumable_array.cjs"),m=e("@swc/helpers/cjs/_type_of.cjs"),g=e("@swc/helpers/cjs/_wrap_async_generator.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("@swc/helpers/cjs/_ts_values.cjs");function _(e){if(!e)throw Error("Assertion failed.")}var y=function(e){var r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error("Invalid rotation ".concat(e,"."))},S=function(e){return e&&e[e.length-1]},w=function(e){return e>=0&&e<0x100000000},T=function(){"use strict";function e(r){(0,u._)(this,e),this.bytes=r,this.pos=0}return(0,l._)(e,[{key:"seekToByte",value:function(e){this.pos=8*e}},{key:"readBit",value:function(){var e,r=Math.floor(this.pos/8),n=null!=(e=this.bytes[r])?e:0,a=7-(7&this.pos);return this.pos++,(n&1<>a}},{key:"readBits",value:function(e){if(1===e)return this.readBit();for(var r=0,n=0;n>n-a-1<=32)throw Error("Invalid exponential-Golomb code.");return(1<>1):r+1>>1},E=function(e,r,n,a){for(var i=r;i>n-i-1<255)return!1;return!0},M=function(e){return Object.fromEntries(Object.entries(e).map(function(e){var r=(0,h._)(e,2),n=r[0];return[r[1],n]}))},D={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},F=M(D),R={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},U=M(R),O={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},L=M(O),N=function(e){return!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange},V=function(e){return e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)},z=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"acquire",value:function(){return(0,c._)(function(){var e,r,n;return(0,b._)(this,function(a){switch(a.label){case 0:return r=new Promise(function(r){e=r}),n=this.currentPromise,this.currentPromise=r,[4,n];case 1:return a.sent(),[2,e]}})}).call(this)}}]),e}(),H=function(e){return(0,p._)(e).map(function(e){return e.toString(16).padStart(2,"0")}).join("")},G=function(e){return(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0},q=function(e,r,n){for(var a=0,i=e.length-1,s=-1;a<=i;){var o=a+i>>1,c=n(e[o]);c===r?(s=o,i=o-1):c=0;n--)if(r(e[n]))return e[n]},Y=function(e,r){for(var n=e.length-1;n>=0;n--)if(r(e[n]))return n;return -1},J=function(e){return(0,g._)(function(){return(0,b._)(this,function(r){switch(r.label){case 0:if(!(Symbol.iterator in e))return[3,2];return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.iterator]())))];case 1:return r.sent(),[3,4];case 2:return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.asyncIterator]())))];case 3:r.sent(),r.label=4;case 4:return[2]}})})()},$=function(e){if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},ee=function(e){throw Error("Unexpected value: ".concat(e))},et=function(e,r,n){var a=e.getUint8(r),i=e.getUint8(r+1),s=e.getUint8(r+2);return n?a|i<<8|s<<16:a<<16|i<<8|s},er=function(e,r,n){return et(e,r,n)<<8>>8},en=function(e,r,n,a){n>>>=0,n&=0xffffff,a?(e.setUint8(r,255&n),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,n>>>16&255)):(e.setUint8(r,n>>>16&255),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,255&n))},ea=function(e,r,n,a){(n=eo(n,-8388608,8388607))<0&&(n=n+0x1000000&0xffffff),en(e,r,n,a)},ei=function(e,r,n,a){a?(e.setUint32(r+0,n,!0),e.setInt32(r+4,Math.floor(n/0x100000000),!0)):(e.setInt32(r+0,Math.floor(n/0x100000000),!0),e.setUint32(r+4,n,!0))},es=function(e,r){return(0,d._)({next:function(){return(0,c._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:return[4,e.next()];case 1:if((n=a.sent()).done)return[2,{value:void 0,done:!0}];return[2,{value:r(n.value),done:!1}]}})})()},return:function(){return e.return()},throw:function(r){return e.throw(r)}},Symbol.asyncIterator,function(){return this})},eo=function(e,r,n){return Math.max(r,Math.min(n,e))},ec="und",eu=function(e){var r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},el=function(e,r){return Math.round(e/r)*r},ed=function(e){for(var r=0;e;)r++,e>>=1;return r},ef=/^[a-z]{3}$/,eh=function(e){return ef.test(e)},ep=1e6*(1+Number.EPSILON),em=function(e,r){var n=(0,f._)({},e,r);if(e.headers||r.headers){var a=e.headers?eg(e.headers):{},i=r.headers?eg(r.headers):{},s=(0,f._)({},a);Object.entries(i).forEach(function(e){var r=(0,h._)(e,2),n=r[0],a=r[1],i=Object.keys(s).find(function(e){return e.toLowerCase()===n.toLowerCase()});i&&delete s[i],s[n]=a}),n.headers=s}return n},eg=function(e){if(e instanceof Headers){var r={};return e.forEach(function(e,n){r[n]=e}),r}if(Array.isArray(e)){var n={};return e.forEach(function(e){var r=(0,h._)(e,2),a=r[0],i=r[1];n[a]=i}),n}return e},ev=function(e,r,n,a,i){return(0,c._)(function(){var s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:s=function(){var s,c,u;return(0,b._)(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,,5]),s={},[4,e(r,n)];case 1:return[2,(s.v=l.sent(),s)];case 2:if(c=l.sent(),i()||null===(u=a(++o,c,r)))throw c;if(console.error("Retrying failed fetch. Error:",c),!Number.isFinite(u)||u<0)throw TypeError("Retry delay must be a non-negative finite number.");if(!(u>0))return[3,4];return[4,new Promise(function(e){return setTimeout(e,1e3*u)})];case 3:l.sent(),l.label=4;case 4:if(i())throw c;return[3,5];case 5:return[2]}})},o=0,u.label=1;case 1:return[5,(0,k._)(s())];case 2:if(c=u.sent(),"object"===(0,m._)(c))return[2,c.v];return[3,1];case 3:return[2]}})})()},eb=function(e,r){for(var n=e<0?-1:1,a=0,i=1,s=1,o=0,c=e=Math.abs(e);;){var u=Math.floor(c),l=u*s+a,d=u*o+i;if(d>r||(a=s,i=o,s=l,o=d,!isFinite(c=1/(c-u))))break}return{numerator:n*s,denominator:o}},ek=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"call",value:function(e){return this.currentPromise=this.currentPromise.then(e)}}]),e}(),e_=null,ey=function(){var e;return null!==e_?e_:e_=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.match(/apple/i))||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent)))},eS=null,ew=function(){var e;return null!==eS?eS:eS="undefined"!=typeof navigator&&(null==(e=navigator.userAgent)?void 0:e.includes("Firefox"))},eT=null,ex=function(){var e;return null!==eT?eT:eT=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.includes("Google Inc"))||/Chrome/.test(navigator.userAgent)))},eI=null,eE=function(){if(null!==eI)return eI;if("undefined"==typeof navigator)return null;var e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eI=Number(e[1]):null},ej=function(e,r){return -1!==e?e:r},eP=function(e,r,n,a){return e<=a&&n<=r},eC=function(e){var r,n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:for(n in r=[],e)r.push(n);a=0,o.label=1;case 1:if(!(a1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,p.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._readers=new WeakMap,n._blob=e,n._orchestrator=new j({maxCacheSize:null!=(a=i.maxCacheSize)?a:8388608,maxWorkerCount:4,runWorker:n._runWorker.bind(n),prefetchProfile:E.fileSystem}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this._blob.size;return this._orchestrator.fileSize=e,e}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,f._)(this,function(d){switch(d.label){case 0:void 0===(r=this._readers.get(e))&&(r="stream"in this._blob&&!(0,p.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r)),d.label=1;case 1:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!s||(void 0===s?"undefined":(0,d._)(s))!=="object")throw TypeError("options must be an object.");if(void 0!==s.requestInit&&(!s.requestInit||"object"!==(0,d._)(s.requestInit)))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==s.getRetryDelay&&"function"!=typeof s.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==s.maxCacheSize&&(!(0,p.isNumber)(s.maxCacheSize)||s.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==s.fetchFn&&"function"!=typeof s.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");return(n=(0,o._)(this,r))._existingResponses=new WeakMap,n._url=e,n._options=s,n._getRetryDelay=null!=(a=s.getRetryDelay)?a:S,n._orchestrator=new j({maxCacheSize:null!=(i=s.maxCacheSize)?i:0x4000000,maxWorkerCount:2,runWorker:n._runWorker.bind(n),prefetchProfile:E.network}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c;return(0,f._)(this,function(u){switch(u.label){case 0:return e=this,r=new AbortController,[4,(0,p.retriedFetch)(null!=(n=this._options.fetchFn)?n:fetch,this._url,(0,p.mergeRequestInit)(null!=(a=this._options.requestInit)?a:{},{headers:{Range:"bytes=0-"},signal:r.signal}),this._getRetryDelay,function(){return e._disposed})];case 1:if(!(i=u.sent()).ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(i.status," ").concat(i.statusText));if(206===i.status)o=this._getTotalLengthFromRangeResponse(i),s=this._orchestrator.createWorker(0,Math.min(o,524288));else if(c=i.headers.get("Content-Length"))o=Number(c),s=this._orchestrator.createWorker(0,o),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error("HTTP response (status ".concat(i.status,") must surface Content-Length header."));return this._orchestrator.fileSize=o,this._existingResponses.set(s,{response:i,abortController:r}),this._orchestrator.runWorker(s),[2,o]}})}).call(this)}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,m;return(0,f._)(this,function(g){switch(g.label){case 0:r=this,g.label=1;case 1:if(a=function(){var r,a,i,o,c,u,d;return(0,f._)(this,function(f){switch(f.label){case 0:if(e.currentPos>=e.targetPos||e.aborted)return s.abort(),e.running=!1,[2,{v:void 0}];i=void 0,f.label=1;case 1:return f.trys.push([1,3,,7]),[4,l.read()];case 2:return i=f.sent(),[3,7];case 3:if(o=f.sent(),n._disposed)throw o;if(null===(c=n._getRetryDelay(1,o,n._url)))return[3,5];return console.error("Error while reading response stream. Attempting to resume.",o),[4,new Promise(function(e){return setTimeout(e,1e3*c)})];case 4:return f.sent(),[2,"break"];case 5:throw o;case 6:return[3,7];case 7:if(e.aborted)return[2,"break"];if(u=i.done,d=i.value,u){if(e.currentPos>=e.targetPos)return n._orchestrator.forgetWorker(e),e.running=!1,[2,{v:void 0}];return[2,"break"]}return null==(r=(a=n).onread)||r.call(a,e.currentPos,e.currentPos+d.length),n._orchestrator.supplyWorkerData(e,d),[2]}})},i=this._existingResponses.get(e),this._existingResponses.delete(e),s=null==i?void 0:i.abortController,o=null==i?void 0:i.response,s)return[3,3];return s=new AbortController,[4,(0,p.retriedFetch)(null!=(c=this._options.fetchFn)?c:fetch,this._url,(0,p.mergeRequestInit)(null!=(u=this._options.requestInit)?u:{},{headers:{Range:"bytes=".concat(e.currentPos,"-")},signal:s.signal}),this._getRetryDelay,function(){return r._disposed})];case 2:o=g.sent(),g.label=3;case 3:if((0,p.assert)(o),!o.ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(o.status," ").concat(o.statusText));if(e.currentPos>0&&206!==o.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!o.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");l=o.body.getReader(),g.label=4;case 4:return n=this,[5,(0,h._)(a())];case 5:if(m=g.sent(),"object"===(0,d._)(m))return[2,m.v];if("break"===m)return[3,6];return[3,4];case 6:if(e.aborted)return[3,7];return[3,1];case 7:return e.running=!1,[2]}})}).call(this)}},{key:"_getTotalLengthFromRangeResponse",value:function(e){var r=e.headers.get("Content-Range");if(r){var n=/\/(\d+)/.exec(r);if(n)return Number(n[1])}var a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}},{key:"_dispose",value:function(){this._orchestrator.dispose()}}]),r}(k),T=function(e){"use strict";function r(e){var n,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e)throw TypeError("filePath must be a string.");if(!a||(void 0===a?"undefined":(0,d._)(a))!=="object")throw TypeError("options must be an object.");if(void 0!==a.maxCacheSize&&(!(0,p.isNumber)(a.maxCacheSize)||a.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._fileHandle=null,n._streamSource=new x({getSize:function(){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:return[4,b.fs.open(e,"r")];case 1:return n._fileHandle=r.sent(),[4,n._fileHandle.stat()];case 2:return[2,r.sent().size]}})})()},read:function(e,r){return(0,s._)(function(){var a;return(0,f._)(this,function(i){switch(i.label){case 0:return(0,p.assert)(n._fileHandle),a=new Uint8Array(r-e),[4,n._fileHandle.read(a,0,r-e,e)];case 1:return i.sent(),[2,a]}})})()},maxCacheSize:a.maxCacheSize,prefetchProfile:"fileSystem"}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_read",value:function(e,r){return this._streamSource._read(e,r)}},{key:"_retrieveSize",value:function(){return this._streamSource._retrieveSize()}},{key:"_dispose",value:function(){var e;this._streamSource._dispose(),null==(e=this._fileHandle)||e.close(),this._fileHandle=null}}]),r}(k),x=function(e){"use strict";function r(e){var n,a,i;if((0,c._)(this,r),!e||(void 0===e?"undefined":(0,d._)(e))!=="object")throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,p.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");return(n=(0,o._)(this,r))._options=e,n._orchestrator=new j({maxCacheSize:null!=(a=e.maxCacheSize)?a:8388608,maxWorkerCount:2,prefetchProfile:E[null!=(i=e.prefetchProfile)?i:"none"],runWorker:n._runWorker.bind(n)}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this,r=this._options.getSize();if(r instanceof Promise)return r.then(function(r){if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return e._orchestrator.fileSize=r,r});if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=r,r}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,d,h,m;return(0,f._)(this,function(f){switch(f.label){case 0:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof ReadableStream))throw TypeError("stream must be a ReadableStream.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,p.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._reader=null,n._cache=[],n._pendingSlices=[],n._currentIndex=0,n._targetIndex=0,n._maxRequestedIndex=0,n._endIndex=null,n._pulling=!1,n._stream=e,n._maxCacheSize=null!=(a=i.maxCacheSize)?a:0x1000000,n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return this._endIndex}},{key:"_read",value:function(e,r){var n=this;if(null!==this._endIndex&&r>this._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);var a=(0,p.binarySearchLessOrEqual)(this._cache,e,function(e){return e.start}),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};var s=e,o=new Uint8Array(r-e);if(-1!==a)for(var c=a;c=r)break;var l=Math.max(e,u.start);l>s&&this._throwDueToCacheMiss();var d=Math.min(r,u.end);ls&&this._throwDueToCacheMiss();var f=(0,p.promiseWithResolvers)(),h=f.promise,m=f.resolve,g=f.reject;return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:m,reject:g}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(function(e){if(n._pulling=!1,n._pendingSlices.length>0)n._pendingSlices.forEach(function(r){return r.reject(e)}),n._pendingSlices.length=0;else throw e})),h}},{key:"_throwDueToCacheMiss",value:function(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}},{key:"_pull",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u,l,d,h,m,g,b;return(0,f._)(this,function(f){switch(f.label){case 0:null!=this._reader||(this._reader=this._stream.getReader()),f.label=1;case 1:if(!(this._currentIndex0&&(b=this._cache[0],!(this._maxRequestedIndex-b.end<=this._maxCacheSize));)this._cache.shift();return this._currentIndex+=n.byteLength,[3,1];case 3:return this._pulling=!1,[2]}})}).call(this)}},{key:"_dispose",value:function(){this._pendingSlices.length=0,this._cache.length=0}}]),r}(k),E={none:function(e,r){return{start:e,end:r}},fileSystem:function(e,r){return{start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}},network:function(e,r,n){e=Math.max(0,65536*Math.floor((e-65536)/65536));var a=!0,i=!1,s=void 0;try{for(var o,c=n[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value,l=Math.max((u.startPos+u.targetPos)/2,u.targetPos-8388608);if((0,p.closedIntervalsOverlap)(e,r,l,u.targetPos)){var d=u.targetPos-u.startPos,f=8388608*Math.ceil((d+1)/8388608),h=Math.pow(2,Math.ceil(Math.log2(d+1))),m=Math.min(h,f);r=Math.max(r,u.startPos+m)}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return r=Math.max(r,e+524288),{start:e,end:r}}},j=function(){"use strict";function e(r){(0,c._)(this,e),this.options=r,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}return(0,u._)(e,[{key:"read",value:function(e,r){(0,p.assert)(null!==this.fileSize);var n=this.options.prefetchProfile(e,r,this.workers),a=Math.max(n.start,0),i=Math.min(n.end,this.fileSize);(0,p.assert)(a<=e&&r<=i);var s=null,o=(0,p.binarySearchLessOrEqual)(this.cache,e,function(e){return e.start}),c=-1!==o?this.cache[o]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,s={bytes:c.bytes,view:c.view,offset:c.start});var u=(0,p.binarySearchLessOrEqual)(this.cache,a,function(e){return e.start}),l=s?null:new Uint8Array(r-e),d=0,f=a,h=[];if(-1!==u){for(var m=u;m=i)break;if(!(g.end<=a)){var b=Math.max(a,g.start),k=Math.min(i,g.end);if((0,p.assert)(b<=k),f=l.length&&(s={bytes:l,view:(0,p.toDataView)(l),offset:e}),0===h.length)return(0,p.assert)(s),s;var w=(0,p.promiseWithResolvers)(),T=w.promise,x=w.resolve,I=w.reject,E=[],j=!0,P=!1,C=void 0;try{for(var A,B=h[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value,D=Math.max(e,M.start),F=Math.min(r,M.end);D===M.start&&F===M.end?E.push(M):Dthis.options.maxWorkerCount;){for(var a=0,i=this.workers[0],s=1;s0)break;i.aborted=!0,this.workers.splice(a,1)}return n}},{key:"runWorker",value:function(e){(0,p.assert)(!e.running),(0,p.assert)(e.currentPos0)e.pendingSlices.forEach(function(e){return e.reject(r)}),e.pendingSlices.length=0;else throw r})}},{key:"supplyWorkerData",value:function(e,r){(0,p.assert)(!e.aborted);var n=e.currentPos,a=n+r.length;this.insertIntoCache({start:n,end:a,bytes:r,view:(0,p.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(var i=0;il.start&&(l.start=a),l.end<=l.start&&(s.holes.splice(u,1),u--)}0===s.holes.length&&(s.resolve(s.bytes),e.pendingSlices.splice(i,1),i--)}for(var d=0;d0){var n=this.cache[r-1];if(n.end>=e.end)return;if(n.end>e.start){var a=new Uint8Array(e.end-n.start);a.set(n.bytes,0),a.set(e.bytes,e.start-n.start),this.currentCacheSize+=e.end-n.end,n.bytes=a,n.view=(0,p.toDataView)(a),n.end=e.end,r--,e=n}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(var i=r+1;i=s.end){this.cache.splice(i,1),this.currentCacheSize-=s.bytes.length,i--;continue}var o=new Uint8Array(s.end-e.start);o.set(e.bytes,0),o.set(s.bytes,s.start-e.start),this.currentCacheSize-=e.end-s.start,e.bytes=o,e.view=(0,p.toDataView)(o),e.end=s.end,this.cache.splice(i,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){for(var c=0,u=this.cache[0],l=1;l0&&void 0!==arguments[0]?arguments[0]:"Input has been disposed.";return(0,c._)(this,r),(e=(0,o._)(this,r,[n])).name="InputDisposedError",e}return(0,l._)(r,e),r}((0,f._)(Error))},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./input-format.js":"1jhAI","./misc.js":"j7iGm","./reader.js":"8KRfO","./source.js":"7vKle","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,r,n,a){"use strict";var i=e("c8857d56f4968279"),s=e("2ed7bdf1701f2d07"),o=e("5c5ad8846076b9cd"),c=e("2db6fa09e8a5be4c");function u(e){var r="function"==typeof Map?new Map:void 0;return n._=u=function(e){if(null===e||!o._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,n)}function n(){return i._(e,arguments,s._(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c._(n,e)},u(e)}n._=u},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,r,n,a){"use strict";var i=e("62fc231ae2e75266"),s=e("3f98bf9d4f706151");function o(e,r,a){return i._()?n._=o=Reflect.construct:n._=o=function(e,r,n){var a=[null];a.push.apply(a,r);var i=new(Function.bind.apply(e,a));return n&&s._(i,n.prototype),i},o.apply(null,arguments)}n._=o},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,r,n,a){"use strict";n._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"1jhAI":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"InputFormat",function(){return I}),i.export(n,"IsobmffInputFormat",function(){return E}),i.export(n,"Mp4InputFormat",function(){return j}),i.export(n,"QuickTimeInputFormat",function(){return P}),i.export(n,"MatroskaInputFormat",function(){return C}),i.export(n,"WebMInputFormat",function(){return A}),i.export(n,"Mp3InputFormat",function(){return B}),i.export(n,"WaveInputFormat",function(){return M}),i.export(n,"OggInputFormat",function(){return D}),i.export(n,"FlacInputFormat",function(){return F}),i.export(n,"AdtsInputFormat",function(){return R}),i.export(n,"MP4",function(){return U}),i.export(n,"QTFF",function(){return O}),i.export(n,"MATROSKA",function(){return L}),i.export(n,"WEBM",function(){return N}),i.export(n,"MP3",function(){return V}),i.export(n,"WAVE",function(){return z}),i.export(n,"OGG",function(){return H}),i.export(n,"ADTS",function(){return G}),i.export(n,"FLAC",function(){return q}),i.export(n,"ALL_FORMATS",function(){return W});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("./isobmff/isobmff-demuxer.js"),h=e("./matroska/ebml.js"),p=e("./matroska/matroska-demuxer.js"),m=e("./mp3/mp3-demuxer.js"),g=e("../shared/mp3-misc.js"),b=e("./id3.js"),k=e("./mp3/mp3-reader.js"),_=e("./ogg/ogg-demuxer.js"),y=e("./wave/wave-demuxer.js"),S=e("./adts/adts-reader.js"),w=e("./adts/adts-demuxer.js"),T=e("./reader.js"),x=e("./flac/flac-demuxer.js"),I=function e(){"use strict";(0,c._)(this,e)},E=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_getMajorBrand",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r||(r.skip(4),"ftyp"!==(0,T.readAscii)(r,4)))return[2,null];return[2,(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,f.IsobmffDemuxer)(e)}}]),r}(I),j=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,!!(r=n.sent())&&"qt "!==r]}})}).call(this)}},{key:"name",get:function(){return"MP4"}},{key:"mimeType",get:function(){return"video/mp4"}}]),r}(E),P=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){return(0,d._)(this,function(r){switch(r.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,"qt "===r.sent()]}})}).call(this)}},{key:"name",get:function(){return"QuickTime File Format"}},{key:"mimeType",get:function(){return"video/quicktime"}}]),r}(E),C=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"isSupportedEBMLOfDocType",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,f;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((n=e._reader.requestSlice(0,h.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,n];case 1:n=d.sent(),d.label=2;case 2:if(!n||null===(a=(0,h.readVarIntSize)(n))||a<1||a>8||(0,h.readUnsignedInt)(n,a)!==h.EBMLId.EBML||null===(i=(0,h.readElementSize)(n)))return[2,!1];if(!((s=e._reader.requestSlice(n.filePos,i))instanceof Promise))return[3,4];return[4,s];case 3:s=d.sent(),d.label=4;case 4:if(!s)return[2,!1];for(o=n.filePos;s.filePos<=o+i-h.MIN_HEADER_SIZE&&(c=(0,h.readElementHeader)(s));){if(u=c.id,l=c.size,f=s.filePos,null===l)return[2,!1];switch(u){case h.EBMLId.EBMLVersion:case h.EBMLId.EBMLReadVersion:if(1!==(0,h.readUnsignedInt)(s,l))return[2,!1];break;case h.EBMLId.DocType:if((0,h.readAsciiString)(s,l)!==r)return[2,!1];break;case h.EBMLId.DocTypeVersion:if((0,h.readUnsignedInt)(s,l)>4)return[2,!1]}s.filePos=f+l}return[2,!0]}})})()}},{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"matroska")}},{key:"_createDemuxer",value:function(e){return new(0,p.MatroskaDemuxer)(e)}},{key:"name",get:function(){return"Matroska"}},{key:"mimeType",get:function(){return"video/x-matroska"}}]),r}(I),A=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"webm")}},{key:"name",get:function(){return"WebM"}},{key:"mimeType",get:function(){return"video/webm"}}]),r}(C),B=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((r=e._reader.requestSlice(0,10))instanceof Promise))return[3,2];return[4,r];case 1:r=d.sent(),d.label=2;case 2:if(!r)return[2,!1];n=0,a=!1,d.label=3;case 3:if(!((i=e._reader.requestSlice(n,b.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,5];return[4,i];case 4:i=d.sent(),d.label=5;case 5:if(!i||!(s=(0,b.readId3V2Header)(i)))return[3,6];return a=!0,n=i.filePos+s.size,[3,3];case 6:return[4,(0,k.readNextFrameHeader)(e._reader,n,n+4096)];case 7:if(!(o=d.sent()))return[2,!1];if(a)return[2,!0];return n=o.startPos+o.header.totalSize,[4,(0,k.readNextFrameHeader)(e._reader,n,n+g.FRAME_HEADER_SIZE)];case 8:if(!(c=d.sent())||(u=o.header,l=c.header,u.channel!==l.channel||u.sampleRate!==l.sampleRate))return[2,!1];return[2,!0]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,m.Mp3Demuxer)(e)}},{key:"name",get:function(){return"MP3"}},{key:"mimeType",get:function(){return"audio/mpeg"}}]),r}(I),M=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=a.sent(),a.label=2;case 2:if(!r||"RIFF"!==(n=(0,T.readAscii)(r,4))&&"RIFX"!==n&&"RF64"!==n)return[2,!1];return r.skip(4),[2,"WAVE"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,y.WaveDemuxer)(e)}},{key:"name",get:function(){return"WAVE"}},{key:"mimeType",get:function(){return"audio/wav"}}]),r}(I),D=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"OggS"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,_.OggDemuxer)(e)}},{key:"name",get:function(){return"Ogg"}},{key:"mimeType",get:function(){return"application/ogg"}}]),r}(I),F=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"fLaC"===(0,T.readAscii)(r,4)]}})})()}},{key:"name",get:function(){return"FLAC"}},{key:"mimeType",get:function(){return"audio/flac"}},{key:"_createDemuxer",value:function(e){return new(0,x.FlacDemuxer)(e)}}]),r}(I),R=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a;return(0,d._)(this,function(i){switch(i.label){case 0:if(!((r=e._reader.requestSliceRange(0,S.MIN_FRAME_HEADER_SIZE,S.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,r];case 1:r=i.sent(),i.label=2;case 2:if(!r||!(n=(0,S.readFrameHeader)(r)))return[2,!1];if(!((r=e._reader.requestSliceRange(n.frameLength,S.MIN_FRAME_HEADER_SIZE,S.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,4];return[4,r];case 3:r=i.sent(),i.label=4;case 4:if(!r||!(a=(0,S.readFrameHeader)(r)))return[2,!1];return[2,n.objectType===a.objectType&&n.samplingFrequencyIndex===a.samplingFrequencyIndex&&n.channelConfiguration===a.channelConfiguration]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,w.AdtsDemuxer)(e)}},{key:"name",get:function(){return"ADTS"}},{key:"mimeType",get:function(){return"audio/aac"}}]),r}(I),U=new j,O=new P,L=new C,N=new A,V=new B,z=new M,H=new D,G=new R,q=new F,W=[U,O,L,N,z,H,q,V,G]},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./isobmff/isobmff-demuxer.js":"1Dw1A","./matroska/ebml.js":"fq2QE","./matroska/matroska-demuxer.js":"kY1ME","./mp3/mp3-demuxer.js":"ifShX","../shared/mp3-misc.js":"gcure","./id3.js":"42Y2c","./mp3/mp3-reader.js":"gFWvE","./ogg/ogg-demuxer.js":"hRJRs","./wave/wave-demuxer.js":"cokSU","./adts/adts-reader.js":"5AUBv","./adts/adts-demuxer.js":"3t0bF","./reader.js":"8KRfO","./flac/flac-demuxer.js":"e0w8C","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1Dw1A":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"IsobmffDemuxer",function(){return I});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_sliced_to_array.cjs"),h=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),m=e("../codec.js"),g=e("../codec-data.js"),b=e("../demuxer.js"),k=e("../input-track.js"),_=e("../misc.js"),y=e("../packet.js"),S=e("./isobmff-misc.js"),w=e("./isobmff-reader.js"),T=e("../reader.js"),x=e("../metadata.js"),I=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).moovSlice=null,n.currentTrack=null,n.tracks=[],n.metadataPromise=null,n.movieTimescale=-1,n.movieDurationInTimescale=-1,n.isQuickTime=!1,n.metadataTags={},n.currentMetadataKeys=null,n.isFragmented=!1,n.fragmentTrackDefaults=[],n.currentFragment=null,n.lastReadFragment=null,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r;return(0,p._)(this,function(n){switch(n.label){case 0:return[4,this.getTracks()];case 1:return[4,Promise.all(n.sent().map(function(e){return e.computeDuration()}))];case 2:return r=n.sent(),[2,(e=Math).max.apply(e,[0].concat((0,h._)(r)))]}})}).call(this)}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks.map(function(e){return e.inputTrack})]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){var e;return(0,p._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),[4,Promise.all(this.tracks.map(function(e){return e.inputTrack.getCodecParameterString()}))];case 2:return e=r.sent(),[2,(0,S.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(function(e){var r;return(null==(r=e.info)?void 0:r.type)==="video"}),hasAudio:this.tracks.some(function(e){var r;return(null==(r=e.info)?void 0:r.type)==="audio"}),codecStrings:e.filter(Boolean)})]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.metadataTags]}})}).call(this)}},{key:"readMetadata",value:function(){var e;return null!=(e=this.metadataPromise)?e:this.metadataPromise=(0,s._)(function(){var e,r,n,a,i,s,o,c,u,l,d,f,h,m,g,b,k,y,S;return(0,p._)(this,function(p){switch(p.label){case 0:e=0,p.label=1;case 1:if(!((r=this.reader.requestSliceRange(e,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,r];case 2:r=p.sent(),p.label=3;case 3:if(!r||(n=e,!(a=(0,w.readBoxHeader)(r))))return[3,8];if("ftyp"!==a.name)return[3,4];return i=(0,T.readAscii)(r,4),this.isQuickTime="qt "===i,[3,7];case 4:if("moov"!==a.name)return[3,7];if(!((s=this.reader.requestSlice(r.filePos,a.contentSize))instanceof Promise))return[3,6];return[4,s];case 5:s=p.sent(),p.label=6;case 6:if(!s)return[3,8];this.moovSlice=s,this.readContiguousBoxes(this.moovSlice),this.tracks.sort(function(e,r){return Number(r.disposition.default)-Number(e.disposition.default)}),o=!0,c=!1,u=void 0;try{for(l=this.tracks[Symbol.iterator]();!(o=(d=l.next()).done);o=!0)h=(f=d.value).editListPreviousSegmentDurations/this.movieTimescale,f.editListOffset-=Math.round(h*f.timescale)}catch(e){c=!0,u=e}finally{try{o||null==l.return||l.return()}finally{if(c)throw u}}return[3,8];case 7:return e=n+a.totalSize,[3,1];case 8:if(!(this.isFragmented&&null!==this.reader.fileSize))return[3,15];if(!((m=this.reader.requestSlice(this.reader.fileSize-4,4))instanceof Promise))return[3,10];return[4,m];case 9:m=p.sent(),p.label=10;case 10:if((0,_.assert)(m),g=(0,T.readU32Be)(m),!((b=this.reader.fileSize-g)>=0&&b<=this.reader.fileSize-w.MAX_BOX_HEADER_SIZE))return[3,15];if(!((k=this.reader.requestSliceRange(b,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,12];return[4,k];case 11:k=p.sent(),p.label=12;case 12:if(!k||!((y=(0,w.readBoxHeader)(k))&&"mfra"===y.name))return[3,15];if(!((S=this.reader.requestSlice(k.filePos,y.contentSize))instanceof Promise))return[3,14];return[4,S];case 13:S=p.sent(),p.label=14;case 14:S&&this.readContiguousBoxes(S),p.label=15;case 15:return[2]}})}).call(this)}},{key:"getSampleTableForTrack",value:function(e){if(e.sampleTable)return e.sampleTable;var r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,_.assert)(this.moovSlice);var n=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(n),this.currentTrack=null,(null==(a=e.info)?void 0:a.type)==="audio"&&e.info.codec&&m.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,_.assert)((null==(i=e.info)?void 0:i.type)==="audio");for(var a,i,s=(0,m.parsePcmCodec)(e.info.codec),o=[],c=[],u=0;u0){r.presentationTimestamps=[];var E=!0,j=!1,P=void 0;try{for(var C,A=r.sampleTimingEntries[Symbol.iterator]();!(E=(C=A.next()).done);E=!0)for(var B=C.value,M=0;M0){M.languageCode="";for(var O=0;O<3;O++)M.languageCode=String.fromCharCode(96+(31&U))+M.languageCode,U>>=5;(0,_.isIso639Dash2LanguageCode)(M.languageCode)||(M.languageCode=_.UNDETERMINED_LANGUAGE)}break;case"hdlr":var L=this.currentTrack;if(!L)break;e.skip(8);var N=(0,T.readAscii)(e,4);"vide"===N?L.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===N&&(L.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null});break;case"stbl":var V=this.currentTrack;if(!V)break;V.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(a,n.contentSize));break;case"stsd":var z=this.currentTrack;if(!z||null===z.info||z.sampleTable)break;var H=(0,T.readU8)(e);e.skip(3);for(var G=(0,T.readU32Be)(e),q=0;q0){if(1===Q)e.skip(4),Y=8*(0,T.readU32Be)(e),e.skip(8);else if(2===Q){e.skip(4),J=(0,T.readF64Be)(e),Z=(0,T.readU32Be)(e),e.skip(4),Y=(0,T.readU32Be)(e);var $=(0,T.readU32Be)(e);if(e.skip(8),"lpcm"===X){var ee=Y+7>>3,et=!!(1&$),er=!!(2&$),en=4&$?-1:0;Y>0&&Y<=64&&(et?32===Y&&(z.info.codec=er?"pcm-f32be":"pcm-f32"):en&1<>4,chromaSubsampling:el>>1&7,videoFullRangeFlag:1&el,colourPrimaries:ed,transferCharacteristics:ef,matrixCoefficients:eh};break;case"av1C":var ep,em=this.currentTrack;if(!em)break;(0,_.assert)((null==(ep=em.info)?void 0:ep.type)==="video"),e.skip(1);var eg=(0,T.readU8)(e),ev=eg>>5,eb=(0,T.readU8)(e),ek=eb>>6&1;em.info.av1CodecInfo={profile:ev,level:31&eg,tier:eb>>7,bitDepth:2===ev&&ek?eb>>5&1?12:10:ek?10:8,monochrome:eb>>4&1,chromaSubsamplingX:eb>>3&1,chromaSubsamplingY:eb>>2&1,chromaSamplePosition:3&eb};break;case"colr":var e_,ey=this.currentTrack;if(!ey||((0,_.assert)((null==(e_=ey.info)?void 0:e_.type)==="video"),"nclx"!==(0,T.readAscii)(e,4)))break;var eS=(0,T.readU16Be)(e),ew=(0,T.readU16Be)(e),eT=(0,T.readU16Be)(e),ex=!!(128&(0,T.readU8)(e));ey.info.colorSpace={primaries:_.COLOR_PRIMARIES_MAP_INVERSE[eS],transfer:_.TRANSFER_CHARACTERISTICS_MAP_INVERSE[ew],matrix:_.MATRIX_COEFFICIENTS_MAP_INVERSE[eT],fullRange:ex};break;case"esds":var eI,eE=this.currentTrack;if(!eE)break;(0,_.assert)((null==(eI=eE.info)?void 0:eI.type)==="audio"),e.skip(4);var ej=(0,T.readU8)(e);(0,_.assert)(3===ej),(0,w.readIsomVariableInteger)(e),e.skip(2);var eP=(0,T.readU8)(e);if((128&eP)!=0&&e.skip(2),(64&eP)!=0){var eC=(0,T.readU8)(e);e.skip(eC)}(32&eP)!=0&&e.skip(2);var eA=(0,T.readU8)(e);(0,_.assert)(4===eA);var eB=(0,w.readIsomVariableInteger)(e),eM=e.filePos,eD=(0,T.readU8)(e);if(64===eD||103===eD?(eE.info.codec="aac",eE.info.aacCodecInfo={isMpeg2:103===eD}):105===eD||107===eD?eE.info.codec="mp3":221===eD?eE.info.codec="vorbis":console.warn("Unsupported audio codec (objectTypeIndication ".concat(eD,") - discarding track.")),e.skip(12),eB>e.filePos-eM){var eF=(0,T.readU8)(e);(0,_.assert)(5===eF);var eR=(0,w.readIsomVariableInteger)(e);if(eE.info.codecDescription=(0,T.readBytes)(e,eR),"aac"===eE.info.codec){var eU=(0,m.parseAacAudioSpecificConfig)(eE.info.codecDescription);null!==eU.numberOfChannels&&(eE.info.numberOfChannels=eU.numberOfChannels),null!==eU.sampleRate&&(eE.info.sampleRate=eU.sampleRate)}}break;case"enda":var eO,eL=this.currentTrack;if(!eL)break;(0,_.assert)((null==(eO=eL.info)?void 0:eO.type)==="audio"),255&(0,T.readU16Be)(e)&&("pcm-s16be"===eL.info.codec?eL.info.codec="pcm-s16":"pcm-s24be"===eL.info.codec?eL.info.codec="pcm-s24":"pcm-s32be"===eL.info.codec?eL.info.codec="pcm-s32":"pcm-f32be"===eL.info.codec?eL.info.codec="pcm-f32":"pcm-f64be"===eL.info.codec&&(eL.info.codec="pcm-f64"));break;case"pcmC":var eN,eV=this.currentTrack;if(!eV)break;(0,_.assert)((null==(eN=eV.info)?void 0:eN.type)==="audio"),e.skip(4);var ez=!!(1&(0,T.readU8)(e)),eH=(0,T.readU8)(e);"pcm-s16be"===eV.info.codec?ez?16===eH?eV.info.codec="pcm-s16":24===eH?eV.info.codec="pcm-s24":32===eH?eV.info.codec="pcm-s32":(console.warn("Invalid ipcm sample size ".concat(eH,".")),eV.info.codec=null):16===eH?eV.info.codec="pcm-s16be":24===eH?eV.info.codec="pcm-s24be":32===eH?eV.info.codec="pcm-s32be":(console.warn("Invalid ipcm sample size ".concat(eH,".")),eV.info.codec=null):"pcm-f32be"===eV.info.codec&&(ez?32===eH?eV.info.codec="pcm-f32":64===eH?eV.info.codec="pcm-f64":(console.warn("Invalid fpcm sample size ".concat(eH,".")),eV.info.codec=null):32===eH?eV.info.codec="pcm-f32be":64===eH?eV.info.codec="pcm-f64be":(console.warn("Invalid fpcm sample size ".concat(eH,".")),eV.info.codec=null));break;case"dOps":var eG,eq,eW=this.currentTrack;if(!eW)break;(0,_.assert)((null==(eG=eW.info)?void 0:eG.type)==="audio"),e.skip(1);var eK=(0,T.readU8)(e),eX=(0,T.readU16Be)(e),eQ=(0,T.readU32Be)(e),eZ=(0,T.readI16Be)(e),eY=(0,T.readU8)(e);eq=0!==eY?(0,T.readBytes)(e,2+eK):new Uint8Array(0);var eJ=new Uint8Array(19+eq.byteLength),e$=new DataView(eJ.buffer);e$.setUint32(0,0x4f707573,!1),e$.setUint32(4,0x48656164,!1),e$.setUint8(8,1),e$.setUint8(9,eK),e$.setUint16(10,eX,!0),e$.setUint32(12,eQ,!0),e$.setInt16(16,eZ,!0),e$.setUint8(18,eY),eJ.set(eq,19),eW.info.codecDescription=eJ,eW.info.numberOfChannels=eK;break;case"dfLa":var e0,e1=this.currentTrack;if(!e1)break;(0,_.assert)((null==(e0=e1.info)?void 0:e0.type)==="audio"),e.skip(4);for(var e2=e.filePos;e.filePos>>12,e5=(e8>>9&7)+1;e1.info.sampleRate=e6,e1.info.numberOfChannels=e5,e.skip(20)}else e.skip(e4);if(128&e3)break}var e7=e.filePos;e.filePos=e2;var e9=(0,T.readBytes)(e,e7-e2),te=new Uint8Array(4+e9.byteLength);new DataView(te.buffer).setUint32(0,0x664c6143,!1),te.set(e9,4),e1.info.codecDescription=te;break;case"stts":var tt=this.currentTrack;if(!tt||!tt.sampleTable)break;e.skip(4);for(var tr=(0,T.readU32Be)(e),tn=0,ta=0,ti=0;ti>4],t8=t3[(12&t2)>>2],t6=t3[3&t2],t5=(0,T.readU32Be)(e),t7=0;t70&&(null!=(nD=this.metadataTags).trackNumber||(nD.trackNumber=nU)),nO&&Number.isInteger(nO)&&nO>0&&(null!=(nF=this.metadataTags).tracksTotal||(nF.tracksTotal=nO))}break;case"trkn":if(nb instanceof Uint8Array&&nb.length>=6){var nL,nN,nV=(0,_.toDataView)(nb),nz=nV.getUint16(2,!1),nH=nV.getUint16(4,!1);nz>0&&(null!=(nL=this.metadataTags).trackNumber||(nL.trackNumber=nz)),nH>0&&(null!=(nN=this.metadataTags).tracksTotal||(nN.tracksTotal=nH))}break;case"disc":case"disk":if(nb instanceof Uint8Array&&nb.length>=6){var nG,nq,nW=(0,_.toDataView)(nb),nK=nW.getUint16(2,!1),nX=nW.getUint16(4,!1);nK>0&&(null!=(nG=this.metadataTags).discNumber||(nG.discNumber=nK)),nX>0&&(null!=(nq=this.metadataTags).discsTotal||(nq.discsTotal=nX))}}}}catch(e){nu=!0,nl=e}finally{try{nc||null==nf.return||nf.return()}finally{if(nu)throw nl}}}return e.filePos=i,!0}}]),r}(b.Demuxer),E=function(){"use strict";function e(r){(0,c._)(this,e),this.internalTrack=r,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}return(0,u._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.internalCodecId}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getTimeResolution",value:function(){return this.internalTrack.timescale}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,p._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){var e,r;return(0,p._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){var r,n;return(0,p._)(this,function(a){switch(a.label){case 0:return r=this,[4,this.fetchPacketForSampleIndex(0,e)];case 1:if((n=a.sent())||!this.internalTrack.demuxer.isFragmented)return[2,n];return[2,this.performFragmentedLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,e)]}})}).call(this)}},{key:"mapTimestampIntoTimescale",value:function(e){return(0,_.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,p._)(this,function(c){switch(c.label){case 0:return n=this,a=this.mapTimestampIntoTimescale(e),s=C(i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a),[4,this.fetchPacketForSampleIndex(s,r)];case 1:if(o=c.sent(),!R(i)||!this.internalTrack.demuxer.isFragmented)return[2,o];return[2,this.performFragmentedLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};var i=(0,_.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.presentationTimestamp});return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&as.sampleIndex});if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{var a=e.trackData.get(n.internalTrack.id);if(a&&null!==a.firstKeyFrameTimestamp){var i=a.samples.findIndex(function(e){return e.isKeyFrame});return(0,_.assert)(-1!==i),{sampleIndex:i,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketForSampleIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c;return(0,p._)(this,function(u){switch(u.label){case 0:if(-1===e||!(n=B(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e)))return[2,null];if(!r.metadataOnly)return[3,1];return a=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.internalTrack.demuxer.reader.requestSlice(n.sampleOffset,n.sampleSize))instanceof Promise))return[3,3];return[4,i];case 2:i=u.sent(),u.label=3;case 3:(0,_.assert)(i),a=(0,T.readBytes)(i,n.sampleSize),u.label=4;case 4:return s=(n.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=n.duration/this.internalTrack.timescale,c=new(0,y.EncodedPacket)(a,n.isKeyFrame?"key":"delta",s,o,e,n.sampleSize),this.packetToSampleIndex.set(c,e),[2,c]}})}).call(this)}},{key:"fetchPacketInFragment",value:function(e,r,n){return(0,s._)(function(){var a,i,s,o,c,u;return(0,p._)(this,function(l){switch(l.label){case 0:if(-1===r)return[2,null];if(a=e.trackData.get(this.internalTrack.id).samples[r],(0,_.assert)(a),!n.metadataOnly)return[3,1];return i=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((s=this.internalTrack.demuxer.reader.requestSlice(a.byteOffset,a.byteSize))instanceof Promise))return[3,3];return[4,s];case 2:s=l.sent(),l.label=3;case 3:(0,_.assert)(s),i=(0,T.readBytes)(s,a.byteSize),l.label=4;case 4:return o=(a.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,c=a.duration/this.internalTrack.timescale,u=new(0,y.EncodedPacket)(i,a.isKeyFrame?"key":"delta",o,c,e.moofOffset+r,a.byteSize),this.packetToFragmentLocation.set(u,{fragment:e,sampleIndex:r}),[2,u]}})}).call(this)}},{key:"performFragmentedLookup",value:function(e,r,n,a,i){return(0,s._)(function(){var s,o,c,u,l,d,f,h,m,g,b,k,y,S,T,x,I,E,j,P,C,A,B;return(0,p._)(this,function(p){switch(p.label){case 0:if(s=this.internalTrack.demuxer,o=null,c=null,u=-1,e){if(d=(l=r(e)).sampleIndex,l.correctSampleFound)return[2,this.fetchPacketInFragment(e,d,i)];-1!==d&&(c=e,u=d)}h=-1!==(f=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,n,function(e){return e.timestamp}))?this.internalTrack.fragmentLookupTable[f]:null,g=-1!==(m=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.fragmentPositionCache[m]:null,y=Math.max(null!=(b=null==h?void 0:h.moofOffset)?b:0,null!=(k=null==g?void 0:g.moofOffset)?k:0)||null,e?null===y||e.moofOffset>=y?(S=e.moofOffset+e.moofSize,o=e):S=y:S=null!=y?y:0,p.label=1;case 1:if(o&&(T=o.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,6];if(!((x=s.reader.requestSliceRange(S,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=p.sent(),p.label=3;case 3:if(!x||(I=S,!(E=(0,w.readBoxHeader)(x))))return[3,6];if("moof"!==E.name)return[3,5];return[4,s.readFragment(I)];case 4:if(P=(j=r(o=p.sent())).sampleIndex,j.correctSampleFound)return[2,this.fetchPacketInFragment(o,P,i)];-1!==P&&(c=o,u=P),p.label=5;case 5:return S=I+E.totalSize,[3,1];case 6:if(h&&(!c||c.moofOffset=0;a--){var i=e.presentationTimestamps[a].sampleIndex;if(-1!==(0,_.binarySearchExact)(e.keySampleIndices,i,function(e){return e}))return i}return -1}var s,o=C(e,r),c=(0,_.binarySearchLessOrEqual)(e.keySampleIndices,o,function(e){return e});return null!=(s=e.keySampleIndices[c])?s:-1},B=function(e,r){var n=(0,_.binarySearchLessOrEqual)(e.sampleTimingEntries,r,function(e){return e.startIndex}),a=e.sampleTimingEntries[n];if(!a||a.startIndex+a.count<=r)return null;var i=a.startDecodeTimestamp+(r-a.startIndex)*a.delta,s=(0,_.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,function(e){return e.startIndex}),o=e.sampleCompositionTimeOffsets[s];o&&r-o.startIndex0&&a>n){var o=e.subarray(n,a);o.length>0&&r.push(o)}n=a+i}if(n0&&r.push(c)}return r},b=function(e,r){for(var n=[],a=0,i=new DataView(e.buffer,e.byteOffset,e.byteLength);a+r<=e.length;){var s=void 0;1===r?s=i.getUint8(a):2===r?s=i.getUint16(a,!1):3===r?s=(0,m.getUint24)(i,a,!1):4===r?s=i.getUint32(a,!1):((0,m.assertNever)(r),(0,m.assert)(!1)),a+=r;var o=e.subarray(a,a+s);n.push(o),a+=s}return n},k=function(e){for(var r=[],n=e.length,a=0;a>8),r.push(255&u);for(var l=0;l>8),r.push(255&k);for(var _=0;_>8),r.push(255&E);for(var j=0;j>1&63},P=function(e){try{var r=g(e),n=r.filter(function(e){return j(e)===u.VPS_NUT}),a=r.filter(function(e){return j(e)===u.SPS_NUT}),i=r.filter(function(e){return j(e)===u.PPS_NUT}),s=r.filter(function(e){return j(e)===u.PREFIX_SEI_NUT||j(e)===u.SUFFIX_SEI_NUT});if(0===a.length||0===i.length)return null;var o=a[0],c=new(0,m.Bitstream)(k(o));c.skipBits(16),c.readBits(4);var l=c.readBits(3),d=c.readBits(1),h=C(c,l),p=h.general_profile_space,b=h.general_tier_flag,_=h.general_profile_idc,y=h.general_profile_compatibility_flags,S=h.general_constraint_indicator_flags,w=h.general_level_idc;(0,m.readExpGolomb)(c);var T=(0,m.readExpGolomb)(c);3===T&&c.skipBits(1),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.readBits(1)&&((0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c));var x=(0,m.readExpGolomb)(c),I=(0,m.readExpGolomb)(c);(0,m.readExpGolomb)(c);for(var E=c.readBits(1)?0:l,P=E;P<=l;P++)(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c);(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.readBits(1)&&c.readBits(1)&&A(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&(c.skipBits(4),c.skipBits(4),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.skipBits(1));var M=(0,m.readExpGolomb)(c);if(B(c,M),c.readBits(1))for(var F=(0,m.readExpGolomb)(c),R=0;R0){var L=i[0],N=new(0,m.Bitstream)(k(L));N.skipBits(16),(0,m.readExpGolomb)(N),(0,m.readExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(3),N.skipBits(1),N.skipBits(1),(0,m.readExpGolomb)(N),(0,m.readExpGolomb)(N),(0,m.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.readBits(1)&&(0,m.readExpGolomb)(N),(0,m.readSignedExpGolomb)(N),(0,m.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(1),N.skipBits(1);var V=N.readBits(1),z=N.readBits(1);O=V||z?V&&!z?2:!V&&z?3:0:0}var H=(0,f._)(n.length?[{arrayCompleteness:1,nalUnitType:u.VPS_NUT,nalUnits:n}]:[]).concat((0,f._)(a.length?[{arrayCompleteness:1,nalUnitType:u.SPS_NUT,nalUnits:a}]:[]),(0,f._)(i.length?[{arrayCompleteness:1,nalUnitType:u.PPS_NUT,nalUnits:i}]:[]),(0,f._)(s.length?[{arrayCompleteness:1,nalUnitType:j(s[0]),nalUnits:s}]:[]));return{configurationVersion:1,generalProfileSpace:p,generalTierFlag:b,generalProfileIdc:_,generalProfileCompatibilityFlags:y,generalConstraintIndicatorFlags:S,generalLevelIdc:w,minSpatialSegmentationIdc:U,parallelismType:O,chromaFormatIdc:T,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:l+1,temporalIdNested:d,lengthSizeMinusOne:3,arrays:H}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},C=function(e,r){for(var n=e.readBits(2),a=e.readBits(1),i=e.readBits(5),s=0,o=0;o<32;o++)s=s<<1|e.readBits(1);for(var c=new Uint8Array(6),u=0;u<6;u++)c[u]=e.readBits(8);for(var l=e.readBits(8),d=[],f=[],h=0;h0)for(var p=r;p<8;p++)e.skipBits(2);for(var m=0;m1&&(0,m.readSignedExpGolomb)(e);for(var i=0;i>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push.apply(r,(0,f._)(e.generalConstraintIndicatorFlags)),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length);var n=!0,a=!1,i=void 0;try{for(var s,o=e.arrays[Symbol.iterator]();!(n=(s=o.next()).done);n=!0){var c=s.value;r.push((1&c.arrayCompleteness)<<7|63&c.nalUnitType),r.push(c.nalUnits.length>>8&255),r.push(255&c.nalUnits.length);var u=!0,l=!1,d=void 0;try{for(var h,p=c.nalUnits[Symbol.iterator]();!(u=(h=p.next()).done);u=!0){var m=h.value;r.push(m.length>>8&255),r.push(255&m.length);for(var g=0;g=2&&(i=r.readBits(1)?12:10);var s=r.readBits(3),o=0,c=0;if(7!==s)if(c=r.readBits(1),1===a||3===a){var u=r.readBits(1),l=r.readBits(1);o=u||l?u&&!l?2:1:3,r.skipBits(1)}else o=1;else o=3,c=1;var d=(r.readBits(16)+1)*(r.readBits(16)+1),f=(0,m.last)(p.VP9_LEVEL_TABLE).level,h=!0,g=!1,b=void 0;try{for(var k,_=p.VP9_LEVEL_TABLE[Symbol.iterator]();!(h=(k=_.next()).done);h=!0){var y=k.value;if(d<=y.maxPictureSize){f=y.level;break}}}catch(e){g=!0,b=e}finally{try{h||null==_.return||_.return()}finally{if(g)throw b}}return{profile:a,level:f,bitDepth:i,chromaSubsampling:o,videoFullRangeFlag:c,colourPrimaries:2===s?1:1===s?6:2,transferCharacteristics:2===s?1:1===s?6:2,matrixCoefficients:7===s?0:2===s?1:1===s?6:2}},L=function(e){var r,n,a,i,s,o,c;return(0,h._)(this,function(u){switch(u.label){case 0:r=new(0,m.Bitstream)(e),n=function(){for(var e=0,n=0;n<8;n++){var a=r.readAlignedByte();if(e|=(127&a)<<7*n,!(128&a))break;if(7===n&&128&a)return null}return e>=0xffffffff?null:e},u.label=1;case 1:if(!(r.getBitsLeft()>=8))return[3,3];if(r.skipBits(1),a=r.readBits(4),i=r.readBits(1),s=r.readBits(1),r.skipBits(1),i&&r.skipBits(8),o=void 0,s){if(null===(c=n()))return[2];o=c}else o=Math.floor(r.getBitsLeft()/8);return(0,m.assert)(r.pos%8==0),[4,{type:a,data:e.subarray(r.pos/8,r.pos/8+o)}];case 2:return u.sent(),r.skipBits(8*o),[3,1];case 3:return[2]}})},N=function(e){var r=!0,n=!1,a=void 0;try{for(var i,s=L(e)[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value,c=o.type,u=o.data;if(1===c){var l=new(0,m.Bitstream)(u),d=l.readBits(3);l.readBits(1);var f=l.readBits(1),h=0,p=0,g=0;if(f)h=l.readBits(5);else{if(l.readBits(1)&&(l.skipBits(32),l.skipBits(32),l.readBits(1)))return null;var b=l.readBits(1);b&&(g=l.readBits(5),l.skipBits(32),l.skipBits(5),l.skipBits(5));for(var k=l.readBits(5),_=0;_<=k;_++){l.skipBits(12);var y=l.readBits(5);if(0===_&&(h=y),y>7){var S=l.readBits(1);0===_&&(p=S)}if(b&&l.readBits(1)){var w=g+1;l.skipBits(w),l.skipBits(w),l.skipBits(1)}l.readBits(1)&&l.skipBits(4)}}var T=l.readBits(4),x=l.readBits(4),I=T+1;l.skipBits(I);var E=x+1;l.skipBits(E);if((f?0:l.readBits(1))&&(l.skipBits(4),l.skipBits(3)),l.skipBits(1),l.skipBits(1),l.skipBits(1),!f){l.skipBits(1),l.skipBits(1),l.skipBits(1),l.skipBits(1);var j=l.readBits(1);j&&(l.skipBits(1),l.skipBits(1));var P=l.readBits(1);(P?2:l.readBits(1))>0&&(l.readBits(1)||l.skipBits(1)),j&&l.skipBits(3)}l.skipBits(1),l.skipBits(1),l.skipBits(1);var C=l.readBits(1),A=8;2===d&&C?A=l.readBits(1)?12:10:d<=2&&(A=C?10:8);var B=0;1!==d&&(B=l.readBits(1));var M=1,D=1,F=0;return!B&&(0===d?(M=1,D=1):1===d?(M=0,D=0):12===A&&(M=l.readBits(1))&&(D=l.readBits(1)),M&&D&&(F=l.readBits(2))),{profile:d,level:h,tier:p,bitDepth:A,monochrome:B,chromaSubsamplingX:M,chromaSubsamplingY:D,chromaSamplePosition:F}}}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}return null},V=function(e){var r=(0,m.toDataView)(e),n=r.getUint8(9),a=r.getUint16(10,!0),i=r.getUint32(12,!0),s=r.getInt16(16,!0),o=r.getUint8(18),c=null;return o&&(c=e.subarray(19,21+n)),{outputChannelCount:n,preSkip:a,inputSampleRate:i,outputGain:s,channelMappingFamily:o,channelMappingTable:c}},z=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],H=function(e){return{durationInSamples:z[e[0]>>3]}},G=function(e){if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==(r=String).fromCharCode.apply(r,(0,f._)(e.slice(1,7))))throw Error("Invalid packet signature in Setup header.");for(var r,n=e.length,a=new Uint8Array(n),i=0;i97;)if(1===s.readBits(1)){o=s.pos;break}if(0===o)throw Error("Invalid Setup header: framing bit not found.");for(var c=0,u=!1,l=0;s.getBitsLeft()>=97;){var d=s.pos,h=s.readBits(8),p=s.readBits(16),g=s.readBits(16);if(h>63||0!==p||0!==g){s.pos=d;break}if(s.skipBits(1),++c>64)break;s.clone().readBits(6)+1===c&&(u=!0,l=c)}if(!u)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error("Unsupported mode count: ".concat(l,"."));var b=l;s.pos=0,s.skipBits(o);for(var k=Array(b).fill(0),_=b-1;_>=0;_--)s.skipBits(40),k[_]=s.readBits(1);return{modeBlockflags:k}},q=function(e,r,n){switch(e){case"avc":var a=y(n,r),i=a.some(function(e){return S(e)===c.IDR}),s=!0,o=!1,l=void 0;if(!i&&(!(0,m.isChromium)()||(0,m.getChromiumVersion)()>=144))try{for(var d,f=a[Symbol.iterator]();!(s=(d=f.next()).done);s=!0){var h=d.value;if(S(h)===c.SEI){var p=k(h),g=1;do{for(var b=0;;){var _=p[g++];if(void 0===_||(b+=_,_<255))break}for(var w=0;;){var T=p[g++];if(void 0===T||(w+=T,T<255))break}if(6===b){var x=new(0,m.Bitstream)(p);x.pos=8*g;var I=(0,m.readExpGolomb)(x),P=x.readBits(1);if(0===I&&1===P){i=!0;break}}g+=w}while(g0&&(null!=r.raw||(r.raw={}),null!=(g=r.raw)[b="vendor"]||(g[b]=s));var o=n.getUint32(a,!0);a+=4;for(var c=0;c0&&(null!=r.trackNumber||(r.trackNumber=y)),S&&Number.isInteger(S)&&S>0&&(null!=r.tracksTotal||(r.tracksTotal=S));break;case"TRACKTOTAL":var w=Number.parseInt(p,10);Number.isInteger(w)&&w>0&&(null!=r.tracksTotal||(r.tracksTotal=w));break;case"DISCNUMBER":var T=p.split("/"),x=Number.parseInt(T[0],10),I=T[1]&&Number.parseInt(T[1],10);Number.isInteger(x)&&x>0&&(null!=r.discNumber||(r.discNumber=x)),I&&Number.isInteger(I)&&I>0&&(null!=r.discsTotal||(r.discsTotal=I));break;case"DISCTOTAL":var E=Number.parseInt(p,10);Number.isInteger(E)&&E>0&&(null!=r.discsTotal||(r.discsTotal=E));break;case"DATE":var j=new Date(p);Number.isNaN(j.getTime())||null!=r.date||(r.date=j);break;case"GENRE":null!=r.genre||(r.genre=p);break;case"METADATA_BLOCK_PICTURE":var P,C=(0,m.base64ToBytes)(p),A=(0,m.toDataView)(C),B=A.getUint32(0,!1),M=A.getUint32(4,!1),D=(P=String).fromCharCode.apply(P,(0,f._)(C.subarray(8,8+M))),F=A.getUint32(8+M,!1),R=m.textDecoder.decode(C.subarray(12+M,12+M+F)),U=A.getUint32(M+F+28),O=C.subarray(M+F+32,M+F+32+U);null!=r.images||(r.images=[]),r.images.push({data:O,mimeType:D,kind:3===B?"coverFront":4===B?"coverBack":"unknown",name:void 0,description:R||void 0})}}}},K=function(e,r,n){var a=[e],i=m.textEncoder.encode("Mediabunny"),s=new Uint8Array(4+i.length),o=new DataView(s.buffer);o.setUint32(0,i.length,!0),s.set(i,4),a.push(s);var c=new Set,u=function(e,r){var n="".concat(e,"=").concat(r),i=m.textEncoder.encode(n);(o=new DataView((s=new Uint8Array(4+i.length)).buffer)).setUint32(0,i.length,!0),s.set(i,4),a.push(s),c.add(e)},l=!0,d=!1,f=void 0;try{for(var h,p=(0,m.keyValueIterator)(r)[Symbol.iterator]();!(l=(h=p.next()).done);l=!0){var g=h.value,b=g.key,k=g.value;switch(b){case"title":u("TITLE",k);break;case"description":u("DESCRIPTION",k);break;case"artist":u("ARTIST",k);break;case"album":u("ALBUM",k);break;case"albumArtist":u("ALBUMARTIST",k);break;case"genre":u("GENRE",k);break;case"date":var _,y,S,w=null!=(S=null==(_=r.raw)?void 0:_.DATE)?S:null==(y=r.raw)?void 0:y.date;u("DATE",w&&"string"==typeof w?w:k.toISOString().slice(0,10));break;case"comment":u("COMMENT",k);break;case"lyrics":u("LYRICS",k);break;case"trackNumber":u("TRACKNUMBER",k.toString());break;case"tracksTotal":u("TRACKTOTAL",k.toString());break;case"discNumber":u("DISCNUMBER",k.toString());break;case"discsTotal":u("DISCTOTAL",k.toString());break;case"images":if(!n)break;var T=!0,x=!1,I=void 0;try{for(var E,j=k[Symbol.iterator]();!(T=(E=j.next()).done);T=!0){for(var P,C=E.value,A="coverFront"===C.kind?3:4*("coverBack"===C.kind),B=new Uint8Array(C.mimeType.length),M=0;M0&&void 0!==b[0]?b[0]:1/0,r=new(0,m.EncodedPacketSink)(this),n=1/0,a=-1/0,i=0,o=0,c=!1,u=!1,f.label=1;case 1:f.trys.push([1,6,7,12]),d=(0,s._)(r.packets(void 0,void 0,{metadataOnly:!0})),f.label=2;case 2:return[4,d.next()];case 3:if(!(c=!(h=f.sent()).done)||(p=h.value,i>=e&&p.timestamp>=a))return[3,5];n=Math.min(n,p.timestamp),a=Math.max(a,p.timestamp+p.duration),i++,o+=p.byteLength,f.label=4;case 4:return c=!1,[3,2];case 5:return[3,12];case 6:return g=f.sent(),u=!0,l=g,[3,12];case 7:if(f.trys.push([7,,10,11]),!(c&&null!=d.return))return[3,9];return[4,d.return()];case 8:f.sent(),f.label=9;case 9:return[3,11];case 10:if(u)throw l;return[7];case 11:return[7];case 12:return[2,{packetCount:i,averagePacketRate:i?Number((i/(a-n)).toPrecision(16)):0,averageBitrate:i?Number((8*o/(a-n)).toPrecision(16)):0}]}})}).apply(this,arguments)}}]),e}(),_=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"video"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"codedWidth",get:function(){return this._backing.getCodedWidth()}},{key:"codedHeight",get:function(){return this._backing.getCodedHeight()}},{key:"rotation",get:function(){return this._backing.getRotation()}},{key:"displayWidth",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}},{key:"displayHeight",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}},{key:"getColorSpace",value:function(){return this._backing.getColorSpace()}},{key:"hasHighDynamicRange",value:function(){return(0,o._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this._backing.getColorSpace()];case 1:return[2,"bt2020"===(e=r.sent()).primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix]}})}).call(this)}},{key:"canBeTransparent",value:function(){return this._backing.canBeTransparent()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,,4]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),p.customVideoDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if("undefined"==typeof VideoDecoder)return[2,!1];return[4,VideoDecoder.isConfigSupported(e)];case 2:return[2,!0===n.sent().supported];case 3:return console.error("Error during decodability check:",n.sent()),[2,!1];case 4:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){var r;return(0,f._)(this,function(n){switch(n.label){case 0:if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return[2,null];return[4,this.getDecoderConfig()];case 1:return r=n.sent(),(0,g.assert)(r),[2,(0,h.determineVideoPacketType)(this.codec,r,e.data)]}})}).call(this)}}]),r}(k),y=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"audio"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"numberOfChannels",get:function(){return this._backing.getNumberOfChannels()}},{key:"sampleRate",get:function(){return this._backing.getSampleRate()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,5,,6]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),p.customAudioDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if(!e.codec.startsWith("pcm-"))return[3,2];return[2,!0];case 2:if("undefined"==typeof AudioDecoder)return[2,!1];return[4,AudioDecoder.isConfigSupported(e)];case 3:return[2,!0===n.sent().supported];case 4:return[3,6];case 5:return console.error("Error during decodability check:",n.sent()),[2,!1];case 6:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){return(0,f._)(this,function(r){if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?[2,null]:[2,"key"]})}).call(this)}}]),r}(k)},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./media-sink.js":"k0V9R","./misc.js":"j7iGm","./packet.js":"QfqGG","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hAl48:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"CustomVideoDecoder",function(){return c}),i.export(n,"CustomAudioDecoder",function(){return u}),i.export(n,"CustomVideoEncoder",function(){return l}),i.export(n,"CustomAudioEncoder",function(){return d}),i.export(n,"customVideoDecoders",function(){return f}),i.export(n,"customAudioDecoders",function(){return h}),i.export(n,"customVideoEncoders",function(){return p}),i.export(n,"customAudioEncoders",function(){return m}),i.export(n,"registerDecoder",function(){return g}),i.export(n,"registerEncoder",function(){return b});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),u=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),l=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),d=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),f=[],h=[],p=[],m=[],g=function(e){if(e.prototype instanceof c){if(f.includes(e))return void console.warn("Video decoder already registered.");f.push(e)}else if(e.prototype instanceof u){if(h.includes(e))return void console.warn("Audio decoder already registered.");h.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},b=function(e){if(e.prototype instanceof l){if(p.includes(e))return void console.warn("Video encoder already registered.");p.push(e)}else if(e.prototype instanceof d){if(m.includes(e))return void console.warn("Audio encoder already registered.");m.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],k0V9R:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"EncodedPacketSink",function(){return A}),i.export(n,"BaseMediaSampleSink",function(){return M}),i.export(n,"VideoSampleSink",function(){return U}),i.export(n,"CanvasSink",function(){return O}),i.export(n,"AudioSampleSink",function(){return V}),i.export(n,"AudioBufferSink",function(){return z});var s=e("@swc/helpers/cjs/_async_iterator.cjs"),o=e("@swc/helpers/cjs/_async_to_generator.cjs"),c=e("@swc/helpers/cjs/_call_super.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),p=e("@swc/helpers/cjs/_object_spread_props.cjs"),m=e("@swc/helpers/cjs/_sliced_to_array.cjs"),g=e("@swc/helpers/cjs/_type_of.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("./codec.js"),_=e("./codec-data.js"),y=e("./custom-coder.js"),S=e("./input.js"),w=e("./input-track.js"),T=e("./misc.js"),x=e("./packet.js"),I=e("./pcm.js"),E=e("./sample.js"),j=function(e){if(!e||(void 0===e?"undefined":(0,g._)(e))!=="object")throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},P=function(e){if(!(0,T.isNumber)(e))throw TypeError("timestamp must be a number.")},C=function(e,r,n){return n.verifyKeyPackets?r.then(function(r){return(0,o._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:if(!r||"delta"===r.type)return[2,r];return[4,e.determinePacketType(r)];case 1:return(n=a.sent())&&(r.type=n),[2,r]}})})()}):r},A=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof w.InputTrack))throw TypeError("track must be an InputTrack.");this._track=r}return(0,l._)(e,[{key:"getFirstPacket",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(j(e),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getFirstPacket(e),e)}},{key:"getPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(P(e),j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getPacket(e,r),r)}},{key:"getNextPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getNextPacket(e,r),r)}},{key:"getKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},P(e),j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getKeyPacket(e,r)];return[4,this._track._backing.getKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getKeyPacket(n.timestamp-1/this._track.timeResolution,r)];return[2,n]}})}).apply(this,arguments)}},{key:"getNextKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getNextKeyPacket(e,r)];return[4,this._track._backing.getNextKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getNextKeyPacket(n,r)];return[2,n]}})}).apply(this,arguments)}},{key:"packets",value:function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(void 0!==e&&!(e instanceof x.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!(null==n?void 0:n.metadataOnly))throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof x.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(j(n),this._track.input._disposed)throw new(0,S.InputDisposedError);var a=[],i=(0,T.promiseWithResolvers)(),s=i.promise,c=i.resolve,u=(0,T.promiseWithResolvers)(),l=u.promise,f=u.resolve,h=!1,p=!1,m=null,g=[];(0,o._)(function(){var i,o,u,d;return(0,b._)(this,function(m){switch(m.label){case 0:if(null==e)return[3,1];return o=e,[3,3];case 1:return[4,this.getFirstPacket(n)];case 2:o=m.sent(),m.label=3;case 3:i=o,m.label=4;case 4:if(!(i&&!p&&!this._track.input._disposed)||r&&i.sequenceNumber>=(null==r?void 0:r.sequenceNumber))return[3,8];if(!(a.length>Math.max(2,g.length)))return[3,6];return l=(u=(0,T.promiseWithResolvers)()).promise,f=u.resolve,[4,l];case 5:return m.sent(),[3,4];case 6:return a.push(i),c(),s=(d=(0,T.promiseWithResolvers)()).promise,c=d.resolve,[4,this.getNextPacket(i,n)];case 7:return i=m.sent(),[3,4];case 8:return h=!0,c(),[2]}})}).call(this).catch(function(e){m||(m=e,c())});var k=this._track;return(0,d._)({next:function(){return(0,o._)(function(){var e,r;return(0,b._)(this,function(n){switch(n.label){case 0:if(!k.input._disposed)return[3,1];throw new(0,S.InputDisposedError);case 1:if(!p)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!m)return[3,3];throw m;case 3:if(!(a.length>0))return[3,4];for(e=a.shift(),r=performance.now(),g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return f(),[2,{value:e,done:!1}];case 4:if(!h)return[3,5];return[2,{value:void 0,done:!0}];case 5:return[4,s];case 6:n.sent(),n.label=7;case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return p=!0,f(),c(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),B=function e(r,n){"use strict";(0,u._)(this,e),this.onSample=r,this.onError=n},M=function(){"use strict";function e(){(0,u._)(this,e)}return(0,l._)(e,[{key:"mediaSamplesInRange",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;P(e),P(r);var n=[],a=!1,i=null,s=(0,T.promiseWithResolvers)(),c=s.promise,u=s.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,p=!1,m=!1,g=!1,k=null;(0,o._)(function(){var s,o,l,d,_,y,S,w,x,I,E,j,P,C,A,B;return(0,b._)(this,function(b){switch(b.label){case 0:return s=Error(),[4,this._createDecoder(function(s){if(h(),s.timestamp>=r&&(m=!0),m)return void s.close();if(i&&(s.timestamp>e?(n.push(i),a=!0):i.close()),s.timestamp>=e&&(n.push(s),a=!0),i=a?null:s,n.length>0){var o;u(),c=(o=(0,T.promiseWithResolvers)()).promise,u=o.resolve}},function(e){k||(e.stack=s.stack,k=e,u())})];case 1:return o=b.sent(),[4,(l=this._createPacketSink()).getKeyPacket(e,{verifyKeyPackets:!0})];case 2:if(null==(d=b.sent()))return[3,3];return y=d,[3,5];case 3:return[4,l.getFirstPacket()];case 4:y=b.sent(),b.label=5;case 5:if(S=_=y,w=void 0,!(r<1/0))return[3,12];return[4,l.getPacket(r)];case 6:if(x=b.sent())return[3,7];return E=null,[3,11];case 7:if("key"!==x.type||x.timestamp!==r)return[3,8];return j=x,[3,10];case 8:return[4,l.getNextKeyPacket(x,{verifyKeyPackets:!0})];case 9:j=b.sent(),b.label=10;case 10:E=j,b.label=11;case 11:(I=E)&&(w=I),b.label=12;case 12:return[4,(P=l.packets(null!=_?_:void 0,w)).next()];case 13:b.sent(),b.label=14;case 14:if(!(S&&!m&&!this._track.input._disposed))return[3,18];if(C=D(n.length),!(n.length+o.getDecodeQueueSize()>C))return[3,16];return f=(A=(0,T.promiseWithResolvers)()).promise,h=A.resolve,[4,f];case 15:return b.sent(),[3,14];case 16:return o.decode(S),[4,P.next()];case 17:if((B=b.sent()).done)return[3,18];return S=B.value,[3,14];case 18:return[4,P.return()];case 19:if(b.sent(),!(!g&&!this._track.input._disposed))return[3,21];return[4,o.flush()];case 20:b.sent(),b.label=21;case 21:return o.close(),!a&&i&&n.push(i),p=!0,u(),[2]}})}).call(this).catch(function(e){k||(k=e,u())});var _=this._track,y=function(){null==i||i.close();var e=!0,r=!1,a=void 0;try{for(var s,o=n[Symbol.iterator]();!(e=(s=o.next()).done);e=!0)s.value.close()}catch(e){r=!0,a=e}finally{try{e||null==o.return||o.return()}finally{if(r)throw a}}};return(0,d._)({next:function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:if(!_.input._disposed)return[3,1];throw y(),new(0,S.InputDisposedError);case 1:if(!g)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!k)return[3,3];throw y(),k;case 3:if(!(n.length>0))return[3,4];return e=n.shift(),h(),[2,{value:e,done:!1}];case 4:if(p)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return g=!0,m=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}},{key:"mediaSamplesAtTimestamps",value:function(e){(0,T.validateAnyIterable)(e);var r=(0,T.toAsyncIterator)(e),n=[],a=[],i=(0,T.promiseWithResolvers)(),c=i.promise,u=i.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,p=!1,m=!1,g=null,k=function(e){var r;a.push(e),u(),c=(r=(0,T.promiseWithResolvers)()).promise,u=r.resolve};(0,o._)(function(){var e,i,c,l,d,_,y,S,w,x,I,E,j,C,A,B,M,F;return(0,b._)(this,function(R){switch(R.label){case 0:return e=Error(),[4,this._createDecoder(function(e){if(h(),m)return void e.close();for(var r=0;n.length>0&&e.timestamp-n[0]>-1e-10;)r++,n.shift();if(r>0)for(var a=0;ar&&!m))return[3,4];return f=(n=(0,T.promiseWithResolvers)()).promise,h=n.resolve,[4,f];case 3:return o.sent(),[3,2];case 4:if(m)return[3,6];return[4,c.getNextPacket(e)];case 5:return s=o.sent(),(0,T.assert)(s),i.decode(s),e=s,[3,1];case 6:return _=-1,[2]}})})()},S=function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:return[4,i.flush()];case 1:for(r.sent(),e=0;e0))return[3,4];return e=a.shift(),(0,T.assert)(void 0!==e),h(),[2,{value:e,done:!1}];case 4:if(p)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return m=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),D=function(e){return 0===e?40:8},F=function(e){"use strict";function r(e,n,a,i,s,o){(0,u._)(this,r),(l=(0,c._)(this,r,[e,n])).codec=a,l.decoderConfig=i,l.rotation=s,l.timeResolution=o,l.decoder=null,l.customDecoder=null,l.customDecoderCallSerializer=new(0,T.CallSerializer),l.customDecoderQueueSize=0,l.inputTimestamps=[],l.sampleQueue=[],l.currentPacketIndex=0,l.raslSkipped=!1,l.alphaDecoder=null,l.alphaHadKeyframe=!1,l.colorQueue=[],l.alphaQueue=[],l.merger=null,l.mergerCreationFailed=!1,l.decodedAlphaChunkCount=0,l.alphaDecoderQueueSize=0,l.nullAlphaFrameQueue=[],l.currentAlphaPacketIndex=0,l.alphaRaslSkipped=!1;var l,d=y.customVideoDecoders.find(function(e){return e.supports(a,i)});if(d)l.customDecoder=new d,l.customDecoder.codec=a,l.customDecoder.config=i,l.customDecoder.onSample=function(e){if(!(e instanceof E.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");l.finalizeAndEmitSample(e)},l.customDecoderCallSerializer.call(function(){return l.customDecoder.init()});else{var f=function(e){if(l.alphaQueue.length>0){var r=l.alphaQueue.shift();(0,T.assert)(void 0!==r),l.mergeAlpha(e,r)}else l.colorQueue.push(e)};if("avc"===a&&l.decoderConfig.description&&(0,T.isChromium)()){var m=(0,_.deserializeAvcDecoderConfigurationRecord)((0,T.toUint8Array)(l.decoderConfig.description));if(m&&m.sequenceParameterSets.length>0){var g=(0,_.parseAvcSps)(m.sequenceParameterSets[0]);g&&0===g.frameMbsOnlyFlag&&(l.decoderConfig=(0,p._)((0,h._)({},l.decoderConfig),{hardwareAcceleration:"prefer-software"}))}}l.decoder=new VideoDecoder({output:function(e){try{f(e)}catch(e){l.onError(e)}},error:n}),l.decoder.configure(l.decoderConfig)}return l}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){var e,r;return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,null!=(r=null==(e=this.alphaDecoder)?void 0:e.decodeQueueSize)?r:0))}},{key:"decode",value:function(e){var r=this;if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),(0,T.isWebKit)()||(0,T.insertSorted)(this.inputTimestamps,e.timestamp,function(e){return e}),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}},{key:"decodeAlphaData",value:function(e){var r=this;if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new R}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){var n=function(e){if(r.alphaDecoderQueueSize--,r.colorQueue.length>0){var n=r.colorQueue.shift();(0,T.assert)(void 0!==n),r.mergeAlpha(n,e)}else r.alphaQueue.push(e);for(r.decodedAlphaChunkCount++;r.nullAlphaFrameQueue.length>0&&r.nullAlphaFrameQueue[0]===r.decodedAlphaChunkCount;)if(r.nullAlphaFrameQueue.shift(),r.colorQueue.length>0){var a=r.colorQueue.shift();(0,T.assert)(void 0!==a),r.mergeAlpha(a,null)}else r.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:function(e){try{n(e)}catch(e){r.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}var a=(0,_.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===a),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(null!=a?a:e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}},{key:"pushNullAlphaFrame",value:function(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}},{key:"hasHevcRaslPicture",value:function(e){return(0,_.extractHevcNalUnits)(e,this.decoderConfig).some(function(e){var r=(0,_.extractNalUnitTypeForHevc)(e);return r===_.HevcNalUnitType.RASL_N||r===_.HevcNalUnitType.RASL_R})}},{key:"sampleHandler",value:function(e){if((0,T.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,T.last)(this.sampleQueue).timestamp){var r=!0,n=!1,a=void 0;try{for(var i,s=this.sampleQueue[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.finalizeAndEmitSample(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}this.sampleQueue.length=0}(0,T.insertSorted)(this.sampleQueue,e,function(e){return e.timestamp})}else{var c=this.inputTimestamps.shift();(0,T.assert)(void 0!==c),e.setTimestamp(c),this.finalizeAndEmitSample(e)}}},{key:"finalizeAndEmitSample",value:function(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}},{key:"mergeAlpha",value:function(e,r){if(!r){var n,a=new(0,E.VideoSample)(e);this.sampleHandler(a);return}(0,T.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();var i=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:null!=(n=e.duration)?n:void 0}),s=new(0,E.VideoSample)(i);this.sampleHandler(s)}},{key:"flush",value:function(){return(0,o._)(function(){var e,r,n,a,i,s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:if(e=this,!this.customDecoder)return[3,2];return[4,this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()})];case 1:return u.sent(),[3,4];case 2:return(0,T.assert)(this.decoder),[4,Promise.all([this.decoder.flush(),null==(r=this.alphaDecoder)?void 0:r.flush()])];case 3:u.sent(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1,u.label=4;case 4:if((0,T.isWebKit)()){n=!0,a=!1,i=void 0;try{for(s=this.sampleQueue[Symbol.iterator]();!(n=(o=s.next()).done);n=!0)c=o.value,this.finalizeAndEmitSample(c)}catch(e){a=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(a)throw i}}this.sampleQueue.length=0}return this.currentPacketIndex=0,this.raslSkipped=!1,[2]}})}).call(this)}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close(),null==(i=this.alphaDecoder)||i.close(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,null==(s=this.merger)||s.close());var r=!0,n=!1,a=void 0;try{for(var i,s,o,c=this.sampleQueue[Symbol.iterator]();!(r=(o=c.next()).done);r=!0)o.value.close()}catch(e){n=!0,a=e}finally{try{r||null==c.return||c.return()}finally{if(n)throw a}}this.sampleQueue.length=0}}]),r}(B),R=function(){"use strict";function e(){(0,u._)(this,e),"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");var r=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!r)throw Error("Couldn't acquire WebGL 2 context.");this.gl=r,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}return(0,l._)(e,[{key:"createProgram",value:function(){var e=this.createShader(this.gl.VERTEX_SHADER,"#version 300 es\n in vec2 a_position;\n in vec2 a_texCoord;\n out vec2 v_texCoord;\n \n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n "),r=this.createShader(this.gl.FRAGMENT_SHADER,"#version 300 es\n precision highp float;\n \n uniform sampler2D u_colorTexture;\n uniform sampler2D u_alphaTexture;\n in vec2 v_texCoord;\n out vec4 fragColor;\n \n void main() {\n vec3 color = texture(u_colorTexture, v_texCoord).rgb;\n float alpha = texture(u_alphaTexture, v_texCoord).r;\n fragColor = vec4(color, alpha);\n }\n "),n=this.gl.createProgram();return this.gl.attachShader(n,e),this.gl.attachShader(n,r),this.gl.linkProgram(n),n}},{key:"createShader",value:function(e,r){var n=this.gl.createShader(e);return this.gl.shaderSource(n,r),this.gl.compileShader(n),n}},{key:"createVAO",value:function(){var e=this.gl.createVertexArray();this.gl.bindVertexArray(e);var r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),n=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,n),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);var a=this.gl.getAttribLocation(this.program,"a_position"),i=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(a),this.gl.vertexAttribPointer(a,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,8),e}},{key:"createTexture",value:function(){var e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}},{key:"update",value:function(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}},{key:"close",value:function(){var e;null==(e=this.gl.getExtension("WEBGL_lose_context"))||e.loseContext(),this.gl=null}}]),e}(),U=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof w.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:return[4,this._track.canDecode()];case 1:if(!o.sent())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,a=this._track.rotation,[4,this._track.getDecoderConfig()];case 2:return i=o.sent(),s=this._track.timeResolution,(0,T.assert)(n&&i),[2,new F(e,r,n,i,a,s)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),O=function(){"use strict";function e(r){var n,a,i,s,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,u._)(this,e),this._nextCanvasIndex=0,!(r instanceof w.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(o&&(void 0===o?"undefined":(0,g._)(o))!=="object")throw TypeError("options must be an object.");if(void 0!==o.alpha&&"boolean"!=typeof o.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==o.width&&(!Number.isInteger(o.width)||o.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==o.height&&(!Number.isInteger(o.height)||o.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==o.fit&&!["fill","contain","cover"].includes(o.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==o.width&&void 0!==o.height&&void 0===o.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==o.rotation&&![0,90,180,270].includes(o.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==o.crop&&(0,E.validateCropRectangle)(o.crop,"options."),void 0!==o.poolSize&&("number"!=typeof o.poolSize||!Number.isInteger(o.poolSize)||o.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");var c=null!=(n=o.rotation)?n:r.rotation,l=(0,m._)(c%180==0?[r.codedWidth,r.codedHeight]:[r.codedHeight,r.codedWidth],2),d=l[0],f=l[1],h=o.crop;h&&(0,E.clampCropRectangle)(h,d,f);var p=(0,m._)(h?[h.width,h.height]:[d,f],2),b=p[0],k=p[1],_=b/k;void 0!==o.width&&void 0===o.height?k=Math.round((b=o.width)/_):void 0===o.width&&void 0!==o.height?b=Math.round((k=o.height)*_):void 0!==o.width&&void 0!==o.height&&(b=o.width,k=o.height),this._videoTrack=r,this._alpha=null!=(a=o.alpha)&&a,this._width=b,this._height=k,this._rotation=c,this._crop=h,this._fit=null!=(i=o.fit)?i:"fill",this._videoSampleSink=new U(r),this._canvasPool=Array.from({length:null!=(s=o.poolSize)?s:0},function(){return null})}return(0,l._)(e,[{key:"_videoSampleToWrappedCanvas",value:function(e){var r=this._canvasPool[this._nextCanvasIndex],n=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),n=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);var a=r.getContext("2d",{alpha:this._alpha||(0,T.isFirefox)()});(0,T.assert)(a),a.resetTransform(),n||(!this._alpha&&(0,T.isFirefox)()?(a.fillStyle="black",a.fillRect(0,0,this._width,this._height)):a.clearRect(0,0,this._width,this._height)),e.drawWithFit(a,{fit:this._fit,rotation:this._rotation,crop:this._crop});var i={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),i}},{key:"getCanvas",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._videoSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._videoSampleToWrappedCanvas(r)]}})}).call(this)}},{key:"canvases",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samples(r,n),function(r){return e._videoSampleToWrappedCanvas(r)})}},{key:"canvasesAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),function(e){return e&&r._videoSampleToWrappedCanvas(e)})}}]),e}(),L=function(e){"use strict";function r(e,n,a,i){(0,u._)(this,r),(s=(0,c._)(this,r,[e,n])).decoder=null,s.customDecoder=null,s.customDecoderCallSerializer=new(0,T.CallSerializer),s.customDecoderQueueSize=0,s.currentTimestamp=null;var s,o=function(r){(null===s.currentTimestamp||Math.abs(r.timestamp-s.currentTimestamp)>=r.duration)&&(s.currentTimestamp=r.timestamp);var n=s.currentTimestamp;if(s.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();var a=i.sampleRate;r.setTimestamp(Math.round(n*a)/a),e(r)},l=y.customAudioDecoders.find(function(e){return e.supports(a,i)});return l?(s.customDecoder=new l,s.customDecoder.codec=a,s.customDecoder.config=i,s.customDecoder.onSample=function(e){if(!(e instanceof E.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");o(e)},s.customDecoderCallSerializer.call(function(){return s.customDecoder.init()})):(s.decoder=new AudioDecoder({output:function(e){try{o(new(0,E.AudioSample)(e))}catch(e){s.onError(e)}},error:n}),s.decoder.configure(i)),s}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),this.decoder.decodeQueueSize)}},{key:"decode",value:function(e){var r=this;this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}},{key:"flush",value:function(){var e=this;return this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()}):((0,T.assert)(this.decoder),this.decoder.flush())}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close())}}]),r}(B),N=function(e){"use strict";function r(e,n,a){(0,u._)(this,r),(i=(0,c._)(this,r,[e,n])).decoderConfig=a,i.currentTimestamp=null,(0,T.assert)(k.PCM_AUDIO_CODECS.includes(a.codec)),i.codec=a.codec;var i,s=(0,k.parsePcmCodec)(i.codec),o=s.dataType,l=s.sampleSize,d=s.littleEndian;switch(i.inputSampleSize=l,l){case 1:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint8(r)-128}:"signed"===o?i.readInputValue=function(e,r){return e.getInt8(r)}:"ulaw"===o?i.readInputValue=function(e,r){return(0,I.fromUlaw)(e.getUint8(r))}:"alaw"===o?i.readInputValue=function(e,r){return(0,I.fromAlaw)(e.getUint8(r))}:(0,T.assert)(!1);break;case 2:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint16(r,d)-32768}:"signed"===o?i.readInputValue=function(e,r){return e.getInt16(r,d)}:(0,T.assert)(!1);break;case 3:"unsigned"===o?i.readInputValue=function(e,r){return(0,T.getUint24)(e,r,d)-8388608}:"signed"===o?i.readInputValue=function(e,r){return(0,T.getInt24)(e,r,d)}:(0,T.assert)(!1);break;case 4:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint32(r,d)-0x80000000}:"signed"===o?i.readInputValue=function(e,r){return e.getInt32(r,d)}:"float"===o?i.readInputValue=function(e,r){return e.getFloat32(r,d)}:(0,T.assert)(!1);break;case 8:"float"===o?i.readInputValue=function(e,r){return e.getFloat64(r,d)}:(0,T.assert)(!1);break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}switch(l){case 1:"ulaw"===o||"alaw"===o?(i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)}):(i.outputSampleSize=1,i.outputFormat="u8",i.writeOutputValue=function(e,r,n){return e.setUint8(r,n+128)});break;case 2:i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)};break;case 3:i.outputSampleSize=4,i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n<<8,!0)};break;case 4:i.outputSampleSize=4,"float"===o?(i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)}):(i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n,!0)});break;case 8:i.outputSampleSize=4,i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)};break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}return i}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return 0}},{key:"decode",value:function(e){for(var r=(0,T.toDataView)(e.data),n=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,a=new ArrayBuffer(n*this.decoderConfig.numberOfChannels*this.outputSampleSize),i=new DataView(a),s=0;s=l)&&(this.currentTimestamp=e.timestamp);var d=this.currentTimestamp;this.currentTimestamp+=l;var f=new(0,E.AudioSample)({format:this.outputFormat,data:a,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:n,timestamp:d});this.onSample(f)}},{key:"flush",value:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return[2]})})()}},{key:"close",value:function(){}}]),r}(B),V=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof w.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a;return(0,b._)(this,function(i){switch(i.label){case 0:return[4,this._track.canDecode()];case 1:if(!i.sent())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,[4,this._track.getDecoderConfig()];case 2:if(a=i.sent(),(0,T.assert)(n&&a),k.PCM_AUDIO_CODECS.includes(a.codec))return[2,new N(e,r,a)];return[2,new L(e,r,n,a)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),z=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof w.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new V(r)}return(0,l._)(e,[{key:"_audioSampleToWrappedArrayBuffer",value:function(e){var r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}},{key:"getBuffer",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._audioSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._audioSampleToWrappedArrayBuffer(r)]}})}).call(this)}},{key:"buffers",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samples(r,n),function(r){return e._audioSampleToWrappedArrayBuffer(r)})}},{key:"buffersAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),function(e){return e&&r._audioSampleToWrappedArrayBuffer(e)})}}]),e}()},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_define_property.cjs":"ltU3W","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec.js":"fXWqW","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./input.js":"3sapy","./input-track.js":"b22CJ","./misc.js":"j7iGm","./packet.js":"QfqGG","./pcm.js":"501Zr","./sample.js":"1oMH7","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3G1wX":[function(e,r,n,a){"use strict";n._=function(e,r){return r=null!=r?r:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):(function(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n.push.apply(n,a)}return n})(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}),e}},{}],QfqGG:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"PLACEHOLDER_DATA",function(){return l}),i.export(n,"EncodedPacket",function(){return d});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_type_of.cjs"),u=e("./misc.js"),l=new Uint8Array(0),d=function(){"use strict";function e(r,n,a,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1,u=arguments.length>5?arguments[5]:void 0,d=arguments.length>6?arguments[6]:void 0;if((0,s._)(this,e),this.data=r,this.type=n,this.timestamp=a,this.duration=i,this.sequenceNumber=o,r===l&&void 0===u)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===u&&(u=r.byteLength),!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==n&&"delta"!==n)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(o))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(u)||u<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==d&&((void 0===d?"undefined":(0,c._)(d))!=="object"||!d))throw TypeError("sideData, when provided, must be an object.");if((null==d?void 0:d.alpha)!==void 0&&!(d.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if((null==d?void 0:d.alphaByteLength)!==void 0&&(!Number.isInteger(d.alphaByteLength)||d.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=u,this.sideData=null!=d?d:{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}return(0,o._)(e,[{key:"isMetadataOnly",get:function(){return this.data===l}},{key:"microsecondTimestamp",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"toEncodedVideoChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"alphaToEncodedVideoChunk",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.type;if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"toEncodedAudioChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"clone",value:function(r){var n,a;if(void 0!==r&&((void 0===r?"undefined":(0,c._)(r))!=="object"||null===r))throw TypeError("options, when provided, must be an object.");if((null==r?void 0:r.timestamp)!==void 0&&!Number.isFinite(r.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if((null==r?void 0:r.duration)!==void 0&&!Number.isFinite(r.duration))throw TypeError("options.duration, when provided, must be a number.");return new e(this.data,this.type,null!=(n=null==r?void 0:r.timestamp)?n:this.timestamp,null!=(a=null==r?void 0:r.duration)?a:this.duration,this.sequenceNumber,this.byteLength)}}],[{key:"fromEncodedChunk",value:function(r,n){if(!(r instanceof EncodedVideoChunk||r instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");var a,i=new Uint8Array(r.byteLength);return r.copyTo(i),new e(i,r.type,r.timestamp/1e6,(null!=(a=r.duration)?a:0)/1e6,void 0,void 0,n)}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"501Zr":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"toUlaw",function(){return s}),i.export(n,"fromUlaw",function(){return o}),i.export(n,"toAlaw",function(){return c}),i.export(n,"fromAlaw",function(){return u});var s=function(e){var r=e,n=4096,a=0,i=12,s=0;for(r<0&&(r=-r,a=128),(r+=33)>8191&&(r=8191);(r&n)!==n&&i>=5;)n>>=1,i--;return s=r>>i-4&15,255&~(a|i-5<<4|s)},o=function(e){var r=0,n=0,a=~e;128&a&&(a&=-129,r=-1);var i=(1<<(n=((240&a)>>4)+5)|(15&a)<4095&&(s=4095);(s&r)!==r&&a>=5;)r>>=1,a--;return i=s>>(4===a?1:a-4)&15,(n|a-4<<4|i)^85},u=function(e){var r=0,n=0,a=85^e;128&a&&(a&=-129,r=-1);var i=0;return i=4!=(n=((240&a)>>4)+4)?1<=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),h=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-p>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),p=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));var g=function(){"use strict";function e(r,n){if((0,o._)(this,e),this._closed=!1,r instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&r instanceof SharedArrayBuffer||ArrayBuffer.isView(r)){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(!("format"in n)||"string"!=typeof n.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(n.codedWidth)||n.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(n.codedHeight)||n.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,f.toUint8Array)(r).slice(),this.format=n.format,this.codedWidth=n.codedWidth,this.codedHeight=n.codedHeight,this.rotation=null!=(a=n.rotation)?a:0,this.timestamp=n.timestamp,this.duration=null!=(i=n.duration)?i:0,this.colorSpace=new VideoColorSpace(n.colorSpace)}else if("undefined"!=typeof VideoFrame&&r instanceof VideoFrame){if((null==n?void 0:n.rotation)!==void 0&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if((null==n?void 0:n.timestamp)!==void 0&&!Number.isFinite(null==n?void 0:n.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if((null==n?void 0:n.duration)!==void 0&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=r,this.format=r.format,this.codedWidth=r.displayWidth,this.codedHeight=r.displayHeight,this.rotation=null!=(s=null==n?void 0:n.rotation)?s:0,this.timestamp=null!=(c=null==n?void 0:n.timestamp)?c:r.timestamp/1e6,this.duration=null!=(d=null==n?void 0:n.duration)?d:(null!=(u=r.duration)?u:0)/1e6,this.colorSpace=r.colorSpace}else if("undefined"!=typeof HTMLImageElement&&r instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&r instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&r instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&r instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&r instanceof OffscreenCanvas){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new e(new VideoFrame(r,{timestamp:Math.trunc(n.timestamp*f.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((null!=(h=n.duration)?h:0)*f.SECOND_TO_MICROSECOND_FACTOR)||void 0}),n);var a,i,s,c,u,d,h,p,g,b=0,k=0;if("naturalWidth"in r?(b=r.naturalWidth,k=r.naturalHeight):"videoWidth"in r?(b=r.videoWidth,k=r.videoHeight):"width"in r&&(b=Number(r.width),k=Number(r.height)),!b||!k)throw TypeError("Could not determine dimensions.");var _=new OffscreenCanvas(b,k),y=_.getContext("2d",{alpha:(0,f.isFirefox)(),willReadFrequently:!0});(0,f.assert)(y),y.drawImage(r,0,0),this._data=_,this.format="RGBX",this.codedWidth=b,this.codedHeight=k,this.rotation=null!=(p=n.rotation)?p:0,this.timestamp=n.timestamp,this.duration=null!=(g=n.duration)?g:0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");null==m||m.register(this,{type:"video",data:this._data},this)}return(0,c._)(e,[{key:"displayWidth",get:function(){return this.rotation%180==0?this.codedWidth:this.codedHeight}},{key:"displayHeight",get:function(){return this.rotation%180==0?this.codedHeight:this.codedWidth}},{key:"microsecondTimestamp",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"hasAlpha",get:function(){return this.format&&this.format.includes("A")}},{key:"clone",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new e(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new e(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new e(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}},{key:"close",value:function(){this._closed||(null==m||m.unregister(this),b(this._data)?this._data.close():this._data=null,this._closed=!0)}},{key:"allocationSize",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}},{key:"copyTo",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!b(this._data))return[3,2];return[4,this._data.copyTo(e)];case 1:return a.sent(),[3,3];case 2:this._data instanceof Uint8Array?(0,f.toUint8Array)(e).set(this._data):(r=this._data.getContext("2d"),(0,f.assert)(r),n=r.getImageData(0,0,this.codedWidth,this.codedHeight),(0,f.toUint8Array)(e).set(n.data)),a.label=3;case 3:return[2]}})}).call(this)}},{key:"toVideoFrame",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}},{key:"draw",value:function(e,r,n,a,i,s,o,c,u){var l,d=0,f=0,h=this.displayWidth,p=this.displayHeight,m=0,g=0,b=this.displayWidth,k=this.displayHeight;if(void 0!==s?(d=r,f=n,h=a,p=i,m=s,g=o,void 0!==c?(b=c,k=u):(b=h,k=p)):(m=r,g=n,void 0!==a&&(b=a,k=i)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(f))throw TypeError("sy must be a number.");if(!Number.isFinite(h)||h<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(p)||p<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(m))throw TypeError("dx must be a number.");if(!Number.isFinite(g))throw TypeError("dy must be a number.");if(!Number.isFinite(b)||b<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");d=(l=this._rotateSourceRegion(d,f,h,p,this.rotation)).sx,f=l.sy,h=l.sWidth,p=l.sHeight;var _=this.toCanvasImageSource();e.save();var y=m+b/2,S=g+k/2;e.translate(y,S),e.rotate(this.rotation*Math.PI/180);var w=this.rotation%180==0?1:b/k;e.scale(1/w,w),e.drawImage(_,d,f,h,p,-b/2,-k/2,b,k),e.restore()}},{key:"drawWithFit",value:function(e,r){if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&_(r.crop,"options.");var n,a,i,s,o,c,d,f,h,p,m,g,b,y=e.canvas.width,S=e.canvas.height,w=null!=(o=r.rotation)?o:this.rotation,T=(0,u._)(w%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth],2),x=T[0],I=T[1];r.crop&&k(r.crop,x,I);var E=this._rotateSourceRegion(null!=(p=null==(n=r.crop)?void 0:n.left)?p:0,null!=(m=null==(a=r.crop)?void 0:a.top)?m:0,null!=(g=null==(i=r.crop)?void 0:i.width)?g:x,null!=(b=null==(s=r.crop)?void 0:s.height)?b:I,w),j=E.sx,P=E.sy,C=E.sWidth,A=E.sHeight;if("fill"===r.fit)c=0,d=0,f=y,h=S;else{var B=(0,u._)(r.crop?[r.crop.width,r.crop.height]:[x,I],2),M=B[0],D=B[1],F="contain"===r.fit?Math.min(y/M,S/D):Math.max(y/M,S/D);f=M*F,h=D*F,c=(y-f)/2,d=(S-h)/2}e.save();var R=w%180==0?1:f/h;e.translate(y/2,S/2),e.rotate(w*Math.PI/180),e.scale(1/R,R),e.translate(-y/2,-S/2),e.drawImage(this.toCanvasImageSource(),j,P,C,A,c,d,f,h),e.restore()}},{key:"_rotateSourceRegion",value:function(e,r,n,a,i){var s,o,c;return 90===i?(e=(s=[r,this.codedHeight-e-n,a,n])[0],r=s[1],n=s[2],a=s[3]):180===i?(e=(o=[this.codedWidth-e-n,this.codedHeight-r-a])[0],r=o[1]):270===i&&(e=(c=[this.codedWidth-r-a,e,a,n])[0],r=c[1],n=c[2],a=c[3]),{sx:e,sy:r,sWidth:n,sHeight:a}}},{key:"toCanvasImageSource",value:function(){if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;var e=this.toVideoFrame();return queueMicrotask(function(){return e.close()}),e}},{key:"setRotation",value:function(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}},{key:"setTimestamp",value:function(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}},{key:"setDuration",value:function(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}},{key:Symbol.dispose,value:function(){this.close()}}]),e}(),b=function(e){return"undefined"!=typeof VideoFrame&&e instanceof VideoFrame},k=function(e,r,n){e.left=Math.min(e.left,r),e.top=Math.min(e.top,n),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,n-e.top),(0,f.assert)(e.width>=0),(0,f.assert)(e.height>=0)},_=function(e,r){if(!e||(void 0===e?"undefined":(0,l._)(e))!=="object")throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},y=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]),S=function(){"use strict";function e(r){if((0,o._)(this,e),this._closed=!1,E(r)){if(null===r.format)throw TypeError("AudioData with null format is not supported.");this._data=r,this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=r.numberOfFrames,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp/1e6,this.duration=r.numberOfFrames/r.sampleRate}else{if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("Invalid AudioDataInit: must be an object.");if(!y.has(r.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(r.sampleRate)||r.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(r.numberOfChannels)||0===r.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(null==r?void 0:r.timestamp))throw TypeError("init.timestamp must be a number.");var n,a=r.data.byteLength/(w(r.format)*r.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=a,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp,this.duration=a/r.sampleRate,r.data instanceof ArrayBuffer)n=new Uint8Array(r.data);else if(ArrayBuffer.isView(r.data))n=new Uint8Array(r.data.buffer,r.data.byteOffset,r.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");var i=this.numberOfFrames*this.numberOfChannels*w(this.format);if(n.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");var s=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-i;if(s>this.numberOfFrames-i)throw RangeError("frameCount out of range");var o=w(a),c=T(a);if(c&&e.planeIndex>=this.numberOfChannels||!c&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(c?s:s*this.numberOfChannels)*o}},{key:"copyTo",value:function(e,r){if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!y.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");var n=r.planeIndex,a=r.format,i=r.frameCount,s=r.frameOffset,o=null!=a?a:this.format;if(!o)throw Error("Destination format not determined");var c=this.numberOfFrames,u=this.numberOfChannels,d=null!=s?s:0;if(d>=c)throw RangeError("frameOffset out of range");var h=void 0!==i?i:c-d;if(h>c-d)throw RangeError("frameCount out of range");var p=w(o),m=T(o);if(m&&n>=u||!m&&0!==n)throw RangeError("planeIndex out of range");var g=m?h:h*u;if(e.byteLength0))return[3,3];for(h=0,f=new Float32Array(a*(l=Math.min(o,u)));h0;){for(var d=Math.min(o,u),f=new Float32Array(a*d),h=0;h0){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fSW0K:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_BOX_HEADER_SIZE",function(){return u}),i.export(n,"MAX_BOX_HEADER_SIZE",function(){return l}),i.export(n,"readBoxHeader",function(){return d}),i.export(n,"readFixed_16_16",function(){return f}),i.export(n,"readFixed_2_30",function(){return h}),i.export(n,"readIsomVariableInteger",function(){return p}),i.export(n,"readMetadataStringShort",function(){return m}),i.export(n,"readDataBox",function(){return g});var s=e("../metadata.js"),o=e("../misc.js"),c=e("../reader.js"),u=8,l=16,d=function(e){var r=(0,c.readU32Be)(e),n=(0,c.readAscii)(e,4),a=8;1===r&&(r=(0,c.readU64Be)(e),a=16);var i=r-a;return i<0?null:{name:n,totalSize:r,headerSize:a,contentSize:i}},f=function(e){return(0,c.readI32Be)(e)/65536},h=function(e){return(0,c.readI32Be)(e)/0x40000000},p=function(e){for(var r=0,n=0;n<4;n++){r<<=7;var a=(0,c.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},m=function(e){var r=(0,c.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,c.readBytes)(e,r))},g=function(e){var r=d(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;var n=(0,c.readU32Be)(e);e.skip(4);var a=(0,c.readBytes)(e,r.contentSize-8);switch(n){case 1:return o.textDecoder.decode(a);case 2:return new TextDecoder("utf-16be").decode(a);case 13:return new(0,s.RichImageData)(a,"image/jpeg");case 14:return new(0,s.RichImageData)(a,"image/png");case 27:return new(0,s.RichImageData)(a,"image/bmp");default:return a}}},{"../metadata.js":"eSjom","../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],eSjom:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"RichImageData",function(){return c}),i.export(n,"AttachedFile",function(){return u}),i.export(n,"validateMetadataTags",function(){return l}),i.export(n,"metadataTagsAreEmpty",function(){return d}),i.export(n,"DEFAULT_TRACK_DISPOSITION",function(){return f}),i.export(n,"validateTrackDisposition",function(){return h});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_type_of.cjs"),c=function e(r,n){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof n)throw TypeError("mimeType must be a string.")},u=function e(r,n,a,i){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,this.name=a,this.description=i,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==n&&"string"!=typeof n)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")},l=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");var r=!0,n=!1,a=void 0;try{for(var i,s=e.images[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var l=i.value;if(!l||(void 0===l?"undefined":(0,o._)(l))!=="object")throw TypeError("Each image in tags.images must be an object.");if(!(l.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof l.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(l.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!==(0,o._)(e.raw))throw TypeError("tags.raw, when provided, must be an object.");var d=!0,f=!1,h=void 0;try{for(var p,m=Object.values(e.raw)[Symbol.iterator]();!(d=(p=m.next()).done);d=!0){var g=p.value;if(null!==g&&"string"!=typeof g&&!(g instanceof Uint8Array)&&!(g instanceof c)&&!(g instanceof u))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}}catch(e){f=!0,h=e}finally{try{d||null==m.return||m.return()}finally{if(f)throw h}}}},d=function(e){return void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length)},f={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},h=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KRfO":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Reader",function(){return l}),i.export(n,"FileSlice",function(){return d}),i.export(n,"readBytes",function(){return h}),i.export(n,"readU8",function(){return p}),i.export(n,"readU16",function(){return m}),i.export(n,"readU16Be",function(){return g}),i.export(n,"readU24Be",function(){return b}),i.export(n,"readI16Be",function(){return k}),i.export(n,"readU32",function(){return _}),i.export(n,"readU32Be",function(){return y}),i.export(n,"readU32Le",function(){return S}),i.export(n,"readI32Be",function(){return w}),i.export(n,"readI32Le",function(){return T}),i.export(n,"readU64",function(){return x}),i.export(n,"readU64Be",function(){return I}),i.export(n,"readI64Be",function(){return E}),i.export(n,"readI64Le",function(){return j}),i.export(n,"readF32Be",function(){return P}),i.export(n,"readF64Be",function(){return C}),i.export(n,"readAscii",function(){return A});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=e("./input.js"),u=e("./misc.js"),l=function(){"use strict";function e(r){(0,s._)(this,e),this.source=r}return(0,o._)(e,[{key:"requestSlice",value:function(e,r){if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;var n=e+r,a=this.source._read(e,n);return a instanceof Promise?a.then(function(r){return r?new d(r.bytes,r.view,r.offset,e,n):null}):a?new d(a.bytes,a.view,a.offset,e,n):null}},{key:"requestSliceRange",value:function(e,r,n){var a=this;if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,u.clamp)(this.fileSize-e,r,n));var i=this.requestSlice(e,n),s=function(i){if(i)return i;var s=function(i){return(0,u.assert)(null!==i),a.requestSlice(e,(0,u.clamp)(i-e,r,n))},o=a.source._retrieveSize();return o instanceof Promise?o.then(s):s(o)};return i instanceof Promise?i.then(s):s(i)}}]),e}(),d=function(){"use strict";function e(r,n,a,i,o){(0,s._)(this,e),this.bytes=r,this.view=n,this.offset=a,this.start=i,this.end=o,this.bufferPos=i-a}return(0,o._)(e,[{key:"length",get:function(){return this.end-this.start}},{key:"filePos",get:function(){return this.offset+this.bufferPos},set:function(e){this.bufferPos=e-this.offset}},{key:"remainingLength",get:function(){return Math.max(this.end-this.filePos,0)}},{key:"skip",value:function(e){this.bufferPos+=e}},{key:"slice",value:function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.end-r;if(rthis.end)throw RangeError("Slicing outside of original slice.");return new e(this.bytes,this.view,this.offset,r,r+n)}}],[{key:"tempFromBytes",value:function(r){return new e(r,(0,u.toDataView)(r),0,0,r.length)}}]),e}(),f=function(e,r){if(e.filePose.end)throw RangeError("Tried reading [".concat(e.filePos,", ").concat(e.filePos+r,"), but slice is")+" [".concat(e.start,", ").concat(e.end,"). This is likely an internal error, please report it alongside the file")+" that caused it.")},h=function(e,r){f(e,r);var n=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,n},p=function(e){return f(e,1),e.view.getUint8(e.bufferPos++)},m=function(e,r){f(e,2);var n=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,n},g=function(e){f(e,2);var r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},b=function(e){f(e,3);var r=(0,u.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},k=function(e){f(e,2);var r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},_=function(e,r){f(e,4);var n=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,n},y=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},S=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},w=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},T=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=function(e,r){var n,a;return r?(n=_(e,!0),a=_(e,!0)):(a=_(e,!1),n=_(e,!1)),0x100000000*a+n},I=function(e){return 0x100000000*y(e)+y(e)},E=function(e){return 0x100000000*w(e)+y(e)},j=function(e){var r=S(e);return 0x100000000*T(e)+r},P=function(e){f(e,4);var r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},C=function(e){f(e,8);var r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=function(e,r){f(e,r);for(var n="",a=0;a=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},E=function(e){if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x7ffffffff)return 5;else if(e<0x3ffffffffff)return 6;else throw Error("EBML varint size not supported "+e)},j=function(){"use strict";function e(r){(0,u._)(this,e),this.writer=r,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}return(0,l._)(e,[{key:"writeByte",value:function(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}},{key:"writeFloat32",value:function(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeFloat64",value:function(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}},{key:"writeUnsignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:T(e),n=0;switch(r){case 6:this.helperView.setUint8(n++,e/0x10000000000|0);case 5:this.helperView.setUint8(n++,e/0x100000000|0);case 4:this.helperView.setUint8(n++,e>>24);case 3:this.helperView.setUint8(n++,e>>16);case 2:this.helperView.setUint8(n++,e>>8);case 1:this.helperView.setUint8(n++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeUnsignedBigInt",value:function(e){for(var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x(e),n=0,a=r-1;a>=0;a--)this.helperView.setUint8(n++,Number(e>>BigInt(8*a)&255n));this.writer.write(this.helper.subarray(0,n))}},{key:"writeSignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I(e);e<0&&(e+=Math.pow(2,8*r)),this.writeUnsignedInt(e,r)}},{key:"writeVarInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E(e),n=0;switch(r){case 1:this.helperView.setUint8(n++,128|e);break;case 2:this.helperView.setUint8(n++,64|e>>8),this.helperView.setUint8(n++,e);break;case 3:this.helperView.setUint8(n++,32|e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 4:this.helperView.setUint8(n++,16|e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 5:this.helperView.setUint8(n++,8|e/0x100000000&7),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 6:this.helperView.setUint8(n++,4|e/0x10000000000&3),this.helperView.setUint8(n++,e/0x100000000|0),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeAsciiString",value:function(e){this.writer.write(new Uint8Array(e.split("").map(function(e){return e.charCodeAt(0)})))}},{key:"writeEBML",value:function(e){if(null!==e){var r=!0,n=!1,a=void 0;if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))try{for(var i,s=e[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.writeEBML(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){var c,u=this.writer.getPos(),l=-1===e.size?1:null!=(c=e.size)?c:4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+l);var d=this.writer.getPos();if(this.dataOffsets.set(e,d),this.writeEBML(e.data),-1!==e.size){var h=this.writer.getPos()-d,m=this.writer.getPos();this.writer.seek(u),this.writeVarInt(h,l),this.writer.seek(m)}}else if("number"==typeof e.data){var y,S=null!=(y=e.size)?y:T(e.data);this.writeVarInt(S),this.writeUnsignedInt(e.data,S)}else if("bigint"===(0,f._)(e.data)){var w,E=null!=(w=e.size)?w:x(e.data);this.writeVarInt(E),this.writeUnsignedBigInt(e.data,E)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof g)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof b)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof k){var j,P=null!=(j=e.size)?j:I(e.data.value);this.writeVarInt(P),this.writeSignedInt(e.data.value,P)}else if(e.data instanceof _){var C=p.textEncoder.encode(e.data.value);this.writeVarInt(C.length),this.writer.write(C)}else(0,p.assertNever)(e.data)}}}]),e}(),P=8,C=2,A=16,B=function(e){var r=(0,m.readU8)(e);if(e.skip(-1),0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;return n},M=function(e){var r=(0,m.readU8)(e);if(0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;for(var i=r&a-1,s=1;s8)throw Error("Bad unsigned int size "+r);for(var n=0,a=0;as?a:s,found:!1}]}})})()},G=function(e,r,n,a){return(0,c._)(function(){var i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:i=65536,s=new Set(n),o=r,d.label=1;case 1:if(!(oU&&(U=H.cuePoints.length,R=H)}catch(e){L=!0,N=e}finally{try{O||null==V.return||V.return()}finally{if(L)throw N}}G=!0,q=!1,W=void 0;try{for(K=this.currentSegment.tracks[Symbol.iterator]();!(G=(X=K.next()).done);G=!0)Q=X.value,0===Q.cuePoints.length&&(Q.cuePoints=R.cuePoints)}catch(e){q=!0,W=e}finally{try{G||null==K.return||K.return()}finally{if(q)throw W}}return this.currentSegment=null,[2]}})}).call(this)}},{key:"readCluster",value:function(e,r){return(0,f._)(function(){var n,a,i,s,o,u,l,d,f,h,p,m,g,b,_,S,w,T,x,I,E,P,A,B,M;return(0,y._)(this,function(y){switch(y.label){case 0:if((null==(n=r.lastReadCluster)?void 0:n.elementStartPos)===e)return[2,r.lastReadCluster];if(!((a=this.reader.requestSliceRange(e,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,a];case 1:a=y.sent(),y.label=2;case 2:if((0,j.assert)(a),i=e,s=(0,C.readElementHeader)(a),(0,j.assert)(s),o=s.id,(0,j.assert)(o===C.EBMLId.Cluster),u=s.size,l=a.filePos,null!==u)return[3,4];return[4,(0,C.searchForNextElementId)(this.reader,l,C.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)];case 3:u=y.sent().pos-l,y.label=4;case 4:if(!((d=this.reader.requestSlice(l,u))instanceof Promise))return[3,6];return[4,d];case 5:d=y.sent(),y.label=6;case 6:f={segment:r,elementStartPos:i,elementEndPos:l+u,dataStartPos:l,timestamp:-1,trackData:new Map},this.currentCluster=f,d&&(f.elementEndPos=this.readContiguousElements(d,C.LEVEL_0_AND_1_EBML_IDS)),h=!0,p=!1,m=void 0;try{for(g=f.trackData[Symbol.iterator]();!(h=(b=g.next()).done);h=!0){for(S=(_=(0,k._)(b.value,2)[1]).track,(0,j.assert)(_.blocks.length>0),w=!1,T=0;T<_.blocks.length;T++)x=_.blocks[T],x.timestamp+=f.timestamp,w||(w=x.lacing!==c.None);for(I=0,_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp});I<_.presentationTimestamps.length;I++)E=_.presentationTimestamps[I],P=_.blocks[E.blockIndex],null===_.firstKeyFrameTimestamp&&P.isKeyFrame&&(_.firstKeyFrameTimestamp=P.timestamp),I<_.presentationTimestamps.length-1?P.duration=_.presentationTimestamps[I+1].timestamp-P.timestamp:0===P.duration&&null!=S.defaultDuration&&P.lacing===c.None&&(P.duration=S.defaultDuration);w&&(this.expandLacedBlocks(_.blocks,S),_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp})),A=_.blocks[_.presentationTimestamps[0].blockIndex],B=_.blocks[(0,j.last)(_.presentationTimestamps).blockIndex],_.startTimestamp=A.timestamp,_.endTimestamp=B.timestamp+B.duration,M=(0,j.binarySearchLessOrEqual)(S.clusterPositionCache,_.startTimestamp,function(e){return e.startTimestamp}),(-1===M||S.clusterPositionCache[M].elementStartPos!==i)&&S.clusterPositionCache.splice(M+1,0,{elementStartPos:f.elementStartPos,startTimestamp:_.startTimestamp})}}catch(e){p=!0,m=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw m}}return r.lastReadCluster=f,[2,f]}})}).call(this)}},{key:"getTrackDataInCluster",value:function(e,r){var n=e.trackData.get(r);if(!n){var a=e.segment.tracks.find(function(e){return e.id===r});if(!a)return null;n={track:a,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,n)}return n}},{key:"expandLacedBlocks",value:function(e,r){for(var n=0;n0;eP.blocks.push({timestamp:eC,duration:0,isKeyFrame:eB,data:eM,lacing:eA>>1&3,decoded:!eD,mainAdditional:null});break;case C.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(f,d)),this.currentBlock=null;break;case C.EBMLId.Block:if(!this.currentCluster)break;var eF=(0,C.readVarInt)(e);if(null===eF)break;var eR=this.getTrackDataInCluster(this.currentCluster,eF);if(!eR)break;var eU=(0,B.readI16Be)(e),eO=(0,B.readU8)(e),eL=(0,B.readBytes)(e,d-(e.filePos-f)),eN=eR.track.decodingInstructions.length>0;this.currentBlock={timestamp:eU,duration:0,isKeyFrame:!0,data:eL,lacing:eO>>1&3,decoded:!eN,mainAdditional:null},eR.blocks.push(this.currentBlock);break;case C.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(f,d)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case C.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,B.readBytes)(e,d);break;case C.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case C.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.Targets:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TargetTypeValue:50!==(0,C.readUnsignedInt)(e,d)&&(this.currentTagTargetIsMovie=!1);break;case C.EBMLId.TagTrackUID:case C.EBMLId.TagEditionUID:case C.EBMLId.TagChapterUID:case C.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case C.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TagName:this.currentSimpleTagName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.TagString:if(!this.currentSimpleTagName)break;var eV=(0,C.readUnicodeString)(e,d);this.processTagValue(this.currentSimpleTagName,eV);break;case C.EBMLId.TagBinary:if(!this.currentSimpleTagName)break;var ez=(0,B.readBytes)(e,d);this.processTagValue(this.currentSimpleTagName,ez);break;case C.EBMLId.AttachedFile:if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(f,d));var eH=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(null!=eH.raw||(eH.raw={}),eH.raw[this.currentAttachedFile.fileUid.toString()]=new(0,E.AttachedFile)(this.currentAttachedFile.fileData,null!=(eq=this.currentAttachedFile.fileMediaType)?eq:void 0,null!=(eW=this.currentAttachedFile.fileName)?eW:void 0,null!=(eK=this.currentAttachedFile.fileDescription)?eK:void 0)),(null==(eG=this.currentAttachedFile.fileMediaType)?void 0:eG.startsWith("image/"))&&this.currentAttachedFile.fileData){var eG,eq,eW,eK,eX,eQ,eZ=this.currentAttachedFile.fileName,eY="unknown";if(eZ){var eJ=eZ.toLowerCase();eJ.startsWith("cover.")?eY="coverFront":eJ.startsWith("back.")&&(eY="coverBack")}null!=eH.images||(eH.images=[]),eH.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:eY,name:null!=(eX=this.currentAttachedFile.fileName)?eX:void 0,description:null!=(eQ=this.currentAttachedFile.fileDescription)?eQ:void 0})}this.currentAttachedFile=null;break;case C.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,C.readUnsignedBigInt)(e,d);break;case C.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,C.readAsciiString)(e,d);break;case C.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,B.readBytes)(e,d);break;case C.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(f,d)),this.currentTrack.decodingInstructions.sort(function(e,r){return r.order-e.order});break;case C.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:u.Block,data:null},this.readContiguousElements(e.slice(f,d)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case C.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:l.Zlib,settings:null},this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.ContentCompAlgo:if((null==(a=this.currentDecodingInstruction)||null==(n=a.data)?void 0:n.type)!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompSettings:if((null==(s=this.currentDecodingInstruction)||null==(i=s.data)?void 0:i.type)!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,B.readBytes)(e,d);break;case C.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=f+d,!0}},{key:"decodeBlockData",value:function(e,r){(0,j.assert)(e.decodingInstructions.length>0);var n=r,a=!0,i=!1,s=void 0;try{for(var o,c=e.decodingInstructions[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value;if((0,j.assert)(u.data),"decompress"===u.data.type&&u.data.algorithm===l.HeaderStripping&&u.data.settings&&u.data.settings.length>0){var d=u.data.settings,f=new Uint8Array(d.length+n.length);f.set(d,0),f.set(n,d.length),n=f}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return n}},{key:"processTagValue",value:function(e,r){if(null==(a=this.currentSegment)?void 0:a.metadataTags){var n=this.currentSegment.metadataTags;if(null!=n.raw||(n.raw={}),null!=(i=n.raw)[e]||(i[e]=r),"string"==typeof r)switch(e.toLowerCase()){case"title":null!=n.title||(n.title=r);break;case"description":null!=n.description||(n.description=r);break;case"artist":null!=n.artist||(n.artist=r);break;case"album":null!=n.album||(n.album=r);break;case"album_artist":null!=n.albumArtist||(n.albumArtist=r);break;case"genre":null!=n.genre||(n.genre=r);break;case"comment":null!=n.comment||(n.comment=r);break;case"lyrics":null!=n.lyrics||(n.lyrics=r);break;case"date":var a,i,s=new Date(r);Number.isNaN(s.getTime())||null!=n.date||(n.date=s);break;case"track_number":case"part_number":var o=r.split("/"),c=Number.parseInt(o[0],10),u=o[1]&&Number.parseInt(o[1],10);Number.isInteger(c)&&c>0&&(null!=n.trackNumber||(n.trackNumber=c)),u&&Number.isInteger(u)&&u>0&&(null!=n.tracksTotal||(n.tracksTotal=u));break;case"disc_number":case"disc":var l=r.split("/"),d=Number.parseInt(l[0],10),f=l[1]&&Number.parseInt(l[1],10);Number.isInteger(d)&&d>0&&(null!=n.discNumber||(n.discNumber=d)),f&&Number.isInteger(f)&&f>0&&(null!=n.discsTotal||(n.discsTotal=f))}}}}]),r}(x.Demuxer),F=function(){"use strict";function e(r){(0,p._)(this,e),this.internalTrack=r,this.packetToClusterLocation=new WeakMap}return(0,m._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.codecId}},{key:"computeDuration",value:function(){return(0,f._)(function(){var e,r,n;return(0,y._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getFirstTimestamp",value:function(){return(0,f._)(function(){var e,r;return(0,y._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getTimeResolution",value:function(){return this.internalTrack.segment.timestampFactor}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"getFirstPacket",value:function(e){return(0,f._)(function(){var r;return(0,y._)(this,function(n){return r=this,[2,this.performClusterLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,e)]})}).call(this)}},{key:"intoTimescale",value:function(e){return(0,j.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}},{key:"getPacket",value:function(e,r){return(0,f._)(function(){var n,a;return(0,y._)(this,function(i){return n=this,a=this.intoTimescale(e),[2,this.performClusterLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};var i=(0,j.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.timestamp});return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&aa.blockIndex});if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{var i=e.trackData.get(n.internalTrack.id);if(i&&null!==i.firstKeyFrameTimestamp){var s=i.blocks.findIndex(function(e){return e.isKeyFrame});return(0,j.assert)(-1!==s),{blockIndex:s,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketInCluster",value:function(e,r,n){return(0,f._)(function(){var a,i,s,o,c,u,l;return(0,y._)(this,function(d){return -1===r?[2,null]:(i=e.trackData.get(this.internalTrack.id).blocks[r],(0,j.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0),s=n.metadataOnly?P.PLACEHOLDER_DATA:i.data,o=i.timestamp/this.internalTrack.segment.timestampFactor,c=i.duration/this.internalTrack.segment.timestampFactor,u={},i.mainAdditional&&(null==(a=this.internalTrack.info)?void 0:a.type)==="video"&&this.internalTrack.info.alphaMode&&(u.alpha=n.metadataOnly?P.PLACEHOLDER_DATA:i.mainAdditional,u.alphaByteLength=i.mainAdditional.byteLength),l=new(0,P.EncodedPacket)(s,i.isKeyFrame?"key":"delta",o,c,e.dataStartPos+r,i.data.byteLength,u),this.packetToClusterLocation.set(l,{cluster:e,blockIndex:r}),[2,l])})}).call(this)}},{key:"performClusterLookup",value:function(e,r,n,a,i){return(0,f._)(function(){var s,o,c,u,l,d,f,h,p,m,g,b,k,_,S,w,T,x,I,E,P,A,B,M,D,F,R,U,O,L,N,V;return(0,y._)(this,function(y){switch(y.label){case 0:if(o=(s=this.internalTrack).demuxer,c=s.segment,u=null,l=null,d=-1,e){if(h=(f=r(e)).blockIndex,f.correctBlockFound)return[2,this.fetchPacketInCluster(e,h,i)];-1!==h&&(l=e,d=h)}m=-1!==(p=(0,j.binarySearchLessOrEqual)(this.internalTrack.cuePoints,n,function(e){return e.time}))?this.internalTrack.cuePoints[p]:null,b=-1!==(g=(0,j.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.clusterPositionCache[g]:null,S=Math.max(null!=(k=null==m?void 0:m.clusterPosition)?k:0,null!=(_=null==b?void 0:b.elementStartPos)?_:0)||null,e?null===S||e.elementStartPos>=S?(w=e.elementEndPos,u=e):w=S:w=null!=S?S:c.clusterSeekStartPos,y.label=1;case 1:if(!(null===c.elementEndPos||w<=c.elementEndPos-C.MIN_HEADER_SIZE)||u&&(T=u.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,13];if(!((x=o.reader.requestSliceRange(w,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=y.sent(),y.label=3;case 3:if(!x)return[3,13];if(I=w,!(!(E=(0,C.readElementHeader)(x))||!C.LEVEL_1_EBML_IDS.includes(E.id)&&E.id!==C.EBMLId.Void))return[3,5];return[4,(0,C.resync)(o.reader,I,C.LEVEL_1_EBML_IDS,Math.min(null!=(P=c.elementEndPos)?P:1/0,I+0xa00000))];case 4:if(A=y.sent())return w=A,[3,1];return[3,13];case 5:if(B=E.id,M=E.size,D=x.filePos,B!==C.EBMLId.Cluster)return[3,7];return[4,o.readCluster(I,c)];case 6:if(M=(u=y.sent()).elementEndPos-D,R=(F=r(u)).blockIndex,F.correctBlockFound)return[2,this.fetchPacketInCluster(u,R,i)];-1!==R&&(l=u,d=R),y.label=7;case 7:if(null!==M)return[3,9];return(0,j.assert)(B!==C.EBMLId.Cluster),[4,(0,C.searchForNextElementId)(o.reader,D,C.LEVEL_0_AND_1_EBML_IDS,c.elementEndPos)];case 8:M=y.sent().pos-D,y.label=9;case 9:if(U=D+M,null!==c.elementEndPos)return[3,12];if(!((O=o.reader.requestSliceRange(U,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,11];return[4,O];case 10:O=y.sent(),y.label=11;case 11:if(!O)return[3,13];if((0,C.readElementId)(O)===C.EBMLId.Segment)return c.elementEndPos=U,[3,13];y.label=12;case 12:return w=U,[3,1];case 13:if(m&&(!l||l.elementStartPos0){var n=(0,s._)(new Set(e.codecStrings.filter(Boolean)));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ifShX:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Mp3Demuxer",function(){return w});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../demuxer.js"),p=e("../input-track.js"),m=e("../metadata.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../../shared/mp3-misc.js"),_=e("../id3.js"),y=e("./mp3-reader.js"),S=e("../reader.js"),w=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.metadataTags=null,n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");return this.tracks=[new(0,p.InputAudioTrack)(this.input,new T(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u;return(0,f._)(this,function(l){switch(l.label){case 0:if(0!==this.lastLoadedPos)return[3,4];l.label=1;case 1:if(!((e=this.reader.requestSlice(this.lastLoadedPos,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,3];return[4,e];case 2:e=l.sent(),l.label=3;case 3:if(!e)return this.lastSampleLoaded=!0,[2];if(!(r=(0,_.readId3V2Header)(e)))return[3,4];return this.lastLoadedPos=e.filePos+r.size,[3,1];case 4:return[4,(0,y.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize)];case 5:if(!(n=l.sent()))return this.lastSampleLoaded=!0,[2];if(a=n.header,this.lastLoadedPos=n.startPos+a.totalSize-1,i=(0,k.getXingOffset)(a.mpegVersionId,a.channel),!((s=this.reader.requestSlice(n.startPos+i,4))instanceof Promise))return[3,7];return[4,s];case 6:s=l.sent(),l.label=7;case 7:if(s&&((o=(0,S.readU32Be)(s))===k.XING||o===k.INFO))return[2];return this.firstFrameHeader||(this.firstFrameHeader=a),a.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn("MP3 changed sample rate mid-file: ".concat(this.firstFrameHeader.sampleRate," Hz to ").concat(a.sampleRate," Hz.")+" Might be a bug, so please report this file."),c=a.audioSamplesInFrame/this.firstFrameHeader.sampleRate,u={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:c,dataStart:n.startPos,dataSize:a.totalSize},this.loadedSamples.push(u),this.nextTimestampInSamples+=a.audioSamplesInFrame,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/mpeg"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:return[4,this.readingMutex.acquire()];case 1:e=c.sent(),c.label=2;case 2:return c.trys.push([2,,13,14]),[4,this.readMetadata()];case 3:if(c.sent(),this.metadataTags)return[2,this.metadataTags];this.metadataTags={},r=0,n=!1,c.label=4;case 4:if(!((a=this.reader.requestSlice(r,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,6];return[4,a];case 5:a=c.sent(),c.label=6;case 6:if(!a||!(i=(0,_.readId3V2Header)(a)))return[3,9];if(n=!0,!((s=this.reader.requestSlice(a.filePos,i.size))instanceof Promise))return[3,8];return[4,s];case 7:s=c.sent(),c.label=8;case 8:if(!s)return[3,9];return(0,_.parseId3V2Tag)(s,i,this.metadataTags),r=a.filePos+i.size,[3,4];case 9:if(!(!n&&null!==this.reader.fileSize&&this.reader.fileSize>=_.ID3_V1_TAG_SIZE))return[3,12];if(!((o=this.reader.requestSlice(this.reader.fileSize-_.ID3_V1_TAG_SIZE,_.ID3_V1_TAG_SIZE))instanceof Promise))return[3,11];return[4,o];case 10:o=c.sent(),c.label=11;case 11:(0,g.assert)(o),"TAG"===(0,S.readAscii)(o,3)&&(0,_.parseId3V1Tag)(o,this.metadataTags),c.label=12;case 12:return[2,this.metadataTags];case 13:return e(),[7];case 14:return[2]}})}).call(this)}}]),r}(h.Demuxer),T=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"mp3"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},m.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.firstFrameHeader),[2,{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,S.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1>>24,i=e>>>16&255,s=e>>>8&255,u=255&e;if(255!==a&&255!==i&&255!==s&&255!==u)return{header:null,bytesAdvanced:4};if(255!==a||(224&i)!=224)return{header:null,bytesAdvanced:1};var l=0,f=0;16&i?l=8&i?0:1:(l=1,f=1);var h=i>>3&3,p=i>>1&3,m=(s>>2&3)%3,g=c[64*l+16*p+(s>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};var b=1e3*g,k=o[m]>>l+f,_=d(l,p,b,k,s>>1&1);return null!==r&&r<_?{header:null,bytesAdvanced:1}:(n=3===h?3===p?384:1152:3===p?384:2===p?1152:576,{header:{totalSize:_,mpegVersionId:h,layer:p,bitrate:b,frequencyIndex:m,sampleRate:k,channel:u>>6&3,modeExtension:u>>4&3,copyright:u>>3&1,original:u>>2&1,emphasis:3&u,audioSamplesInFrame:n},bytesAdvanced:1})},p=function(e){for(var r=127,n=0,a=e;(0x7fffffff^r)!=0;)n=(a&~r)<<1|a&r,r=(r+1<<8)-1,a=n;return n},m=function(e){for(var r=0x7f000000,n=0;0!==r;)n>>=1,n|=e&r,r>>=8;return n}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"42Y2c":[function(e,r,n,a){var i,s,o,c,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(n),u.export(n,"Id3V2HeaderFlags",function(){return o}),u.export(n,"Id3V2TextEncoding",function(){return c}),u.export(n,"ID3_V1_TAG_SIZE",function(){return m}),u.export(n,"ID3_V2_HEADER_SIZE",function(){return g}),u.export(n,"ID3_V1_GENRES",function(){return b}),u.export(n,"parseId3V1Tag",function(){return k}),u.export(n,"readId3V1String",function(){return _}),u.export(n,"readId3V2Header",function(){return y}),u.export(n,"parseId3V2Tag",function(){return S}),u.export(n,"Id3V2Reader",function(){return w}),u.export(n,"Id3V2Writer",function(){return T});var l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("../shared/mp3-misc.js"),h=e("./misc.js"),p=e("./reader.js");(i=o||(o={}))[i.Unsynchronisation=128]="Unsynchronisation",i[i.ExtendedHeader=64]="ExtendedHeader",i[i.ExperimentalIndicator=32]="ExperimentalIndicator",i[i.Footer=16]="Footer",(s=c||(c={}))[s.ISO_8859_1=0]="ISO_8859_1",s[s.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",s[s.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",s[s.UTF_8=3]="UTF_8";var m=128,g=10,b=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],k=function(e,r){var n=e.filePos;null!=r.raw||(r.raw={}),null!=(u=r.raw).TAG||(u.TAG=(0,p.readBytes)(e,m-3)),e.filePos=n;var a=_(e,30);a&&(null!=r.title||(r.title=a));var i=_(e,30);i&&(null!=r.artist||(r.artist=i));var s=_(e,30);s&&(null!=r.album||(r.album=s));var o=Number.parseInt(_(e,4),10);Number.isInteger(o)&&o>0&&(null!=r.date||(r.date=new Date(o,0,1)));var c=(0,p.readBytes)(e,30);if(0===c[28]&&0!==c[29]){var u,l,d=c[29];d>0&&(null!=r.trackNumber||(r.trackNumber=d)),e.skip(-30),l=_(e,28),e.skip(2)}else e.skip(-30),l=_(e,30);l&&(null!=r.comment||(r.comment=l));var f=(0,p.readU8)(e);f0&&(null!=n.trackNumber||(n.trackNumber=S)),T&&Number.isInteger(T)&&T>0&&(null!=n.tracksTotal||(n.tracksTotal=T));break;case"TPOS":case"TPA":var x=i.readId3V2EncodingAndText(l).split("/"),I=Number.parseInt(x[0],10),E=x[1]&&Number.parseInt(x[1],10);Number.isInteger(I)&&I>0&&(null!=n.discNumber||(n.discNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=n.discsTotal||(n.discsTotal=E));break;case"TCON":case"TCO":var j=i.readId3V2EncodingAndText(l),P=/^\((\d+)\)/.exec(j);if(P){var C=Number.parseInt(P[1]);if(void 0!==b[C]){null!=n.genre||(n.genre=b[C]);break}}if(P=/^\d+$/.exec(j)){var A=Number.parseInt(P[0]);if(void 0!==b[A]){null!=n.genre||(n.genre=b[A]);break}}null!=n.genre||(n.genre=j);break;case"TDRC":case"TDAT":var B=new Date(i.readId3V2EncodingAndText(l));Number.isNaN(B.getTime())||null!=n.date||(n.date=B);break;case"TYER":case"TYE":var M=Number.parseInt(i.readId3V2EncodingAndText(l),10);Number.isInteger(M)&&(null!=n.date||(n.date=new Date(M,0,1)));break;case"USLT":case"ULT":var D=i.readU8();i.pos+=3,i.readId3V2Text(D,l),null!=n.lyrics||(n.lyrics=i.readId3V2Text(D,l));break;case"COMM":case"COM":var F=i.readU8();i.pos+=3,i.readId3V2Text(F,l),null!=n.comment||(n.comment=i.readId3V2Text(F,l));break;case"APIC":case"PIC":var R=i.readId3V2TextEncoding(),U=void 0;if(2===r.majorVersion){var O=i.readAscii(3);U="PNG"===O?"image/png":"JPG"===O?"image/jpeg":"image/*"}else U=i.readId3V2Text(R,l);var L=i.readU8(),N=i.readId3V2Text(R,l).trimEnd(),V=l-i.pos;if(V>=0){var z=i.readBytes(V);n.images||(n.images=[]),n.images.push({data:z,mimeType:U,kind:3===L?"coverFront":4===L?"coverBack":"unknown",description:N})}break;default:i.pos+=c.size}i.pos=l}},w=function(){"use strict";function e(r,n){(0,l._)(this,e),this.header=r,this.bytes=n,this.pos=0,this.view=new DataView(n.buffer,n.byteOffset,n.byteLength)}return(0,d._)(e,[{key:"frameHeaderSize",value:function(){return 2===this.header.majorVersion?6:10}},{key:"ununsynchronizeAll",value:function(){for(var e=[],r=0;re.bytes.length)return!1;if(n<=e.bytes.length-e.frameHeaderSize()){e.pos+=r;var a=e.readAscii(4);if("\0\0\0\0"!==a&&!/[0-9A-Z]{4}/.test(a))return!1}return!0};if(!c(i)){var u=4===this.header.majorVersion?a:(0,f.decodeSynchsafe)(a);c(u)&&(i=u)}return this.pos=o,{id:n,size:i,flags:s}}},{key:"readId3V2TextEncoding",value:function(){var e=this.readU8();if(e>3)throw Error("Unsupported text encoding: ".concat(e));return e}},{key:"readId3V2Text",value:function(e,r){var n=this.pos,a=this.readBytes(r-this.pos);switch(e){case c.ISO_8859_1:for(var i="",s=0;s=e)return"";var r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}]),e}(),T=function(){"use strict";function e(r){(0,l._)(this,e),this.helper=new Uint8Array(8),this.helperView=(0,h.toDataView)(this.helper),this.writer=r}return(0,d._)(e,[{key:"writeId3V2Tag",value:function(e){var r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);var n=this.writer.getPos(),a=new Set,i=!0,s=!1,o=void 0;try{for(var u,l=(0,h.keyValueIterator)(e)[Symbol.iterator]();!(i=(u=l.next()).done);i=!0){var d=u.value,f=d.key,p=d.value;switch(f){case"title":this.writeId3V2TextFrame("TIT2",p),a.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",p),a.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",p),a.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",p),a.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",p),a.add("TPE2");break;case"trackNumber":var m=void 0!==e.tracksTotal?"".concat(p,"/").concat(e.tracksTotal):p.toString();this.writeId3V2TextFrame("TRCK",m),a.add("TRCK");break;case"discNumber":var g=void 0!==e.discsTotal?"".concat(p,"/").concat(e.discsTotal):p.toString();this.writeId3V2TextFrame("TPOS",g),a.add("TPOS");break;case"genre":this.writeId3V2TextFrame("TCON",p),a.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",p.toISOString().slice(0,10)),a.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(p),a.add("USLT");break;case"comment":this.writeId3V2CommentFrame(p),a.add("COMM");break;case"images":var b={coverFront:3,coverBack:4,unknown:0},k=!0,_=!1,y=void 0;try{for(var S,w=p[Symbol.iterator]();!(k=(S=w.next()).done);k=!0){var T,x,I=S.value,E=null!=(T=b[I.kind])?T:0,j=null!=(x=I.description)?x:"";this.writeId3V2ApicFrame(I.mimeType,E,j,I.data)}}catch(e){_=!0,y=e}finally{try{k||null==w.return||w.return()}finally{if(_)throw y}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,h.assertNever)(f)}}}catch(e){s=!0,o=e}finally{try{i||null==l.return||l.return()}finally{if(s)throw o}}if(e.raw)for(var P in e.raw){var C=e.raw[P];if(!(null==C||4!==P.length||a.has(P))){var A=void 0;if("string"==typeof C){var B=h.textEncoder.encode(C);(A=new Uint8Array(B.byteLength+2))[0]=c.UTF_8,A.set(B,1)}else{if(!(C instanceof Uint8Array))continue;A=C}this.writeAscii(P),this.writeSynchsafeU32(A.byteLength),this.writeU16(0),this.writer.write(A)}}var M=this.writer.getPos(),D=M-n;return this.writer.seek(r+6),this.writeSynchsafeU32(D),this.writer.seek(M),D+10}},{key:"writeU8",value:function(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}},{key:"writeU16",value:function(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}},{key:"writeU32",value:function(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeAscii",value:function(e){for(var r=0;r=7&&1===l.data[0]&&118===l.data[1]&&111===l.data[2]&&114===l.data[3]&&98===l.data[4]&&105===l.data[5]&&115===l.data[6]))return[3,9];return[4,this.readVorbisMetadata(l,u)];case 8:return f.sent(),[3,11];case 9:if(!(l.data.byteLength>=8&&79===l.data[0]&&112===l.data[1]&&117===l.data[2]&&115===l.data[3]&&72===l.data[4]&&101===l.data[5]&&97===l.data[6]&&100===l.data[7]))return[3,11];return[4,this.readOpusMetadata(l,u)];case 10:f.sent(),f.label=11;case 11:null!==u.codecInfo.codec&&this.tracks.push(new(0,b.InputAudioTrack)(this.input,new I(u,this))),f.label=12;case 12:return a=!0,[3,6];case 13:return[3,16];case 14:return d=f.sent(),i=!0,s=d,[3,16];case 15:try{a||null==o.return||o.return()}finally{if(i)throw s}return[7];case 16:return[2]}})}).call(e)]})}).call(this)}},{key:"readVorbisMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.findNextPacketStart(e)];case 1:case 3:if(!(n=d.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=d.sent()))return[2];return[4,this.findNextPacketStart(a)];case 4:if(!(i=d.sent())||3!==a.data[0]||5!==i.data[0])return[2];return s=[],(o=function(e){for(;s.push(Math.min(255,e)),!(e<255);)e-=255})(e.data.length),o(a.data.length),(c=new Uint8Array(1+s.length+e.data.length+a.data.length+i.data.length))[0]=2,c.set(s,1),c.set(e.data,1+s.length),c.set(a.data,1+s.length+e.data.length),c.set(i.data,1+s.length+e.data.length+a.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=i,r.numberOfChannels=(u=(0,_.toDataView)(e.data)).getUint8(11),r.sampleRate=u.getUint32(12,!0),l=u.getUint8(28),r.codecInfo.vorbisInfo={blocksizes:[1<<(15&l),1<<(l>>4)],modeBlockflags:(0,m.parseModesFromVorbisSetupPacket)(i.data).modeBlockflags},(0,m.readVorbisComments)(a.data.subarray(7),this.metadataTags),[2]}})}).call(this)}},{key:"readOpusMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,h._)(this,function(s){switch(s.label){case 0:return[4,this.findNextPacketStart(e)];case 1:if(!(n=s.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=s.sent()))return[2];return r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=a,r.numberOfChannels=(i=(0,m.parseOpusIdentificationHeader)(e.data)).outputChannelCount,r.sampleRate=p.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:i.preSkip},(0,m.readVorbisComments)(a.data.subarray(8),this.metadataTags),[2]}})}).call(this)}},{key:"readPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,d,f,p,m,g,b,k,y;return(0,h._)(this,function(h){switch(h.label){case 0:for((0,_.assert)(rn?s=p.headerStartPos:(i=p,o.push(p)),[3,2];case 12:return[3,2];case 13:k=a.startPage,x=!0,I=!1,P=void 0;try{for(C=o[Symbol.iterator]();!(x=(A=C.next()).done)&&(B=A.value).granulePosition!==i.granulePosition;x=!0)(!k||B.headerStartPos>k.headerStartPos)&&(k=B)}catch(e){I=!0,P=e}finally{try{x||null==C.return||C.return()}finally{if(I)throw P}}D=[M=k],h.label=14;case 14:if(M.serialNumber===this.bitstream.serialNumber&&M.granulePosition===i.granulePosition)return[3,17];if(F=M.headerStartPos+M.totalSize,!((R=this.demuxer.reader.requestSliceRange(F,T.MIN_PAGE_HEADER_SIZE,T.MAX_PAGE_HEADER_SIZE))instanceof Promise))return[3,16];return[4,R];case 15:R=h.sent(),h.label=16;case 16:return(0,_.assert)(R),U=(0,T.readPageHeader)(R),(0,_.assert)(U),(M=U).serialNumber===this.bitstream.serialNumber&&D.push(M),[3,14];case 17:if((0,_.assert)(-1!==M.granulePosition),O=null,V=M,z=0,M.headerStartPos!==a.startPage.headerStartPos)return[3,18];return L=this.granulePositionToTimestampInSamples(0),N=!0,O=0,[3,20];case 18:for(L=0,N=!1,H=M.lacingValues.length-1;H>=0;H--)if(M.lacingValues[H]<255){O=H+1;break}if(null===O)throw Error("Invalid page with granule position: no packets end on this page.");return z=O-1,G={data:y.PLACEHOLDER_DATA,endPage:V,endSegmentIndex:z},[4,this.demuxer.findNextPacketStart(G)];case 19:if(h.sent())q=j(D,M,O),(0,_.assert)(q),(W=E(D,q.page,q.segmentIndex))&&(M=W.page,O=W.segmentIndex);else for(;(K=j(D,M,O))&&(X=E(D,K.page,K.segmentIndex));)if(M=X.page,O=X.segmentIndex,K.page.headerStartPos!==V.headerStartPos){V=K.page,z=K.segmentIndex;break}h.label=20;case 20:Q=null,Z=null,h.label=21;case 21:if(null===M)return[3,24];return(0,_.assert)(null!==O),[4,this.demuxer.readPacket(M,O)];case 22:if(!(Y=h.sent())||!(M.headerStartPos===a.startPage.headerStartPos&&On||Math.max(ee.timestampInSamples,0)===n)))return[3,24];return[4,this.demuxer.findNextPacketStart(Y)];case 23:if(!(er=h.sent()))return[3,24];return M=er.startPage,O=er.startSegmentIndex,[3,21];case 24:return[2,Q]}})}).call(this)}},{key:"getPacketSequential",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.sequentialScanMutex.acquire()];case 1:n=d.sent(),d.label=2;case 2:if(d.trys.push([2,,9,10]),e=(a=(0,_.roundIfAlmostInteger)(e*this.internalSampleRate))/this.internalSampleRate,-1===(i=(0,_.binarySearchLessOrEqual)(this.sequentialScanCache,a,function(e){return e.timestampInSamples})))return[3,3];return o=this.sequentialScanCache[i],s=this.createEncodedPacketFromOggPacket(o.packet,{timestampInSamples:o.timestampInSamples,vorbisLastBlocksize:o.vorbisLastBlockSize},r),[3,5];case 3:return[4,this.getFirstPacket(r)];case 4:s=d.sent(),d.label=5;case 5:c=0,d.label=6;case 6:if(!(s&&s.timestampe)return[3,8];return s=u,100==++c&&(c=0,l=this.encodedPacketToMetadata.get(s),(0,_.assert)(l),this.sequentialScanCache.length>0&&(0,_.assert)((0,_.last)(this.sequentialScanCache).timestampInSamples<=l.timestampInSamples),this.sequentialScanCache.push(l)),[3,6];case 8:return[2,s];case 9:return n(),[7];case 10:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}(),E=function(e,r,n){var a=r,i=n;e:for(;;){for(i--;i>=0;i--)if(a.lacingValues[i]<255){i++;break e}if((0,_.assert)(-1===i),!(1&a.headerType)){i=0;break}var s=(0,_.findLast)(e,function(e){return e.headerStartPos0)return{page:r,segmentIndex:n-1};var a=(0,_.findLast)(e,function(e){return e.headerStartPos>>0}var p=function(e){var r=(0,c.toDataView)(e),n=r.getUint32(22,!0);r.setUint32(22,0,!0);for(var a=0,i=0;i>>24^e[i]])>>>0;return r.setUint32(22,n,!0),a},m=function(e,r,n){var a=0,i=null;if(e.length>0)if("vorbis"===r.codec){(0,c.assert)(r.vorbisInfo);var s=r.vorbisInfo.modeBlockflags.length,u=(1<<(0,c.ilog)(s-1))-1<<1,l=(e[0]&u)>>1;if(l>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");var d=n,f=r.vorbisInfo.modeBlockflags[l];if(i=r.vorbisInfo.blocksizes[f],1===f){var h=e[0]&(1|u)+1?1:0;d=r.vorbisInfo.blocksizes[h]}a=null!==d?d+i>>2:0}else"opus"===r.codec&&(a=(0,o.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:a,vorbisBlockSize:i}},g=function(e){var r="audio/ogg";if(e.codecStrings){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","../codec-data.js":"kWTYV","../misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fY5up:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_PAGE_HEADER_SIZE",function(){return c}),i.export(n,"MAX_PAGE_HEADER_SIZE",function(){return u}),i.export(n,"MAX_PAGE_SIZE",function(){return l}),i.export(n,"readPageHeader",function(){return d}),i.export(n,"findNextPageHeader",function(){return f});var s=e("../reader.js"),o=e("./ogg-misc.js"),c=27,u=282,l=65307,d=function(e){var r=e.filePos;if((0,s.readU32Le)(e)!==o.OGGS)return null;e.skip(1);for(var n=(0,s.readU8)(e),a=(0,s.readI64Le)(e),i=(0,s.readU32Le)(e),c=(0,s.readU32Le)(e),u=(0,s.readU32Le)(e),l=(0,s.readU8)(e),d=new Uint8Array(l),f=0;f>>8&255,c=n>>>16&255,u=n>>>24&255;if(79===a||79===i||79===c||79===u){if(e.skip(-4),n===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"8KRfO","./ogg-misc.js":"g1LsD","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cokSU:[function(e,r,n,a){var i,s,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(n),o.export(n,"WaveFormat",function(){return s}),o.export(n,"WaveDemuxer",function(){return T});var c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_call_super.cjs"),l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),p=e("@swc/helpers/cjs/_to_consumable_array.cjs"),m=e("@swc/helpers/cjs/_ts_generator.cjs"),g=e("../demuxer.js"),b=e("../input-track.js"),k=e("../metadata.js"),_=e("../misc.js"),y=e("../packet.js"),S=e("../reader.js"),w=e("../id3.js");(i=s||(s={}))[i.PCM=1]="PCM",i[i.IEEE_FLOAT=3]="IEEE_FLOAT",i[i.ALAW=6]="ALAW",i[i.MULAW=7]="MULAW",i[i.EXTENSIBLE=65534]="EXTENSIBLE";var T=function(e){"use strict";function r(e){var n;return(0,l._)(this,r),(n=(0,u._)(this,r,[e])).metadataPromise=null,n.dataStart=-1,n.dataSize=-1,n.audioInfo=null,n.tracks=[],n.lastKnownPacketIndex=0,n.metadataTags={},n.reader=e._reader,n}return(0,f._)(r,e),(0,d._)(r,[{key:"readMetadata",value:function(){return(0,c._)(function(){var e,r;return(0,m._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,c._)(function(){var e,r,n,a,i,s,o,c,u,l,d,f,h,p,g,k,y,w;return(0,m._)(this,function(m){switch(m.label){case 0:if(!((e=this.reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,e];case 1:e=m.sent(),m.label=2;case 2:if((0,_.assert)(e),n="RIFX"!==(r=(0,S.readAscii)(e,4)),a="RF64"===r,i=(0,S.readU32)(e,n),o=a?this.reader.fileSize:Math.min(i+8,null!=(s=this.reader.fileSize)?s:1/0),"WAVE"!==(0,S.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");c=0,u=null,l=e.filePos,m.label=3;case 3:if(!(null===o||l=18&&357!==i&&Math.min(r-18,(0,S.readU16)(a,n))>=22&&i===s.EXTENSIBLE&&(a.skip(6),i=(d=(0,S.readBytes)(a,16))[0]|d[1]<<8),(i===s.MULAW||i===s.ALAW)&&(l=8),this.audioInfo={format:i,numberOfChannels:o,sampleRate:c,sampleSizeInBytes:Math.ceil(l/8),blockSizeInBytes:u},[2]}})}).call(this)}},{key:"parseListChunk",value:function(e,r,n){return(0,c._)(function(){var a,i,s,o,c,u,l,d,f,h,g,b,k,_,y,w,T,x,I,E,j,P,C,A,B,M;return(0,m._)(this,function(m){switch(m.label){case 0:if(!((a=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,a];case 1:a=m.sent(),m.label=2;case 2:if(!a||"INFO"!==(i=(0,S.readAscii)(a,4))&&"INF0"!==i)return[2];for(s=a.filePos;s<=e+r-8;){for(h=0,a.filePos=s,u=(0,S.readAscii)(a,4),l=(0,S.readU32)(a,n),d=(0,S.readBytes)(a,l),f=0;h0&&(null!=(w=this.metadataTags).trackNumber||(w.trackNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=(T=this.metadataTags).tracksTotal||(T.tracksTotal=E));break;case"ICRD":case"IDIT":Number.isNaN((P=new Date(g)).getTime())||null!=(j=this.metadataTags).date||(j.date=P);break;case"YEAR":Number.isInteger(A=Number.parseInt(g,10))&&A>0&&(null!=(C=this.metadataTags).date||(C.date=new Date(A,0,1)));break;case"IGNR":case"GENR":null!=(B=this.metadataTags).genre||(B.genre=g);break;case"ICMT":case"CMNT":case"COMM":null!=(M=this.metadataTags).comment||(M.comment=g)}s+=8+l+(1&l)}return[2]}})}).call(this)}},{key:"parseId3Chunk",value:function(e,r){return(0,c._)(function(){var n,a,i;return(0,m._)(this,function(s){switch(s.label){case 0:if(!((n=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,n];case 1:n=s.sent(),s.label=2;case 2:if(!n)return[2];return(a=(0,w.readId3V2Header)(n))&&(i=n.slice(e+10,a.size),(0,w.parseId3V2Tag)(i,a,this.metadataTags)),[2]}})}).call(this)}},{key:"getCodec",value:function(){if((0,_.assert)(this.audioInfo),this.audioInfo.format===s.MULAW)return"ulaw";if(this.audioInfo.format===s.ALAW)return"alaw";if(this.audioInfo.format===s.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===s.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}},{key:"getMimeType",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){return[2,"audio/wav"]})})()}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e;return(0,m._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,_.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getTracks",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.metadataTags]}})}).call(this)}}]),r}(g.Demuxer),x=function(){"use strict";function e(r){(0,l._)(this,e),this.demuxer=r}return(0,d._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return this.demuxer.getCodec()}},{key:"getInternalCodecId",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}},{key:"getDecoderConfig",value:function(){return(0,c._)(function(){var e;return(0,m._)(this,function(r){return(e=this.demuxer.getCodec())?((0,_.assert)(this.demuxer.audioInfo),[2,{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}]):[2,null]})}).call(this)}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e,r,n;return(0,m._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getNumberOfChannels",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"getSampleRate",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getTimeResolution",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return _.UNDETERMINED_LANGUAGE}},{key:"getDisposition",value:function(){return(0,h._)({},k.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){return[2,0]})})()}},{key:"getPacketAtIndex",value:function(e,r){return(0,c._)(function(){var n,a,i,s,o,c,u;return(0,m._)(this,function(l){switch(l.label){case 0:if((0,_.assert)(this.demuxer.audioInfo),(n=2048*e*this.demuxer.audioInfo.blockSizeInBytes)>=this.demuxer.dataSize)return[2,null];if(a=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-n),null!==this.demuxer.reader.fileSize)return[3,3];if(!((i=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,2];return[4,i];case 1:i=l.sent(),l.label=2;case 2:if(!i)return[2,null];l.label=3;case 3:if(!r.metadataOnly)return[3,4];return s=y.PLACEHOLDER_DATA,[3,7];case 4:if(!((o=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,6];return[4,o];case 5:o=l.sent(),l.label=6;case 6:(0,_.assert)(o),s=(0,S.readBytes)(o,a),l.label=7;case 7:return c=2048*e/this.demuxer.audioInfo.sampleRate,u=a/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate,this.demuxer.lastKnownPacketIndex=Math.max(e,c),[2,new(0,y.EncodedPacket)(s,"key",c,u,e,a)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getPacket",value:function(e,r){return(0,c._)(function(){var n,a,i,s;return(0,m._)(this,function(o){switch(o.label){case 0:return(0,_.assert)(this.demuxer.audioInfo),n=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),[4,this.getPacketAtIndex(n,r)];case 1:if(a=o.sent())return[2,a];if(0===n)return[2,null];return(0,_.assert)(null===this.demuxer.reader.fileSize),[4,this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r)];case 2:i=o.sent(),o.label=3;case 3:if(!i)return[3,5];return[4,this.getNextPacket(i,r)];case 4:if(!(s=o.sent()))return[3,5];return i=s,[3,3];case 5:return[2,i]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){(0,_.assert)(this.demuxer.audioInfo);var n=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(n+1,r)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../metadata.js":"eSjom","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../id3.js":"42Y2c","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"5AUBv":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_FRAME_HEADER_SIZE",function(){return c}),i.export(n,"MAX_FRAME_HEADER_SIZE",function(){return u}),i.export(n,"readFrameHeader",function(){return l});var s=e("../misc.js"),o=e("../reader.js"),c=7,u=9,l=function(e){var r=e.filePos,n=(0,o.readBytes)(e,9),a=new(0,s.Bitstream)(n);if(4095!==a.readBits(12)||(a.skipBits(1),0!==a.readBits(2)))return null;var i=a.readBits(1),c=a.readBits(2)+1,u=a.readBits(4);if(15===u)return null;a.skipBits(1);var l=a.readBits(3);if(0===l)throw Error("ADTS frames with channel configuration 0 are not supported.");a.skipBits(1),a.skipBits(1),a.skipBits(1),a.skipBits(1);var d=a.readBits(13);a.skipBits(11);var f=a.readBits(2)+1;if(1!==f)throw Error("ADTS frames with more than one AAC frame are not supported.");var h=null;return 1===i?e.filePos-=2:h=a.readBits(16),{objectType:c,samplingFrequencyIndex:u,channelConfiguration:l,frameLength:d,numberOfAacFrames:f,crcCheck:h,startPos:r}}},{"../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3t0bF":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"AdtsDemuxer",function(){return S});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../codec.js"),p=e("../demuxer.js"),m=e("../input-track.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../reader.js"),_=e("../metadata.js"),y=e("./adts-reader.js"),S=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:return(0,g.assert)(this.firstFrameHeader),this.tracks=[new(0,m.InputAudioTrack)(this.input,new w(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(!((e=this.reader.requestSliceRange(this.lastLoadedPos,y.MIN_FRAME_HEADER_SIZE,y.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,e];case 1:e=o.sent(),o.label=2;case 2:if(!e||!(r=(0,y.readFrameHeader)(e))||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize)return this.lastSampleLoaded=!0,[2];return this.firstFrameHeader||(this.firstFrameHeader=r),n=h.aacFrequencyTable[r.samplingFrequencyIndex],(0,g.assert)(void 0!==n),a=1024/n,i=r.crcCheck?y.MAX_FRAME_HEADER_SIZE:y.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/n,duration:a,dataStart:r.startPos+i,dataSize:r.frameLength-i},this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/aac"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,{}]})})()}}]),r}(p.Demuxer),w=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return this.getSampleRate()/1024}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"aac"}},{key:"getInternalCodecId",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}},{key:"getNumberOfChannels",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,g.assert)(void 0!==e),e}},{key:"getSampleRate",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,g.assert)(void 0!==e),e}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){return(0,g.assert)(this.demuxer.firstFrameHeader),e=new Uint8Array(3),r=new(0,g.Bitstream)(e),a=(n=this.demuxer.firstFrameHeader).objectType,i=n.samplingFrequencyIndex,s=n.channelConfiguration,a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),[2,{codec:"mp4a.40.".concat(this.demuxer.firstFrameHeader.objectType),numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1s.end-a)return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:s.end-r,isLastFrame:!0}];if(255===(0,k.readU8)(s)){if(c=s.filePos,(0,k.readU8)(s)!==(1===this.blockingBit?249:248)||(s.skip(-2),u=s.filePos-r,!(l=this.readFlacFrameHeader({slice:s,isFirstPacket:!1})))){s.filePos=c;continue}if(0===this.blockingBit){if(l.num-o.num!=1){s.filePos=c;continue}}else if(l.num-o.num!==o.blockSize){s.filePos=c;continue}return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:u,isLastFrame:!1}]}}return[2]}})}).apply(this,arguments)}},{key:"readFlacFrameHeader",value:function(e){var r=e.slice,n=e.isFirstPacket,a=r.filePos,i=(0,k.readBytes)(r,4),s=new(0,g.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,g.assert)(n);var o=s.readBits(1);this.blockingBit=o}else if(1===this.blockingBit){if((0,g.assert)(!n),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,g.assert)(!n),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");var c=(0,y.getBlockSizeOrUncommon)(s.readBits(4));if(!c)return null;(0,g.assert)(this.audioInfo);var u=(0,y.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!u||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;var l=(0,y.readCodedNumber)(r),d=(0,y.readBlockSize)(r,c),f=(0,y.readSampleRate)(r,u);if(null===f||f!==this.audioInfo.sampleRate)return null;var h=r.filePos-a,p=(0,k.readU8)(r);return(r.skip(-h),r.skip(-1),p!==(0,y.calculateCrc8)((0,k.readBytes)(r,h)))?null:{num:l,blockSize:d,sampleRate:f}}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.readMetadata()];case 1:return i.sent(),(0,g.assert)(null!==this.lastLoadedPos),(0,g.assert)(this.audioInfo),e=this.lastLoadedPos,[4,this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length})];case 2:if(!(r=i.sent()))return this.lastSampleLoaded=!0,[2];return a={blockOffset:(n=this.loadedSamples[this.loadedSamples.length-1])?n.blockOffset+n.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size},this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(a),r.isLastFrame&&(this.lastSampleLoaded=!0),[2]}})}).call(this)}}]),r}(p.Demuxer),w=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return"flac"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.audioInfo),[2,{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}]})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(n=this,(0,g.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");return[4,this.demuxer.readingMutex.acquire()];case 1:a=o.sent(),o.label=2;case 2:o.trys.push([2,,9,10]),o.label=3;case 3:if(-1!==(i=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.blockOffset/n.demuxer.audioInfo.sampleRate})))return[3,5];return[4,this.demuxer.advanceReader()];case 4:case 6:return o.sent(),[3,3];case 5:if(!((s=this.demuxer.loadedSamples[i]).blockOffset/this.demuxer.audioInfo.sampleRate+s.blockSize/this.demuxer.audioInfo.sampleRate<=e))return[3,7];if(this.demuxer.lastSampleLoaded)return[2,this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r)];return[4,this.demuxer.advanceReader()];case 7:return[2,this.getPacketAtIndex(i,r)];case 8:return[3,10];case 9:return a(),[7];case 10:return[2]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:if(i.trys.push([2,,6,7]),a=e.sequenceNumber+1,this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return[2,null];i.label=3;case 3:if(!(a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return i.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(a,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:if(!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.byteOffset,n.byteSize))instanceof Promise))return[3,3];return[4,i];case 2:i=c.sent(),c.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.byteSize),c.label=4;case 4:return(0,g.assert)(this.demuxer.audioInfo),s=n.blockOffset/this.demuxer.audioInfo.sampleRate,o=n.blockSize/this.demuxer.audioInfo.sampleRate,[2,new(0,b.EncodedPacket)(a,"key",s,o,e,n.byteSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:if(!(0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,2];return[4,this.demuxer.advanceReader()];case 1:return r.sent(),[3,0];case 2:return[2,this.getPacketAtIndex(0,e)]}})}).call(this)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../codec-data.js":"kWTYV","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../metadata.js":"eSjom","./flac-misc.js":"4iR5P","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4iR5P":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"getBlockSizeOrUncommon",function(){return c}),i.export(n,"getSampleRateOrUncommon",function(){return u}),i.export(n,"readCodedNumber",function(){return l}),i.export(n,"readBlockSize",function(){return d}),i.export(n,"readSampleRate",function(){return f}),i.export(n,"calculateCrc8",function(){return h});var s=e("../misc.js"),o=e("../reader.js"),c=function(e){if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*Math.pow(2,e);if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return Math.pow(2,e);else return null},u=function(e,r){switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},l=function(e){for(var r=0,n=new(0,s.Bitstream)((0,o.readBytes)(e,1));1===n.readBits(1);)r++;if(0===r)return n.readBits(7);for(var a=[],i=r-1,c=new(0,s.Bitstream)((0,o.readBytes)(e,i)),u=8-r-1,l=0;l=u&&(a.emit("timeupdate"),P=i),Number.isFinite(E)&&e>=E){L(),a.emit("ended");return}S&&S.timestamp<=e?(n.clearRect(0,0,r.width,r.height),n.drawImage(S.canvas,0,0),S=null,U(T),C&&(a.emit("canplay"),a.emit("playing"),C=!1)):!S&&(U(T),!S&&Number.isFinite(E)&&e=0&&a.splice(i,1)}},emit:function(r,n){var a=new Event(r);a.detail=n;var i=e.get(r);i&&i.forEach(function(e){return e(a)})}}}i.defineInteropFlag(n),i.export(n,"createVideoEventTarget",function(){return s})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}]},["OIaIB"],"OIaIB","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/docs/compiled/artplayer-proxy-mediabunny.mjs b/docs/compiled/artplayer-proxy-mediabunny.mjs new file mode 100644 index 000000000..b2a72829b --- /dev/null +++ b/docs/compiled/artplayer-proxy-mediabunny.mjs @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},m=d.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!m[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=m[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return m[r].exports;function u(e){var r=u.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=m,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"dQEB4","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dQEB4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"1TXLF","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1TXLF":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,m=!!i.muted,h=1;n.setVolume(u,m);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return h},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;h=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),m=!1,n.setVolume(u,m),s.emit("volumechange")},get muted(){return m},set muted(v){m=!!v,n.setVolume(u,m),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"6K82w","../utils/clamp.js":"3foPY","./videoEvents.js":"3OoKk","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6K82w":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,m=0,h=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,h=null,m=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,m=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;h={code:4,message:e.message},m=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,h={code:4,message:e.message},m=3,a.emit("error")}else await p}async function k(){l&&(l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return m},get error(){return h},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"ijI2X","./videoEngine.js":"8Stti","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ijI2X:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,m=!0,h=.7,p=!1,f=1,g=0,k=new Set;function b(){return m?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:h;s.gain.value=e*e}function S(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function y(){for(let e of k)e.stop();k.clear()}async function x(){await o?.return(),o=null}async function I(r){if(a)for(await x(),o=a.buffers(b());;){let a;if(r!==g||m)return;let n=o.next(),u=setInterval(()=>{if(r!==g||m)return void clearInterval(u);"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||m)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:h,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=h,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,S=T+h.duration/f;S>d&&(d=S),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function w(){m||(c=b(),m=!0,x(),y())}return{load:async function e(e,i){let s=++g;await x(),y(),m=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,S(),i&&i();return}S(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){m&&(i||S(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,m=!1,I(++g))},pause:w,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,m||I(g)},destroy:function(){g++,w(),i?.close(),i=null,r=null,a=null},setVolume(e,r){h=e,p=r,T()},setPlaybackRate(e){e!==f&&(m||(c=b(),l=i.currentTime),f=e,m||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return m}}}},{mediabunny:"6tWT7","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6tWT7":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Output",()=>n.Output),s.export(a,"OutputFormat",()=>o.OutputFormat),s.export(a,"AdtsOutputFormat",()=>o.AdtsOutputFormat),s.export(a,"FlacOutputFormat",()=>o.FlacOutputFormat),s.export(a,"IsobmffOutputFormat",()=>o.IsobmffOutputFormat),s.export(a,"MkvOutputFormat",()=>o.MkvOutputFormat),s.export(a,"MovOutputFormat",()=>o.MovOutputFormat),s.export(a,"Mp3OutputFormat",()=>o.Mp3OutputFormat),s.export(a,"Mp4OutputFormat",()=>o.Mp4OutputFormat),s.export(a,"OggOutputFormat",()=>o.OggOutputFormat),s.export(a,"WavOutputFormat",()=>o.WavOutputFormat),s.export(a,"WebMOutputFormat",()=>o.WebMOutputFormat),s.export(a,"MediaSource",()=>l.MediaSource),s.export(a,"VideoSource",()=>l.VideoSource),s.export(a,"AudioSource",()=>l.AudioSource),s.export(a,"SubtitleSource",()=>l.SubtitleSource),s.export(a,"AudioBufferSource",()=>l.AudioBufferSource),s.export(a,"AudioSampleSource",()=>l.AudioSampleSource),s.export(a,"CanvasSource",()=>l.CanvasSource),s.export(a,"EncodedAudioPacketSource",()=>l.EncodedAudioPacketSource),s.export(a,"EncodedVideoPacketSource",()=>l.EncodedVideoPacketSource),s.export(a,"MediaStreamAudioTrackSource",()=>l.MediaStreamAudioTrackSource),s.export(a,"MediaStreamVideoTrackSource",()=>l.MediaStreamVideoTrackSource),s.export(a,"TextSubtitleSource",()=>l.TextSubtitleSource),s.export(a,"VideoSampleSource",()=>l.VideoSampleSource),s.export(a,"VIDEO_CODECS",()=>c.VIDEO_CODECS),s.export(a,"AUDIO_CODECS",()=>c.AUDIO_CODECS),s.export(a,"PCM_AUDIO_CODECS",()=>c.PCM_AUDIO_CODECS),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c.NON_PCM_AUDIO_CODECS),s.export(a,"SUBTITLE_CODECS",()=>c.SUBTITLE_CODECS),s.export(a,"canEncode",()=>d.canEncode),s.export(a,"canEncodeVideo",()=>d.canEncodeVideo),s.export(a,"canEncodeAudio",()=>d.canEncodeAudio),s.export(a,"canEncodeSubtitles",()=>d.canEncodeSubtitles),s.export(a,"getEncodableCodecs",()=>d.getEncodableCodecs),s.export(a,"getEncodableVideoCodecs",()=>d.getEncodableVideoCodecs),s.export(a,"getEncodableAudioCodecs",()=>d.getEncodableAudioCodecs),s.export(a,"getEncodableSubtitleCodecs",()=>d.getEncodableSubtitleCodecs),s.export(a,"getFirstEncodableVideoCodec",()=>d.getFirstEncodableVideoCodec),s.export(a,"getFirstEncodableAudioCodec",()=>d.getFirstEncodableAudioCodec),s.export(a,"getFirstEncodableSubtitleCodec",()=>d.getFirstEncodableSubtitleCodec),s.export(a,"Quality",()=>d.Quality),s.export(a,"QUALITY_VERY_LOW",()=>d.QUALITY_VERY_LOW),s.export(a,"QUALITY_LOW",()=>d.QUALITY_LOW),s.export(a,"QUALITY_MEDIUM",()=>d.QUALITY_MEDIUM),s.export(a,"QUALITY_HIGH",()=>d.QUALITY_HIGH),s.export(a,"QUALITY_VERY_HIGH",()=>d.QUALITY_VERY_HIGH),s.export(a,"Target",()=>u.Target),s.export(a,"BufferTarget",()=>u.BufferTarget),s.export(a,"FilePathTarget",()=>u.FilePathTarget),s.export(a,"NullTarget",()=>u.NullTarget),s.export(a,"StreamTarget",()=>u.StreamTarget),s.export(a,"ALL_TRACK_TYPES",()=>n.ALL_TRACK_TYPES),s.export(a,"Source",()=>m.Source),s.export(a,"BlobSource",()=>m.BlobSource),s.export(a,"BufferSource",()=>m.BufferSource),s.export(a,"FilePathSource",()=>m.FilePathSource),s.export(a,"StreamSource",()=>m.StreamSource),s.export(a,"ReadableStreamSource",()=>m.ReadableStreamSource),s.export(a,"UrlSource",()=>m.UrlSource),s.export(a,"InputFormat",()=>h.InputFormat),s.export(a,"AdtsInputFormat",()=>h.AdtsInputFormat),s.export(a,"IsobmffInputFormat",()=>h.IsobmffInputFormat),s.export(a,"MatroskaInputFormat",()=>h.MatroskaInputFormat),s.export(a,"Mp3InputFormat",()=>h.Mp3InputFormat),s.export(a,"Mp4InputFormat",()=>h.Mp4InputFormat),s.export(a,"OggInputFormat",()=>h.OggInputFormat),s.export(a,"QuickTimeInputFormat",()=>h.QuickTimeInputFormat),s.export(a,"WaveInputFormat",()=>h.WaveInputFormat),s.export(a,"WebMInputFormat",()=>h.WebMInputFormat),s.export(a,"FlacInputFormat",()=>h.FlacInputFormat),s.export(a,"ALL_FORMATS",()=>h.ALL_FORMATS),s.export(a,"ADTS",()=>h.ADTS),s.export(a,"MATROSKA",()=>h.MATROSKA),s.export(a,"MP3",()=>h.MP3),s.export(a,"MP4",()=>h.MP4),s.export(a,"OGG",()=>h.OGG),s.export(a,"QTFF",()=>h.QTFF),s.export(a,"WAVE",()=>h.WAVE),s.export(a,"WEBM",()=>h.WEBM),s.export(a,"FLAC",()=>h.FLAC),s.export(a,"Input",()=>p.Input),s.export(a,"InputDisposedError",()=>p.InputDisposedError),s.export(a,"InputTrack",()=>f.InputTrack),s.export(a,"InputVideoTrack",()=>f.InputVideoTrack),s.export(a,"InputAudioTrack",()=>f.InputAudioTrack),s.export(a,"EncodedPacket",()=>g.EncodedPacket),s.export(a,"AudioSample",()=>k.AudioSample),s.export(a,"VideoSample",()=>k.VideoSample),s.export(a,"AudioBufferSink",()=>b.AudioBufferSink),s.export(a,"AudioSampleSink",()=>b.AudioSampleSink),s.export(a,"BaseMediaSampleSink",()=>b.BaseMediaSampleSink),s.export(a,"CanvasSink",()=>b.CanvasSink),s.export(a,"EncodedPacketSink",()=>b.EncodedPacketSink),s.export(a,"VideoSampleSink",()=>b.VideoSampleSink),s.export(a,"Conversion",()=>T.Conversion),s.export(a,"CustomVideoDecoder",()=>S.CustomVideoDecoder),s.export(a,"CustomVideoEncoder",()=>S.CustomVideoEncoder),s.export(a,"CustomAudioDecoder",()=>S.CustomAudioDecoder),s.export(a,"CustomAudioEncoder",()=>S.CustomAudioEncoder),s.export(a,"registerDecoder",()=>S.registerDecoder),s.export(a,"registerEncoder",()=>S.registerEncoder),s.export(a,"RichImageData",()=>y.RichImageData),s.export(a,"AttachedFile",()=>y.AttachedFile);var n=e("./output.js"),o=e("./output-format.js"),l=e("./media-source.js"),c=e("./codec.js"),d=e("./encode.js"),u=e("./target.js"),m=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),f=e("./input-track.js"),g=e("./packet.js"),k=e("./sample.js"),b=e("./media-sink.js"),T=e("./conversion.js"),S=e("./custom-coder.js"),y=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"108pa","./input-format.js":"gFGfd","./input.js":"6K6yf","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"6e2oW","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4GUiq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>S),s.export(a,"extractVideoCodecString",()=>y),s.export(a,"buildAudioCodecString",()=>x),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>w),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>C),s.export(a,"buildAacAudioSpecificConfig",()=>P),s.export(a,"OPUS_SAMPLE_RATE",()=>A),s.export(a,"parsePcmCodec",()=>B),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>M),s.export(a,"getAudioEncoderConfigExtension",()=>F),s.export(a,"validateVideoChunkMetadata",()=>N),s.export(a,"validateAudioChunkMetadata",()=>z),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],m=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],h=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=m.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(m),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=h.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(h);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split("."),a=Number(r[1]),i=Number(r[2]);return[1,1,a,2,1,i,3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},S=e=>{let r=e.split("."),a=Number(r[1]),i=r[2],s=Number(i.slice(0,-1)),n=+("H"===i.slice(-1)),o=Number(r[3]),l=r[4]?Number(r[4]):0,c=r[5]?Number(r[5][0]):1;return[129,(a<<5)+s,(n<<7)+((8!==o)<<6)+0+(l<<4)+(c<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},y=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),m=`vp09.${r}.${a}.${i}.${s}`;return(m+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(m=m.slice(0,-g.length)),m}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,m=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,h=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},x=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=C(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},w=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],C=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},P=e=>{let r=w.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},A=48e3,_=/^pcm-([usf])(\d+)+(be)?$/,B=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=_.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(_.test(e))return e;return"webvtt"===e?"webvtt":null},M=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},F=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,O=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,j=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,N=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!O.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!j.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},V=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],z=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!V.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jrq2g:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>m),s.export(a,"writeBits",()=>h),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>S),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>y),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>x),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>w),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>C),s.export(a,"isAllowSharedBufferSource",()=>P),s.export(a,"AsyncMutex",()=>A),s.export(a,"bytesToHexString",()=>_),s.export(a,"reverseBitsU32",()=>B),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>M),s.export(a,"insertSorted",()=>F),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>O),s.export(a,"toAsyncIterator",()=>j),s.export(a,"validateAnyIterable",()=>N),s.export(a,"assertNever",()=>V),s.export(a,"getUint24",()=>z),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>q),s.export(a,"setInt24",()=>W),s.export(a,"setInt64",()=>G),s.export(a,"mapAsyncGenerator",()=>K),s.export(a,"clamp",()=>X),s.export(a,"UNDETERMINED_LANGUAGE",()=>Q),s.export(a,"roundIfAlmostInteger",()=>$),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>em),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>eS),s.export(a,"uint8ArraysAreEqual",()=>ey),s.export(a,"polyfillSymbolDispose",()=>ex),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},h=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),S={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},y=T(S),x={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(x),w={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(w),C=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,P=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class A{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let _=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),B=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},F=(e,r,a)=>{let i=M(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},O=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},j=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},N=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},V=e=>{throw Error(`Unexpected value: ${e}`)},z=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>z(e,r,a)<<8>>8,q=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},W=(e,r,a,i)=>{(a=X(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),q(e,r,a,i)},G=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},K=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),X=(e,r,a)=>Math.max(r,Math.min(a,e)),Q="und",$=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,em=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),eh=null,ep=()=>{if(null!==eh)return eh;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eh=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],"108pa":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Source",()=>d),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>m),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class m extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??h,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),m=0,h=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),h=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ad),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"gFGfd","./misc.js":"jrq2g","./reader.js":"6AkKg","./source.js":"108pa","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gFGfd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>S),s.export(a,"Mp4InputFormat",()=>y),s.export(a,"QuickTimeInputFormat",()=>x),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>w),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>C),s.export(a,"OggInputFormat",()=>P),s.export(a,"FlacInputFormat",()=>A),s.export(a,"AdtsInputFormat",()=>_),s.export(a,"MP4",()=>B),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>M),s.export(a,"WEBM",()=>F),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>O),s.export(a,"FLAC",()=>j),s.export(a,"ALL_FORMATS",()=>N);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),m=e("./mp3/mp3-reader.js"),h=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class S extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class y extends S{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class x extends S{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class w extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,m.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,m.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,h.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class A extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class _ extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let B=new y,D=new x,M=new I,F=new w,R=new E,U=new C,L=new P,O=new _,j=new A,N=[B,D,M,F,U,L,j,R,O]},{"./isobmff/isobmff-demuxer.js":"kdFjc","./matroska/ebml.js":"4qt3Y","./matroska/matroska-demuxer.js":"fO0Ln","./mp3/mp3-demuxer.js":"1xfyp","../shared/mp3-misc.js":"jGy7Y","./id3.js":"8coNE","./mp3/mp3-reader.js":"ixvHZ","./ogg/ogg-demuxer.js":"lRP3H","./wave/wave-demuxer.js":"lP1MW","./adts/adts-reader.js":"iNEYI","./adts/adts-demuxer.js":"b3bBY","./reader.js":"6AkKg","./flac/flac-demuxer.js":"4fsLo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kdFjc:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),m=e("./isobmff-misc.js"),h=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,m.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,h.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-h.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,h.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),m=r.sampleTimingEntries[u],h=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[h],f=m.startDecodeTimestamp+(l-m.startIndex)*m.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)w(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&w(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,h.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,h.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,h.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let m=null;4&i&&(m=(0,p.readU32Be)(e));let h=u;if(0===c){this.currentFragment.implicitBaseDataOffset=h;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=S(i,a),n=await this.fetchPacketForSampleIndex(s,r);return C(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=x(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let m=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==m?this.internalTrack.fragmentLookupTable[m]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,h.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let S=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},y=(e,r)=>{if(!e.keySampleIndices)return S(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=S(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},x=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let m=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),h=e.chunkOffsets[m],p=u.startSampleIndex+(m-u.startChunkIndex)*u.samplesPerChunk,f=0,g=h;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},w=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},C=e=>0===e.sampleSizes.length},{"../codec.js":"4GUiq","../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","./isobmff-misc.js":"fHhRy","./isobmff-reader.js":"8zjcB","../reader.js":"6AkKg","../metadata.js":"1RzS5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],zx4dz:[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>S),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>y),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>x),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>w),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>C),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>O),u.export(a,"parseOpusIdentificationHeader",()=>j),u.export(a,"parseOpusTocByte",()=>V),u.export(a,"parseModesFromVorbisSetupPacket",()=>z),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>q),u.export(a,"createVorbisComments",()=>W);var m=e("./codec.js"),h=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,h.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,h.assertNever)(r),(0,h.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,h.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],S=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,h.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},y=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,h.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,h.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,h.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,h.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,h.readExpGolomb)(r),c=(0,h.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,h.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,C=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,h.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:m,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:S}=P(l,d);(0,h.readExpGolomb)(l);let y=(0,h.readExpGolomb)(l);3===y&&l.skipBits(1),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&((0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l));let x=(0,h.readExpGolomb)(l),I=(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l);let w=l.readBits(1)?0:d;for(let e=w;e<=d;e++)(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&A(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.skipBits(1));let C=(0,h.readExpGolomb)(l);if(_(l,C),l.readBits(1)){let e=(0,h.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,h.Bitstream)(g(e));r.skipBits(16),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);M=a||i?a&&!i?2:!a&&i?3:0:0}let F=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:m,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:S,minSpatialSegmentationIdc:B,parallelismType:M,chromaFormatIdc:y,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:F}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},P=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,h.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,h.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,h.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,h.readExpGolomb)(e),a=(0,h.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,h.readExpGolomb)(e),e.readBits(1)&&M(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,h.readExpGolomb)(e);return(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),r}return 0},M=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,h.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,h.readExpGolomb)(e)+1),i&&F(e,l,n),s&&F(e,l,n)}},F=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,h.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=r.readBits(16),d=(c+1)*(r.readBits(16)+1),u=(0,h.last)(m.VP9_LEVEL_TABLE).level;for(let e of m.VP9_LEVEL_TABLE)if(d<=e.maxPictureSize){u=e.level;break}return{profile:i,level:u,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,h.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,h.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},O=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,h.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let m=d+1;e.skipBits(m);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},j=e=>{let r=(0,h.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},N=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],V=e=>({durationInSamples:N[e[0]>>3]}),z=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,h.isChromium)()||(0,h.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,h.Bitstream)(e);r.pos=8*a;let s=(0,h.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,h.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,h.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,h.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,h.assertNever)(e),(0,h.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let q=(e,r)=>{let a=(0,h.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=h.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,h.base64ToBytes)(c),a=(0,h.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=h.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},W=(e,r,a)=>{let i=[e],s=h.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=h.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,h.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),m=0;for(let e of i)u.set(e,m),m+=e.length;return u}},{"./codec.js":"4GUiq","./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"73Qqp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aU0uf:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>m),s.export(a,"InputAudioTrack",()=>h);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof m}isAudioTrack(){return this instanceof h}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./media-sink.js":"6e2oW","./misc.js":"jrq2g","./packet.js":"8dQhf","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"57K5K":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>m),s.export(a,"customAudioEncoders",()=>h),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],m=[],h=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(m.includes(e))return void console.warn("Video encoder already registered.");m.push(e)}else if(e.prototype instanceof c){if(h.includes(e))return void console.warn("Audio encoder already registered.");h.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6e2oW":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>S),s.export(a,"VideoSampleSink",()=>w),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>A),s.export(a,"AudioBufferSink",()=>_);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),m=e("./packet.js"),h=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof m.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof m.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!h&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class S{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),m=!1,h=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{if(d(),l.timestamp>=r&&(h=!0),h)return void l.close();s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)())},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),S=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let x=b.packets(T??void 0,c);for(await x.next();S&&!h&&!this._track.input._disposed;){let e=y(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(S);let r=await x.next();if(r.done)break;S=r.value}await x.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),m=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(m)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,h=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,h=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),m)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{h||(r.stack=e.stack,h=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!m;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(m)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},S=async()=>{await s.flush();for(let e=0;e{h||(h=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(h)throw k(),h;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let y=e=>0===e?40:8;class x extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;let c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{let e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){let e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){let r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");let e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class w extends S{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new x(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");let a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s],c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new w(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class C extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;let s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class P extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;let{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,h.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,h.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class A extends S{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new P(e,r,i):new C(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class _{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new A(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"4GUiq","./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./input.js":"6K6yf","./input-track.js":"aU0uf","./misc.js":"jrq2g","./packet.js":"8dQhf","./pcm.js":"3X3Vq","./sample.js":"1yEK7","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8dQhf":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"PLACEHOLDER_DATA",()=>o),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3X3Vq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>m),s.export(a,"validateCropRectangle",()=>h),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");let s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,m=this.displayWidth,h=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,m=i,h=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=m,k=h)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(m)||m<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(h)||h<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:m,sHeight:h}=this._rotateSourceRegion(d,u,m,h,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,S=f+k/2;e.translate(T,S),e.rotate(this.rotation*Math.PI/180);let y=this.rotation%180==0?1:g/k;e.scale(1/y,y),e.drawImage(b,d,u,m,h,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&h(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&m(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],m="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*m,n=c*m,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,m=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},h=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,S(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");let a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");let i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let m=void 0!==s?s:c-u;if(m>c-u)throw RangeError("frameCount out of range");let h=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let y=f?m:m*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},S=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fHhRy:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8zjcB":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>m),s.export(a,"readFixed_2_30",()=>h),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},m=e=>(0,l.readI32Be)(e)/65536,h=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"1RzS5","../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1RzS5":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6AkKg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>m),s.export(a,"readU16",()=>h),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>S),s.export(a,"readI32Le",()=>y),s.export(a,"readU64",()=>x),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>w),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>C),s.export(a,"readF64Be",()=>P),s.export(a,"readAscii",()=>A);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},m=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),h=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),w=e=>0x100000000*S(e)+b(e),E=e=>{let r=T(e);return 0x100000000*y(e)+r},C=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},P=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=(e,r)=>{d(e,r);let a="";for(let i=0;id),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>m),o.export(a,"EBMLUnicodeString",()=>h),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>S),o.export(a,"EBMLWriter",()=>y),o.export(a,"MAX_VAR_INT_SIZE",()=>x),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>w),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>C),o.export(a,"readUnsignedInt",()=>P),o.export(a,"readUnsignedBigInt",()=>A),o.export(a,"readSignedInt",()=>_),o.export(a,"readElementId",()=>B),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>M),o.export(a,"readAsciiString",()=>F),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>O),o.export(a,"CODEC_STRING_MAP",()=>j),o.export(a,"assertDefinedSize",()=>N);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},S=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class y{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=S(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof m){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof h){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let x=8,I=2,w=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},C=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=P(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},B=e=>{let r=E(e);return null===r?null:P(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=C(e))&&(r=null)),r},M=e=>{let r=B(e);return null===r?null:{id:r,size:D(e)}},F=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},O=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var m=e("../codec-data.js"),h=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),S=e("./matroska-misc.js"),y=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let x=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,S.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=x[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=x.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=h.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new C(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,y.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,y.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=(0,y.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,y.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,y.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,y.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,y.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class w{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let m=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),h=-1!==m?this.internalTrack.cuePoints[m]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(h?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,m=(0,T.readElementHeader)(e);if(!m||!T.LEVEL_1_EBML_IDS.includes(m.id)&&m.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let h=m.id,p=m.size,f=e.filePos;if(h===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(h!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(h&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,h.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,m.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,m.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,m.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,m.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class C extends w{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,h.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"zx4dz","../codec.js":"4GUiq","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","./ebml.js":"4qt3Y","./matroska-misc.js":"civYS","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],civYS:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1xfyp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),m=e("../id3.js"),h=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,m.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,h.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,m.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,m.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,m.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=m.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-m.ID3_V1_TAG_SIZE,m.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,m.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>m),s.export(a,"readFrameHeader",()=>h),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,h=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,m=0;16&s?d=8&s?0:1:(d=1,m=1);let h=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+m,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8coNE":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>h),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>S),c.export(a,"Id3V2Writer",()=>y);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),m=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let h=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,m.readBytes)(e,h-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,m.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,m.readU8)(e);d{let a=(0,m.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,m.readAscii)(e,3),i=(0,m.readU8)(e),s=(0,m.readU8)(e),n=(0,m.readU8)(e),o=(0,m.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,m.readBytes)(e,r.size),s=new S(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class S{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class y{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let m=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&m),1<<(m>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,m.EncodedPacket)(a.metadataOnly?m.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let S=null,y=g,x=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,S=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){S=e+1;break}if(null===S)throw Error("Invalid page with granule position: no packets end on this page.");x=S-1;let e={data:m.PLACEHOLDER_DATA,endPage:y,endSegmentIndex:x};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,S);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,S=r.segmentIndex)}else for(;;){let e=T(k,g,S);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,S=r.segmentIndex,e.page.headerStartPos!==y.headerStartPos){y=e.page,x=e.segmentIndex;break}}}let I=null,w=null;for(;null!==g;){(0,u.assert)(null!==S);let e=await this.demuxer.readPacket(g,S);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&Ss||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,S=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>m);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},m=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"zx4dz","../misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],frvPd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>m);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:m+h,dataStartPos:r+m,dataSize:h,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},m=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"6AkKg","./ogg-misc.js":"lbYXN","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lP1MW:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,h.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,h.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,h.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,h.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,h.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,h.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,h.readAscii)(i,4),r=(0,h.readU32)(i,a),s=(0,h.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=m.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,h.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,m.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../id3.js":"8coNE","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNEYI:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let m=i.readBits(2)+1;if(1!==m)throw Error("ADTS frames with more than one AAC frame are not supported.");let h=null;return 1===s?e.filePos-=2:h=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:m,crcCheck:h,startPos:r}}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],b3bBY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,h.MIN_FRAME_HEADER_SIZE,h.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?h.MAX_FRAME_HEADER_SIZE:h.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,h.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,h.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,h.readCodedNumber)(e),d=(0,h.readBlockSize)(e,n),m=(0,h.readSampleRate)(e,o);if(null===m||m!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,h.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:m}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../metadata.js":"1RzS5","./flac-misc.js":"G9NqQ","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],G9NqQ:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>m),s.export(a,"calculateCrc8",()=>h);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),m=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,h=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8Stti":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,m=null,h=null,p=0,f=0,g=0,k=0,b=NaN,T=null,S=0,y=!1,x=1,I=!1;async function w(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function C(){await m?.return(),m=null}function P(){r.clearRect(0,0,e.width,e.height)}async function A(e){if(await C(),!u)return;m=u.canvases(e);let i=(await m.next()).value??null;h=(await m.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function _(a){if(m)for(;;){let i=(await m.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,x));if(i.timestamp=i&&(a.emit("timeupdate"),S=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}h&&h.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(h.canvas,0,0),h=null,_(f),y&&(a.emit("canplay"),a.emit("playing"),y=!1)):!h&&(_(f),!h&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3OoKk":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}]},["2x2Ir"],"2x2Ir","parcelRequire4dc0",{});let{default:e}=parcelRequire4dc0("2x2Ir");export{e as default}; \ No newline at end of file diff --git a/docs/compiled/artplayer.js b/docs/compiled/artplayer.js index 05a73eb3a..6f987d28f 100644 --- a/docs/compiled/artplayer.js +++ b/docs/compiled/artplayer.js @@ -5,4 +5,4 @@ * (c) 2017-2025 Harvey Zack * Released under the MIT License. */ -!function(e,t,r,a,o,i,n,s){var l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},c="function"==typeof l[a]&&l[a],p=c.i||{},u=c.cache||{},d="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function f(t,r){if(!u[t]){if(!e[t]){if(o[t])return o[t];var i="function"==typeof l[a]&&l[a];if(!r&&i)return i(t,!0);if(c)return c(t,!0);if(d&&"string"==typeof t)return d(t);var n=Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}p.resolve=function(r){var a=e[t][1][r];return null!=a?a:r},p.cache={};var s=u[t]=new f.Module(t);e[t][0].call(s.exports,p,s,s.exports,l)}return u[t].exports;function p(e){var t=p.resolve(e);return!1===t?{}:f(t)}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.require=d,this.exports={}},f.modules=e,f.cache=u,f.parent=c,f.distDir=void 0,f.publicUrl=void 0,f.devServer=void 0,f.i=p,f.register=function(t,r){e[t]=[function(e,t){t.exports=r},{}]},Object.defineProperty(f,"root",{get:function(){return l[a]}}),l[a]=f;for(var h=0;ht.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return u.default}static get utils(){return Z}static get scheme(){return z.default}static get Emitter(){return X.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Z.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Z.isBrowser&&(window.Artplayer=Q,Z.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"1thAY","option-validator":"iscjH","../package.json":"7z0bJ","./config":"icOIG","./contextmenu":"669K4","./control":"g00bY","./events":"hEROU","./hotkey":"2ac95","./i18n":"3G1Oj","./icons":"ddm2l","./info":"bAZEJ","./layer":"2RWc0","./loading":"i4KU0","./mask":"02CNZ","./notice":"eVoav","./player":"cZepx","./plugins":"5A1j1","./scheme":"3maHy","./setting":"4IYMA","./storage":"9Ulkg","./subtitle":"4gOJp","./template":"haag7","./utils":"3eYxa","./utils/emitter":"hyN0U","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1thAY":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],iscjH:[function(e,t,r,a){t.exports=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],icOIG:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"669K4":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),u=o.interopDefault(p),d=e("./flip"),f=o.interopDefault(d),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,u.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:u}=(0,i.getRect)(a),d=t-l,f=o-c;t+u>l+s&&(d=s-u),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${d}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"3eYxa","../utils/component":"1lUmE","./aspectRatio":"cLwhW","./close":"1OdE3","./flip":"gTbXH","./info":"51BMv","./playbackRate":"hzsOn","./version":"gsm66","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3eYxa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var u=e("./subtitle");o.exportAll(u,r);var d=e("./time");o.exportAll(d,r)},{"./compatibility":"kugJP","./dom":"4w3SA","./error":"iu2jQ","./file":"iE5c3","./format":"6uKmQ","./property":"13VsI","./subtitle":"bhlxy","./time":"2xmIQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kugJP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4w3SA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>u),o.export(r,"remove",()=>d),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>k),o.export(r,"getIcon",()=>j),o.export(r,"setStyleText",()=>S),o.export(r,"supportsFlex",()=>$),o.export(r,"getRect",()=>E),o.export(r,"loadImg",()=>I),o.export(r,"getComposedPath",()=>M);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function u(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function d(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return M(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function k(e){return document.createElement(e)}function j(e="",t=""){let r=k("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),u(r,t),r}function S(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function $(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function E(e){return e.getBoundingClientRect()}function I(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function M(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"kugJP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iu2jQ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iE5c3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6uKmQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"13VsI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bhlxy:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2xmIQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1lUmE":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`,a=this.cache.get(r);(0,c.errorHandle)(!a,`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let o=(0,l.createElement)("div");(0,l.addClass)(o,`art-${this.name}`),(0,l.addClass)(o,`art-${this.name}-${r}`);let i=Array.from(this.$parent.children);o.dataset.index=t.index||this.id;let p=i.find(e=>Number(e.dataset.index)>=Number(o.dataset.index));p?p.insertAdjacentElement("beforebegin",o):(0,l.append)(this.$parent,o),t.html&&(0,l.append)(o,t.html),t.style&&(0,l.setStyles)(o,t.style),t.tooltip&&(0,l.tooltip)(o,t.tooltip);let u=[];if(t.click){let e=this.art.events.proxy(o,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});u.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,o,u),this[r]=o,this.cache.set(r,{$ref:o,events:u,option:t}),t.mounted&&t.mounted.call(this.art,o),o}remove(e){let t=this.cache.get(e);(0,c.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;ef);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",u="function";function d(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:d,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${u}`,mounted:`?${u}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${u}`,switch:`?${s}`,onSwitch:`?${u}`,range:`?${n}`,onRange:`?${u}`,onChange:`?${u}`};r.default={id:l,container:d,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${u}`,plugins:[u],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:u},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cLwhW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1OdE3":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gTbXH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"51BMv":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hzsOn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gsm66:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"7z0bJ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g00bY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),u=o.interopDefault(p),d=e("./fullscreenWeb"),f=o.interopDefault(d),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),k=e("./setting"),j=o.interopDefault(k),S=e("./time"),$=o.interopDefault(S),E=e("./volume"),I=o.interopDefault(E);class M extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,I.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,$.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,j.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,u.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=M},{"../utils":"3eYxa","../utils/component":"1lUmE","./airplay":"8gGQa","./fullscreen":"kgZrr","./fullscreenWeb":"9vue2","./pip":"6OjmD","./playAndPause":"g667z","./progress":"iO48g","./screenshot":"958YD","./setting":"i57Di","./time":"6lVHn","./volume":"f1tg5","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8gGQa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kgZrr:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9vue2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6OjmD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g667z:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iO48g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
`,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),u=(0,i.query)(".art-progress-loaded",e),d=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(u,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(d,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"958YD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i57Di:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6lVHn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
'),l=(0,i.append)(s,'
'),c=(0,i.append)(l,'
'),p=(0,i.append)(l,'
'),u=(0,i.append)(p,'
'),d=(0,i.append)(u,'
'),f=(0,i.append)(p,'
');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(d,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(d,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hEROU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),u=e("./hoverInit"),d=o.interopDefault(u),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,d.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){let t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;en);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d9Euh:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,u=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},d=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),u=[3,4].includes(s),d=[1,2].includes(s);if(u&&!e.isRotate||d&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),u=(0,n.clamp)((i-c)/e.height,-1,1),d=e.isRotate?u:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*d*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,u(e)}),t.proxy(r,"touchmove",d)),t.proxy(a,"touchstart",e=>{o=a,u(e)}),t.proxy(a,"touchmove",d),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"iO48g","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cipTv:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jVOGW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1adf7":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3uT2Y":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5vCth":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haLBA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2ac95":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"6dCIe","bundle-text:./arrow-left.svg":"3WFkX","bundle-text:./arrow-right.svg":"lLrP4","bundle-text:./aspect-ratio.svg":"vMweg","bundle-text:./check.svg":"cD1ql","bundle-text:./close.svg":"cVNEq","bundle-text:./config.svg":"7bynv","bundle-text:./error.svg":"5o4dY","bundle-text:./flip.svg":"ltsUt","bundle-text:./fullscreen-off.svg":"1lbXp","bundle-text:./fullscreen-on.svg":"9yJsq","bundle-text:./fullscreen-web-off.svg":"jvyKo","bundle-text:./fullscreen-web-on.svg":"02A58","bundle-text:./loading.svg":"dceB1","bundle-text:./lock.svg":"eJSju","bundle-text:./pause.svg":"jgrId","bundle-text:./pip.svg":"fIFkZ","bundle-text:./play.svg":"4D7Yh","bundle-text:./playback-rate.svg":"e0Gnx","bundle-text:./screenshot.svg":"diXWF","bundle-text:./setting.svg":"8BcoA","bundle-text:./state.svg":"bQPWd","bundle-text:./switch-off.svg":"cvlWN","bundle-text:./switch-on.svg":"hTk01","bundle-text:./unlock.svg":"iwSR9","bundle-text:./volume-close.svg":"kqCDd","bundle-text:./volume.svg":"jABrY","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6dCIe":[function(e,t,r,a){t.exports=''},{}],"3WFkX":[function(e,t,r,a){t.exports=''},{}],lLrP4:[function(e,t,r,a){t.exports=''},{}],vMweg:[function(e,t,r,a){t.exports=''},{}],cD1ql:[function(e,t,r,a){t.exports=''},{}],cVNEq:[function(e,t,r,a){t.exports=''},{}],"7bynv":[function(e,t,r,a){t.exports=''},{}],"5o4dY":[function(e,t,r,a){t.exports=''},{}],ltsUt:[function(e,t,r,a){t.exports=''},{}],"1lbXp":[function(e,t,r,a){t.exports=''},{}],"9yJsq":[function(e,t,r,a){t.exports=''},{}],jvyKo:[function(e,t,r,a){t.exports=''},{}],"02A58":[function(e,t,r,a){t.exports=''},{}],dceB1:[function(e,t,r,a){t.exports=''},{}],eJSju:[function(e,t,r,a){t.exports=''},{}],jgrId:[function(e,t,r,a){t.exports=''},{}],fIFkZ:[function(e,t,r,a){t.exports=''},{}],"4D7Yh":[function(e,t,r,a){t.exports=''},{}],e0Gnx:[function(e,t,r,a){t.exports=''},{}],diXWF:[function(e,t,r,a){t.exports=''},{}],"8BcoA":[function(e,t,r,a){t.exports=''},{}],bQPWd:[function(e,t,r,a){t.exports=''},{}],cvlWN:[function(e,t,r,a){t.exports=''},{}],hTk01:[function(e,t,r,a){t.exports=''},{}],iwSR9:[function(e,t,r,a){t.exports=''},{}],kqCDd:[function(e,t,r,a){t.exports=''},{}],jABrY:[function(e,t,r,a){t.exports=''},{}],bAZEJ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eVoav:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cZepx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),u=e("./autoHeightMix"),d=o.interopDefault(u),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),k=o.interopDefault(w),j=e("./flipMix"),S=o.interopDefault(j),$=e("./fullscreenMix"),E=o.interopDefault($),I=e("./fullscreenWebMix"),M=o.interopDefault(I),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),D=o.interopDefault(F),A=e("./optionInit"),R=o.interopDefault(A),O=e("./pauseMix"),L=o.interopDefault(O),P=e("./pipMix"),Y=o.interopDefault(P),z=e("./playbackRateMix"),_=o.interopDefault(z),H=e("./playedMix"),V=o.interopDefault(H),q=e("./playingMix"),N=o.interopDefault(q),B=e("./playMix"),W=o.interopDefault(B),U=e("./posterMix"),Z=o.interopDefault(U),K=e("./qualityMix"),X=o.interopDefault(K),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),eu=e("./thumbnailsMix"),ed=o.interopDefault(eu),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,L.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,_.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,E.default)(e),(0,M.default)(e),(0,Y.default)(e),(0,C.default)(e),(0,V.default)(e),(0,N.default)(e),(0,h.default)(e),(0,J.default)(e),(0,S.default)(e),(0,D.default)(e),(0,Z.default)(e),(0,d.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,X.default)(e),(0,ed.default)(e),(0,k.default)(e),(0,R.default)(e)}}},{"./airplayMix":"9kvpK","./aspectRatioMix":"f2B8U","./attrMix":"h2lAp","./autoHeightMix":"lxRiE","./autoSizeMix":"k2ukN","./cssVarMix":"c5XqS","./currentTimeMix":"k4e77","./durationMix":"aK1ks","./eventInit":"eodDF","./flipMix":"lcMdX","./fullscreenMix":"6EjsX","./fullscreenWebMix":"4l4zQ","./loadedMix":"gzJMP","./miniMix":"gELHU","./optionInit":"gy71D","./pauseMix":"hoc9H","./pipMix":"4t2vt","./playbackRateMix":"7hqKi","./playedMix":"cK23B","./playingMix":"2Ndus","./playMix":"6o5f2","./posterMix":"1wbXO","./qualityMix":"1ZLJg","./rectMix":"3g2fj","./screenshotMix":"1stNp","./seekMix":"iSBF1","./stateMix":"9v9Z8","./subtitleOffsetMix":"cTVJT","./switchMix":"gms5Y","./themeMix":"aS33X","./thumbnailsMix":"gC24t","./toggleMix":"bAxW2","./typeMix":"dtsPx","./urlMix":"loZvu","./volumeMix":"4DF3Z","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9kvpK":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],f2B8U:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h2lAp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lxRiE:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k2ukN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c5XqS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k4e77:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aK1ks:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eodDF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,u=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{u=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{u{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"icOIG","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lcMdX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6EjsX":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"924dl","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"924dl":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4l4zQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gzJMP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gELHU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function u(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function d(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let d=(0,i.append)(o,'
');(0,i.append)(d,t.close),r(d,"click",p);let f=(0,i.append)(o,'
'),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),u(h,m),e.on("video:playing",()=>u(h,m)),e.on("video:pause",()=>u(h,m)),e.on("video:timeupdate",()=>u(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gy71D:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hoc9H:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4t2vt":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7hqKi":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cK23B:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2Ndus":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6o5f2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1ZLJg":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3g2fj":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1stNp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iSBF1:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9v9Z8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return;let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="",e.once("video:error",o),e.once("video:loadedmetadata",()=>{e.currentTime=r}),e.once("video:canplay",async()=>{e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()})})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aS33X:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gC24t:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,u,d)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&d&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*u;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bAxW2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dtsPx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],loZvu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4DF3Z":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5A1j1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),u=o.interopDefault(p),d=e("./lock"),f=o.interopDefault(d),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(u.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"3eYxa","./autoOrientation":"fbMFj","./autoPlayback":"7w0fA","./fastForward":"3XpBs","./lock":"e4KRZ","./miniProgressBar":"jcqjF","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fbMFj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7w0fA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
`}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),u=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(u,r.close);let d=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(d),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(u,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{d=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3XpBs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],e4KRZ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jcqjF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4IYMA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),u=o.interopDefault(p),d=e("./playbackRate"),f=o.interopDefault(d),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,u.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),u=s-c+l/2-n/2,d=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${d}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;u+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${u}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t'),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
'),u=(0,i.append)(c,'
'),d=(0,i.createElement)("div");switch((0,i.addClass)(d,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(d,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(d,e.icon||n.config):(0,i.append)(d,n.check)}(0,i.append)(p,d),(0,i.def)(e,"$icon",{configurable:!0,get:()=>d}),(0,i.def)(e,"icon",{configurable:!0,get:()=>d.innerHTML,set(e){d.innerHTML="",(0,i.append)(d,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(u,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(u,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(u,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(u,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bifrn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fXLq3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"50CCd":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9Ulkg":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4gOJp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),u=o.interopDefault(p);class d extends u.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
${e.escape?(0,c.escape)(t):t}
`).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=d},{"option-validator":"iscjH","./scheme":"3maHy","./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haag7:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
Player version:
${o.version}
Video url:
Video volume:
Video time:
Video duration:
Video resolution:
x
[x]
`}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"7z0bJ","./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hyN0U:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;et.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Z}static get scheme(){return z.default}static get Emitter(){return X.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Z.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Z.isBrowser&&(window.Artplayer=Q,Z.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"1thAY","option-validator":"iscjH","../package.json":"7z0bJ","./config":"icOIG","./contextmenu":"669K4","./control":"g00bY","./events":"hEROU","./hotkey":"2ac95","./i18n":"3G1Oj","./icons":"ddm2l","./info":"bAZEJ","./layer":"2RWc0","./loading":"i4KU0","./mask":"02CNZ","./notice":"eVoav","./player":"cZepx","./plugins":"5A1j1","./scheme":"3maHy","./setting":"4IYMA","./storage":"9Ulkg","./subtitle":"4gOJp","./template":"haag7","./utils":"3eYxa","./utils/emitter":"hyN0U","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1thAY":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],iscjH:[function(e,t,r,a){t.exports=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],icOIG:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"669K4":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"3eYxa","../utils/component":"1lUmE","./aspectRatio":"cLwhW","./close":"1OdE3","./flip":"gTbXH","./info":"51BMv","./playbackRate":"hzsOn","./version":"gsm66","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3eYxa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"kugJP","./dom":"4w3SA","./error":"iu2jQ","./file":"iE5c3","./format":"6uKmQ","./property":"13VsI","./subtitle":"bhlxy","./time":"2xmIQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kugJP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4w3SA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>k),o.export(r,"getIcon",()=>j),o.export(r,"setStyleText",()=>S),o.export(r,"supportsFlex",()=>$),o.export(r,"getRect",()=>E),o.export(r,"loadImg",()=>I),o.export(r,"getComposedPath",()=>M);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return M(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function k(e){return document.createElement(e)}function j(e="",t=""){let r=k("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function S(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function $(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function E(e){return e.getBoundingClientRect()}function I(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function M(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"kugJP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iu2jQ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iE5c3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6uKmQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"13VsI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bhlxy:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2xmIQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1lUmE":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`;(0,c.errorHandle)(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let a=(0,l.createElement)("div");(0,l.addClass)(a,`art-${this.name}`),(0,l.addClass)(a,`art-${this.name}-${r}`);let o=Array.from(this.$parent.children);a.dataset.index=t.index||this.id;let i=o.find(e=>Number(e.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement("beforebegin",a):(0,l.append)(this.$parent,a),t.html&&(0,l.append)(a,t.html),t.style&&(0,l.setStyles)(a,t.style),t.tooltip&&(0,l.tooltip)(a,t.tooltip);let p=[];if(t.click){let e=this.art.events.proxy(a,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});p.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,a,p),this[r]=a,this.cache.set(r,{$ref:a,events:p,option:t}),t.mounted&&t.mounted.call(this.art,a),a}remove(e){(0,c.errorHandle)(this.cache.has(e),`Can't find [${e}] from the [${this.name}]`);let t=this.cache.get(e);for(let e of(t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref),t.events))this.art.events.remove(e);this.cache.delete(e),delete this[e],(0,l.remove)(t.$ref)}update(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}},{"option-validator":"iscjH","../scheme":"3maHy","./dom":"4w3SA","./error":"iu2jQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3maHy":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",()=>f);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cLwhW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1OdE3":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gTbXH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"51BMv":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hzsOn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gsm66:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"7z0bJ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g00bY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),k=e("./setting"),j=o.interopDefault(k),S=e("./time"),$=o.interopDefault(S),E=e("./volume"),I=o.interopDefault(E);class M extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,I.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,$.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,j.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=M},{"../utils":"3eYxa","../utils/component":"1lUmE","./airplay":"8gGQa","./fullscreen":"kgZrr","./fullscreenWeb":"9vue2","./pip":"6OjmD","./playAndPause":"g667z","./progress":"iO48g","./screenshot":"958YD","./setting":"i57Di","./time":"6lVHn","./volume":"f1tg5","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8gGQa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kgZrr:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9vue2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6OjmD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g667z:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iO48g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
`,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"958YD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i57Di:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6lVHn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
'),l=(0,i.append)(s,'
'),c=(0,i.append)(l,'
'),p=(0,i.append)(l,'
'),d=(0,i.append)(p,'
'),u=(0,i.append)(d,'
'),f=(0,i.append)(p,'
');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hEROU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.add(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}destroy(){for(let e of this.destroyEvents)try{e()}catch(e){console.warn("Failed to destroy event listener:",e)}this.destroyEvents.clear()}}},{"./clickInit":"at3u2","./gestureInit":"d9Euh","./globalInit":"cipTv","./hoverInit":"jVOGW","./moveInit":"1adf7","./resizeInit":"3uT2Y","./updateInit":"5vCth","./viewInit":"haLBA","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],at3u2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d9Euh:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"iO48g","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cipTv:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jVOGW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1adf7":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3uT2Y":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5vCth":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haLBA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2ac95":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"6dCIe","bundle-text:./arrow-left.svg":"3WFkX","bundle-text:./arrow-right.svg":"lLrP4","bundle-text:./aspect-ratio.svg":"vMweg","bundle-text:./check.svg":"cD1ql","bundle-text:./close.svg":"cVNEq","bundle-text:./config.svg":"7bynv","bundle-text:./error.svg":"5o4dY","bundle-text:./flip.svg":"ltsUt","bundle-text:./fullscreen-off.svg":"1lbXp","bundle-text:./fullscreen-on.svg":"9yJsq","bundle-text:./fullscreen-web-off.svg":"jvyKo","bundle-text:./fullscreen-web-on.svg":"02A58","bundle-text:./loading.svg":"dceB1","bundle-text:./lock.svg":"eJSju","bundle-text:./pause.svg":"jgrId","bundle-text:./pip.svg":"fIFkZ","bundle-text:./play.svg":"4D7Yh","bundle-text:./playback-rate.svg":"e0Gnx","bundle-text:./screenshot.svg":"diXWF","bundle-text:./setting.svg":"8BcoA","bundle-text:./state.svg":"bQPWd","bundle-text:./switch-off.svg":"cvlWN","bundle-text:./switch-on.svg":"hTk01","bundle-text:./unlock.svg":"iwSR9","bundle-text:./volume-close.svg":"kqCDd","bundle-text:./volume.svg":"jABrY","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6dCIe":[function(e,t,r,a){t.exports=''},{}],"3WFkX":[function(e,t,r,a){t.exports=''},{}],lLrP4:[function(e,t,r,a){t.exports=''},{}],vMweg:[function(e,t,r,a){t.exports=''},{}],cD1ql:[function(e,t,r,a){t.exports=''},{}],cVNEq:[function(e,t,r,a){t.exports=''},{}],"7bynv":[function(e,t,r,a){t.exports=''},{}],"5o4dY":[function(e,t,r,a){t.exports=''},{}],ltsUt:[function(e,t,r,a){t.exports=''},{}],"1lbXp":[function(e,t,r,a){t.exports=''},{}],"9yJsq":[function(e,t,r,a){t.exports=''},{}],jvyKo:[function(e,t,r,a){t.exports=''},{}],"02A58":[function(e,t,r,a){t.exports=''},{}],dceB1:[function(e,t,r,a){t.exports=''},{}],eJSju:[function(e,t,r,a){t.exports=''},{}],jgrId:[function(e,t,r,a){t.exports=''},{}],fIFkZ:[function(e,t,r,a){t.exports=''},{}],"4D7Yh":[function(e,t,r,a){t.exports=''},{}],e0Gnx:[function(e,t,r,a){t.exports=''},{}],diXWF:[function(e,t,r,a){t.exports=''},{}],"8BcoA":[function(e,t,r,a){t.exports=''},{}],bQPWd:[function(e,t,r,a){t.exports=''},{}],cvlWN:[function(e,t,r,a){t.exports=''},{}],hTk01:[function(e,t,r,a){t.exports=''},{}],iwSR9:[function(e,t,r,a){t.exports=''},{}],kqCDd:[function(e,t,r,a){t.exports=''},{}],jABrY:[function(e,t,r,a){t.exports=''},{}],bAZEJ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eVoav:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null,e.on("destroy",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cZepx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),k=o.interopDefault(w),j=e("./flipMix"),S=o.interopDefault(j),$=e("./fullscreenMix"),E=o.interopDefault($),I=e("./fullscreenWebMix"),M=o.interopDefault(I),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),D=o.interopDefault(F),A=e("./optionInit"),R=o.interopDefault(A),O=e("./pauseMix"),L=o.interopDefault(O),P=e("./pipMix"),Y=o.interopDefault(P),z=e("./playbackRateMix"),_=o.interopDefault(z),H=e("./playedMix"),V=o.interopDefault(H),q=e("./playingMix"),N=o.interopDefault(q),B=e("./playMix"),W=o.interopDefault(B),U=e("./posterMix"),Z=o.interopDefault(U),K=e("./qualityMix"),X=o.interopDefault(K),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,L.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,_.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,E.default)(e),(0,M.default)(e),(0,Y.default)(e),(0,C.default)(e),(0,V.default)(e),(0,N.default)(e),(0,h.default)(e),(0,J.default)(e),(0,S.default)(e),(0,D.default)(e),(0,Z.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,X.default)(e),(0,eu.default)(e),(0,k.default)(e),(0,R.default)(e)}}},{"./airplayMix":"9kvpK","./aspectRatioMix":"f2B8U","./attrMix":"h2lAp","./autoHeightMix":"lxRiE","./autoSizeMix":"k2ukN","./cssVarMix":"c5XqS","./currentTimeMix":"k4e77","./durationMix":"aK1ks","./eventInit":"eodDF","./flipMix":"lcMdX","./fullscreenMix":"6EjsX","./fullscreenWebMix":"4l4zQ","./loadedMix":"gzJMP","./miniMix":"gELHU","./optionInit":"gy71D","./pauseMix":"hoc9H","./pipMix":"4t2vt","./playbackRateMix":"7hqKi","./playedMix":"cK23B","./playingMix":"2Ndus","./playMix":"6o5f2","./posterMix":"1wbXO","./qualityMix":"1ZLJg","./rectMix":"3g2fj","./screenshotMix":"1stNp","./seekMix":"iSBF1","./stateMix":"9v9Z8","./subtitleOffsetMix":"cTVJT","./switchMix":"gms5Y","./themeMix":"aS33X","./thumbnailsMix":"gC24t","./toggleMix":"bAxW2","./typeMix":"dtsPx","./urlMix":"loZvu","./volumeMix":"4DF3Z","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9kvpK":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],f2B8U:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h2lAp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lxRiE:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k2ukN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c5XqS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k4e77:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aK1ks:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eodDF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"icOIG","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lcMdX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6EjsX":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"924dl","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"924dl":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4l4zQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gzJMP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gELHU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
'),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gy71D:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hoc9H:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4t2vt":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7hqKi":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cK23B:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2Ndus":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6o5f2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1ZLJg":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3g2fj":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1stNp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iSBF1:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9v9Z8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return void a();let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="";let l={};l.error=t=>{e.off("video:canplay",l.canplay),e.off("video:loadedmetadata",l.metadata),o(t)},l.metadata=()=>{e.currentTime=r},l.canplay=async()=>{e.off("video:error",l.error),e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()},e.once("video:error",l.error),e.once("video:loadedmetadata",l.metadata),e.once("video:canplay",l.canplay)})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aS33X:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gC24t:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bAxW2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dtsPx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],loZvu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4DF3Z":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5A1j1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"3eYxa","./autoOrientation":"fbMFj","./autoPlayback":"7w0fA","./fastForward":"3XpBs","./lock":"e4KRZ","./miniProgressBar":"jcqjF","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fbMFj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7w0fA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
`}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3XpBs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],e4KRZ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jcqjF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4IYMA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t'),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
'),d=(0,i.append)(c,'
'),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bifrn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fXLq3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"50CCd":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9Ulkg":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4gOJp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
${e.escape?(0,c.escape)(t):t}
`).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"iscjH","./scheme":"3maHy","./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haag7:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
Player version:
${o.version}
Video url:
Video volume:
Video time:
Video duration:
Video resolution:
x
[x]
`}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"7z0bJ","./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hyN0U:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;e").concat(e))};i("Version@".concat(t.version));for(var c=0;c0)||void 0===arguments[0]||arguments[0];t.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),er.splice(er.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}],[{key:"instances",get:function(){return er}},{key:"version",get:function(){return d.version}},{key:"config",get:function(){return m.default}},{key:"utils",get:function(){return K}},{key:"scheme",get:function(){return V.default}},{key:"Emitter",get:function(){return ee.default}},{key:"validator",get:function(){return f.default}},{key:"kindOf",get:function(){return f.default.kindOf}},{key:"html",get:function(){return Z.default.html}},{key:"option",get:function(){var e;return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:function(e){return e}},moreVideoAttr:{controls:!1,preload:K.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==(e=navigator)?void 0:e.language.toLowerCase()}}}]),t}(ee.default);en.STYLE=u.default,en.DEBUG=!1,en.CONTEXTMENU=!0,en.NOTICE_TIME=2e3,en.SETTING_WIDTH=250,en.SETTING_ITEM_WIDTH=200,en.SETTING_ITEM_HEIGHT=35,en.RESIZE_TIME=200,en.SCROLL_TIME=200,en.SCROLL_GAP=50,en.AUTO_PLAYBACK_MAX=10,en.AUTO_PLAYBACK_MIN=5,en.AUTO_PLAYBACK_TIMEOUT=3e3,en.RECONNECT_TIME_MAX=5,en.RECONNECT_SLEEP_TIME=1e3,en.CONTROL_HIDE_TIME=3e3,en.DBCLICK_TIME=300,en.DBCLICK_FULLSCREEN=!0,en.MOBILE_DBCLICK_PLAY=!0,en.MOBILE_CLICK_PLAY=!1,en.AUTO_ORIENTATION_TIME=200,en.INFO_LOOP_TIME=1e3,en.FAST_FORWARD_VALUE=3,en.FAST_FORWARD_TIME=1e3,en.TOUCH_MOVE_RATIO=.5,en.VOLUME_STEP=.1,en.SEEK_STEP=5,en.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],en.ASPECT_RATIO=["default","4:3","16:9"],en.FLIP=["normal","horizontal","vertical"],en.FULLSCREEN_WEB_IN_BODY=!0,en.LOG_VERSION=!0,en.USE_RAF=!1,en.REMOVE_SRC_WHEN_DESTROY=!0,K.isBrowser&&(window.Artplayer=en,K.setStyleText("artplayer-style",u.default),setTimeout(function(){en.LOG_VERSION&&console.log("%c ArtPlayer %c ".concat(en.version," %c https://artplayer.org"),"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","bundle-text:./style/index.less":"A7TwB","option-validator":"8zKz5","../package.json":"2Jf7W","./config":"3vlyb","./contextmenu":"46D5s","./control":"9MunV","./events":"kSrJ9","./hotkey":"fSjZi","./i18n":"5q3H4","./icons":"lkjMg","./info":"9sVMb","./layer":"dsBH4","./loading":"hLYDH","./mask":"5YaCM","./notice":"6kSNS","./player":"gJ9uy","./plugins":"83Crr","./scheme":"3Srhh","./setting":"4ARoj","./storage":"a5A5h","./subtitle":"kEcFl","./template":"jkHHJ","./utils":"hQMLb","./utils/emitter":"ikoiH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],clpdF:[function(e,t,r,n){"use strict";var o=e("feddc910f69a01a6"),a=e("b644f6b72647b399"),s=e("ba991daace2b8ed9");r._=function(e,t,r){return t=o._(t),s._(e,a._()?Reflect.construct(t,r||[],o._(e).constructor):t.apply(e,r))}},{feddc910f69a01a6:"NOGHw",b644f6b72647b399:"83nDe",ba991daace2b8ed9:"hd12h"}],NOGHw:[function(e,t,r,n){"use strict";function o(e){return r._=o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}r._=o},{}],"83nDe":[function(e,t,r,n){"use strict";function o(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r._=o=function(){return!!e})()}r._=o},{}],hd12h:[function(e,t,r,n){"use strict";var o=e("f7151fe13994d2aa"),a=e("f18e81760bb14899");r._=function(e,t){return t&&("object"===a._(t)||"function"==typeof t)?t:o._(e)}},{f7151fe13994d2aa:"1tlYe",f18e81760bb14899:"iXhRw"}],"1tlYe":[function(e,t,r,n){"use strict";r._=function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},{}],iXhRw:[function(e,t,r,n){"use strict";r._=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}},{}],"4Uf9M":[function(e,t,r,n){"use strict";r._=function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}},{}],igUuK:[function(e,t,r,n){"use strict";function o(e,t){for(var r=0;r","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],"3vlyb":[function(e,t,r,n){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],qpMMf:[function(e,t,r,n){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"46D5s":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return k});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("../utils"),u=e("../utils/component"),p=o.interopDefault(u),f=e("./aspectRatio"),d=o.interopDefault(f),h=e("./close"),m=o.interopDefault(h),v=e("./flip"),g=o.interopDefault(v),y=e("./info"),b=o.interopDefault(y),j=e("./playbackRate"),w=o.interopDefault(j),_=e("./version"),x=o.interopDefault(_),k=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="contextmenu",r.$parent=e.template.$contextmenu,l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.option,n=t.proxy,o=t.template,a=o.$player,s=o.$contextmenu;r.playbackRate&&this.add((0,w.default)({name:"playbackRate",index:10})),r.aspectRatio&&this.add((0,d.default)({name:"aspectRatio",index:20})),r.flip&&this.add((0,g.default)({name:"flip",index:30})),this.add((0,b.default)({name:"info",index:40})),this.add((0,x.default)({name:"version",index:50})),this.add((0,m.default)({name:"close",index:60}));for(var i=0;iu+c&&(m=c-h),n+d>p+i&&(v=i-d),(0,l.setStyles)(s,{top:"".concat(v,"px"),left:"".concat(m,"px")})}}),n(a,"click",function(t){(0,l.includeFromEvent)(t,s)||(e.show=!1)}),this.art.on("blur",function(){e.show=!1})}}]),t}(p.default)},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","../utils":"hQMLb","../utils/component":"hXsfe","./aspectRatio":"dCCaf","./close":"j6SRT","./flip":"cyTC8","./info":"cU7aj","./playbackRate":"01vHs","./version":"64r3r","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQMLb:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var a=e("./compatibility");o.exportAll(a,r);var s=e("./dom");o.exportAll(s,r);var i=e("./error");o.exportAll(i,r);var c=e("./file");o.exportAll(c,r);var l=e("./format");o.exportAll(l,r);var u=e("./property");o.exportAll(u,r);var p=e("./subtitle");o.exportAll(p,r);var f=e("./time");o.exportAll(f,r)},{"./compatibility":"iDd6B","./dom":"7V5Cu","./error":"2cjgc","./file":"8XY4p","./format":"lHh8q","./property":"iccpW","./subtitle":"ctswB","./time":"8KDy9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iDd6B:[function(e,t,r,n){var o,a,s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(r),s.export(r,"userAgent",function(){return i}),s.export(r,"isSafari",function(){return c}),s.export(r,"isIOS",function(){return l}),s.export(r,"isIOS13",function(){return u}),s.export(r,"isMobile",function(){return p}),s.export(r,"isBrowser",function(){return f});var i=null!=(a=null==(o=globalThis)?void 0:o.CUSTOM_USER_AGENT)?a:"undefined"!=typeof navigator?navigator.userAgent:"",c=/^(?:(?!chrome|android).)*safari/i.test(i),l=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,u=l||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||u,f="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7V5Cu":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",function(){return s}),o.export(r,"queryAll",function(){return i}),o.export(r,"addClass",function(){return c}),o.export(r,"removeClass",function(){return l}),o.export(r,"hasClass",function(){return u}),o.export(r,"append",function(){return p}),o.export(r,"remove",function(){return f}),o.export(r,"setStyle",function(){return d}),o.export(r,"setStyles",function(){return h}),o.export(r,"getStyle",function(){return m}),o.export(r,"siblings",function(){return v}),o.export(r,"inverseClass",function(){return g}),o.export(r,"tooltip",function(){return y}),o.export(r,"isInViewport",function(){return b}),o.export(r,"includeFromEvent",function(){return j}),o.export(r,"replaceElement",function(){return w}),o.export(r,"createElement",function(){return _}),o.export(r,"getIcon",function(){return x}),o.export(r,"setStyleText",function(){return k}),o.export(r,"supportsFlex",function(){return M}),o.export(r,"getRect",function(){return S}),o.export(r,"loadImg",function(){return E}),o.export(r,"getComposedPath",function(){return I});var a=e("./compatibility");function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelector(e)}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return Array.from(t.querySelectorAll(e))}function c(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function u(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function f(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function h(e,t){for(var r in t)d(e,r,t[r]);return e}function m(e,t){var r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(n):n}function v(e){return Array.from(e.parentElement.children).filter(function(t){return t!==e})}function g(e,t){v(e).forEach(function(e){return l(e,t)}),c(e,t)}function y(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";a.isMobile||(e.setAttribute("aria-label",t),c(e,"hint--rounded"),c(e,"hint--".concat(r)))}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,a=r.top-t<=n&&r.top+r.height+t>=0,s=r.left-t<=o+t&&r.left+r.width+t>=0;return a&&s}function j(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function _(e){return document.createElement(e)}function x(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=_("i");return c(r,"art-icon"),c(r,"art-icon-".concat(e)),p(r,t),r}function k(e,t){var r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function M(){var e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function S(e){return e.getBoundingClientRect()}function E(e,t){return new Promise(function(r,n){var o=new Image;o.onload=function(){if(t&&1!==t){var a=document.createElement("canvas"),s=a.getContext("2d");a.width=o.width*t,a.height=o.height*t,s.drawImage(o,0,0,a.width,a.height),a.toBlob(function(t){var o=URL.createObjectURL(t),a=new Image;a.onload=function(){r(a)},a.onerror=function(){URL.revokeObjectURL(o),n(Error("Image load failed: ".concat(e)))},a.src=o})}else r(o)},o.onerror=function(){n(Error("Image load failed: ".concat(e)))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();for(var t=[],r=e.target;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"iDd6B","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2cjgc":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",function(){return c}),o.export(r,"errorHandle",function(){return l});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_inherits.cjs"),c=function(e){"use strict";function t(e,r){var n;return(0,s._)(this,t),n=(0,a._)(this,t,[e]),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(n,r||n.constructor),n.name="ArtPlayerError",n}return(0,i._)(t,e),t}((0,e("@swc/helpers/cjs/_wrap_native_super.cjs")._)(Error));function l(e,t){if(!e)throw new c(t);return e}},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,t,r,n){"use strict";var o=e("c8857d56f4968279"),a=e("2ed7bdf1701f2d07"),s=e("5c5ad8846076b9cd"),i=e("2db6fa09e8a5be4c");function c(e){var t="function"==typeof Map?new Map:void 0;return r._=c=function(e){if(null===e||!s._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return o._(e,arguments,a._(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),i._(r,e)},c(e)}r._=c},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,t,r,n){"use strict";var o=e("62fc231ae2e75266"),a=e("3f98bf9d4f706151");function s(e,t,n){return o._()?r._=s=Reflect.construct:r._=s=function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&a._(o,r.prototype),o},s.apply(null,arguments)}r._=s},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,t,r,n){"use strict";r._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"8XY4p":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",function(){return function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}}),o.export(r,"download",function(){return a})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],lHh8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function s(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){if(!e)return"00:00";var t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*r);return(t>0?[t,r,n]:[r,n]).map(function(e){return e<10?"0".concat(e):String(e)}).join(":")}function c(e){return e.replace(/[&<>'"]/g,function(e){return({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e})}function l(e){var t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp("(".concat(Object.keys(t).join("|"),")"),"g");return e.replace(r,function(e){return t[e]||e})}o.defineInteropFlag(r),o.export(r,"clamp",function(){return a}),o.export(r,"capitalize",function(){return s}),o.export(r,"secondToTime",function(){return i}),o.export(r,"escape",function(){return c}),o.export(r,"unescape",function(){return l})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iccpW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",function(){return i}),o.export(r,"has",function(){return l}),o.export(r,"get",function(){return u}),o.export(r,"mergeDeep",function(){return function e(){for(var t=arguments.length,r=Array(t),n=0;ne.length)&&(t=e.length);for(var r=0,n=Array(t);r").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function s(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function i(e){var t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.split(/[:.]/).map(function(e,t,r){if(t===r.length-1){if(1===e.length)return".".concat(e,"00");if(2===e.length)return".".concat(e,"0")}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?".".concat(e):":".concat(e)}).join("")}return"WEBVTT\n"+"\n".concat(e.split(/\r?\n/).map(function(e){var n=e.match(t);return n?{start:r(n[1].trim()),end:r(n[2].trim()),text:n[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(function(e){return e.trim()}).join("\n")}:null}).filter(function(e){return e}).map(function(e,t){return e?"".concat(t+1,"\n")+"".concat(e.start," --\x3e ").concat(e.end)+"\n"+"".concat(e.text):""}).filter(function(e){return e.trim()}).join("\n\n"))}o.defineInteropFlag(r),o.export(r,"srtToVtt",function(){return a}),o.export(r,"vttToBlob",function(){return s}),o.export(r,"assToVtt",function(){return i})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KDy9":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new Promise(function(t){return setTimeout(t,e)})}function s(e,t){var r;return function(){for(var n=this,o=arguments.length,a=Array(o),s=0;s=Number(a.dataset.index)});i?i.insertAdjacentElement("beforebegin",a):(0,u.append)(this.$parent,a),r.html&&(0,u.append)(a,r.html),r.style&&(0,u.setStyles)(a,r.style),r.tooltip&&(0,u.tooltip)(a,r.tooltip);var f=[];if(r.click){var d=this.art.events.proxy(a,"click",function(e){e.preventDefault(),r.click.call(t.art,t,e)});f.push(d)}return r.selector&&["left","right"].includes(r.position)&&this.selector(r,a,f),this[n]=a,this.cache.set(n,{$ref:a,events:f,option:r}),r.mounted&&r.mounted.call(this.art,a),a}}},{key:"remove",value:function(e){var t=this.cache.get(e);(0,p.errorHandle)(t,"Can't find [".concat(e,"] from the [").concat(this.name,"]")),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(var r=0;r').concat("default"===e?r.get("Default"):e,"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Aspect Ratio"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.aspectRatio=n,e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j6SRT:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Close"),click:function(e){e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cyTC8:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.FLIP.map(function(e){return'').concat(r.get((0,i.capitalize)(e)),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Video Flip"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.flip=n.toLowerCase(),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cU7aj:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Video Info"),click:function(e){t.info.show=!0,e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"01vHs":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.PLAYBACK_RATE.map(function(e){return'').concat(1===e?r.get("Normal"):e.toFixed(1),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Play Speed"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.playbackRate=Number(n),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",function(){var r=(0,i.queryAll)("span",e).find(function(e){return Number(e.dataset.value)===t.playbackRate});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"64r3r":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return function(e){return(0,s._)((0,a._)({},e),{html:'ArtPlayer '.concat(i.version,"")})}});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../../package.json")},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../../package.json":"2Jf7W","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9MunV":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return R});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_get.cjs"),u=e("@swc/helpers/cjs/_get_prototype_of.cjs"),p=e("@swc/helpers/cjs/_inherits.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),d=e("../utils"),h=e("../utils/component"),m=o.interopDefault(h),v=e("./airplay"),g=o.interopDefault(v),y=e("./fullscreen"),b=o.interopDefault(y),j=e("./fullscreenWeb"),w=o.interopDefault(j),_=e("./pip"),x=o.interopDefault(_),k=e("./playAndPause"),M=o.interopDefault(k),S=e("./progress"),E=o.interopDefault(S),I=e("./screenshot"),T=o.interopDefault(I),L=e("./setting"),C=o.interopDefault(L),O=e("./time"),D=o.interopDefault(O),F=e("./volume"),A=o.interopDefault(F),R=function(e){"use strict";function t(e){(0,i._)(this,t),(r=(0,s._)(this,t,[e])).isHover=!1,r.name="control",r.timer=Date.now();var r,n=e.constructor,o=r.art.template,a=o.$player,c=o.$bottom;return e.on("mousemove",function(){d.isMobile||(r.show=!0)}),e.on("click",function(){d.isMobile?r.toggle():r.show=!0}),e.on("document:mousemove",function(e){r.isHover=(0,d.includeFromEvent)(e,c)}),e.on("video:timeupdate",function(){!e.setting.show&&!r.isHover&&!e.isInput&&e.playing&&r.show&&Date.now()-r.timer>=n.CONTROL_HIDE_TIME&&(r.show=!1)}),e.on("control",function(e){e?((0,d.removeClass)(a,"art-hide-cursor"),(0,d.addClass)(a,"art-hover"),r.timer=Date.now()):((0,d.addClass)(a,"art-hide-cursor"),(0,d.removeClass)(a,"art-hover"))}),r.init(),r}return(0,p._)(t,e),(0,c._)(t,[{key:"init",value:function(){var e=this,t=this.art.option;t.isLive||this.add((0,E.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,M.default)({name:"playAndPause",position:"left",index:10})),this.add((0,A.default)({name:"volume",position:"left",index:20})),t.isLive||this.add((0,D.default)({name:"time",position:"left",index:30})),t.quality.length&&(0,d.sleep)().then(function(){e.art.quality=t.quality}),t.screenshot&&!d.isMobile&&this.add((0,T.default)({name:"screenshot",position:"right",index:20})),t.setting&&this.add((0,C.default)({name:"setting",position:"right",index:30})),t.pip&&this.add((0,x.default)({name:"pip",position:"right",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,g.default)({name:"airplay",position:"right",index:50})),t.fullscreenWeb&&this.add((0,w.default)({name:"fullscreenWeb",position:"right",index:60})),t.fullscreen&&this.add((0,b.default)({name:"fullscreen",position:"right",index:70}));for(var r=0;rt.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r}function u(e,t,r,n){var o,s=arguments.length,i=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(("undefined"==typeof Reflect?"undefined":(0,a._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(i=(s<3?o(i):s>3?o(t,r,i):o(t,r))||i);return s>3&&i&&Object.defineProperty(t,r,i),i}function p(e,t){return function(r,n){t(r,n,e)}}function f(e,t,r,n,o,s){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var c,l=n.kind,u="getter"===l?"get":"setter"===l?"set":"value",p=!t&&e?n.static?e:e.prototype:null,f=t||(p?Object.getOwnPropertyDescriptor(p,n.name):{}),d=!1,h=r.length-1;h>=0;h--){var m={};for(var v in n)m[v]="access"===v?{}:n[v];for(var v in n.access)m.access[v]=n.access[v];m.addInitializer=function(e){if(d)throw TypeError("Cannot add initializers after decoration has completed");s.push(i(e||null))};var g=(0,r[h])("accessor"===l?{get:f.get,set:f.set}:f[u],m);if("accessor"===l){if(void 0===g)continue;if(null===g||(void 0===g?"undefined":(0,a._)(g))!=="object")throw TypeError("Object expected");(c=i(g.get))&&(f.get=c),(c=i(g.set))&&(f.set=c),(c=i(g.init))&&o.unshift(c)}else(c=i(g))&&("field"===l?o.unshift(c):f[u]=c)}p&&Object.defineProperty(p,n.name,f),d=!0}function d(e,t,r){for(var n=arguments.length>2,o=0;o0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function _(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return s}function x(){for(var e=[],t=0;t1||i(e,t)})},t&&(n[e]=t(n[e])))}function i(e,t){try{var r;(r=o[e](t)).value instanceof S?Promise.resolve(r.value.v).then(c,l):u(a[0][2],r)}catch(e){u(a[0][3],e)}}function c(e){i("next",e)}function l(e){i("throw",e)}function u(e,t){e(t),a.shift(),a.length&&i(a[0][0],a[0][1])}}function I(e){var t,r;return t={},n("next"),n("throw",function(e){throw e}),n("return"),t[Symbol.iterator]=function(){return this},t;function n(n,o){t[n]=e[n]?function(t){return(r=!r)?{value:S(e[n](t)),done:!1}:o?o(t):t}:o}}function T(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e=w(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise(function(n,o){var a,s,i;a=n,s=o,i=(t=e[r](t)).done,Promise.resolve(t.value).then(function(e){a({value:e,done:i})},s)})}}}function L(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},O=function(e){return(O=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)};function D(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=O(e),n=0;n\n
\n
\n
\n
\n
\n
\n\n ',mounted:function(e){var a=null,s=!1,u=(0,i.query)(".art-progress-hover",e),p=(0,i.query)(".art-progress-loaded",e),f=(0,i.query)(".art-progress-played",e),d=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function v(r,n){var o=n||c(t,r),a=o.width;m.textContent=o.time;var s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-s,"px")):(0,i.setStyle)(m,"left","".concat(a-s/2,"px"))}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,n,o){var s="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(p,"width","".concat(100*n,"%")),"hover"===r&&(0,i.setStyle)(u,"width","".concat(100*n,"%")),"played"===r&&((0,i.setStyle)(f,"width","".concat(100*n,"%")),(0,i.setStyle)(h,"left","".concat(100*n,"%"))),s&&((0,i.setStyle)(m,"display","flex"),v(o,{width:e.clientWidth*n,time:(0,i.secondToTime)(n*t.duration)}),clearTimeout(a),a=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){d.textContent="";for(var e=0;e');(0,i.append)(d,a)}}),t.constructor.USE_RAF?t.on("raf",function(){t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",function(){t.emit("setBar","played",t.played)}),t.on("video:progress",function(){t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",function(){t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",function(e){e.target!==h&&l(t,e)}),o(e,"mousemove",function(r){var n,o,a=c(t,r).percentage;(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,d))?(n=c(t,r).width,m.textContent=r.target.dataset.text,n<=(o=m.clientWidth)/2?(0,i.setStyle)(m,"left",0):n>e.clientWidth-o/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-o,"px")):(0,i.setStyle)(m,"left","".concat(n-o/2,"px"))):v(r)}),o(e,"mouseleave",function(e){(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",function(e){s=0===e.button}),t.on("document:mousemove",function(e){if(s){var r=c(t,e),n=r.second,o=r.percentage;t.emit("setBar","played",o,e),t.seek=n}}),t.on("document:mouseup",function(){s&&(s=!1)}))}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4LBtY":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Screenshot"),mounted:function(e){var r=t.proxy,n=t.icons;(0,i.append)(e,n.screenshot),r(e,"click",function(){t.screenshot()})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hXIX5:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Show Setting"),mounted:function(e){var r=t.proxy,n=t.icons,o=t.i18n;(0,i.append)(e,n.setting),r(e,"click",function(){t.setting.toggle(),t.setting.resize()}),t.on("setting",function(t){(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7Zm5j":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:function(e){function r(){var r="".concat((0,i.secondToTime)(t.currentTime)," / ").concat((0,i.secondToTime)(t.duration));r!==e.textContent&&(e.textContent=r)}r();for(var n=["video:loadedmetadata","video:timeupdate","video:progress"],o=0;o'),c=(0,i.append)(s,'
'),l=(0,i.append)(c,'
'),u=(0,i.append)(c,'
'),p=(0,i.append)(u,'
'),f=(0,i.append)(p,'
'),d=(0,i.append)(u,'
');function h(e){var t=(0,i.getRect)(u),r=t.top,n=t.height;return 1-(e.clientY-r)/n}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(a,"display","flex"),(0,i.setStyle)(d,"top","100%"),(0,i.setStyle)(f,"top","100%"),l.textContent=0;else{var e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(a,"display","none"),(0,i.setStyle)(d,"top","".concat(100-e,"%")),(0,i.setStyle)(f,"top","".concat(100-e,"%")),l.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",function(){t.muted=!0}),r(a,"click",function(){t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{var v=!1;r(u,"mousedown",function(e){v=0===e.button,t.volume=h(e)}),t.on("document:mousemove",function(e){v&&(t.muted=!1,t.volume=h(e))}),t.on("document:mouseup",function(){v&&(v=!1)})}}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kSrJ9:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("./clickInit"),c=o.interopDefault(i),l=e("./gestureInit"),u=o.interopDefault(l),p=e("./globalInit"),f=o.interopDefault(p),d=e("./hoverInit"),h=o.interopDefault(d),m=e("./moveInit"),v=o.interopDefault(m),g=e("./resizeInit"),y=o.interopDefault(g),b=e("./updateInit"),j=o.interopDefault(b),w=e("./viewInit"),_=o.interopDefault(w),x=function(){"use strict";function e(t){(0,a._)(this,e),this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,c.default)(t,this),(0,h.default)(t,this),(0,v.default)(t,this),(0,y.default)(t,this),(0,u.default)(t,this),(0,_.default)(t,this),(0,f.default)(t,this),(0,j.default)(t,this)}return(0,s._)(e,[{key:"proxy",value:function(e,t,r){var n=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Array.isArray(t))return t.map(function(t){return n.proxy(e,t,r,o)});e.addEventListener(t,r,o);var a=function(){return e.removeEventListener(t,r,o)};return this.destroyEvents.push(a),a}},{key:"hover",value:function(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}},{key:"remove",value:function(e){var t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}},{key:"destroy",value:function(){for(var e=0;eMath.abs(a)&&2>Math.abs(o))return s;var i=180*Math.atan2(o,a)/Math.PI;return i>=-45&&i<45?s=4:i>=45&&i<135?s=1:i>=-135&&i<-45?s=2:(i>=135&&i<=180||i>=-180&&i<-135)&&(s=3),s}(l,u,o,a),d=[3,4].includes(f),h=[1,2].includes(f);if(d&&!e.isRotate||h&&e.isRotate){var m=(0,s.clamp)((o-l)/e.width,-1,1),v=(0,s.clamp)((a-u)/e.height,-1,1),g=e.isRotate?v:m,y=i===n?e.constructor.TOUCH_MOVE_RATIO:1,b=(0,s.clamp)(p+e.duration*g*y,0,e.duration);e.seek=b,e.emit("setBar","played",(0,s.clamp)(b/e.duration,0,1),t),e.notice.show="".concat((0,s.secondToTime)(b)," / ").concat((0,s.secondToTime)(e.duration))}}};e.option.gesture&&(t.proxy(n,"touchstart",function(e){i=n,f(e)}),t.proxy(n,"touchmove",d)),t.proxy(o,"touchstart",function(e){i=o,f(e)}),t.proxy(o,"touchmove",d),e.on("document:touchend",function(){c&&(l=0,u=0,p=0,c=!1,i=null)})}}},{"../control/progress":"lLsXv","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hOg1v:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],n=["resize","scroll","orientationchange"],o=[];function a(){for(var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=0;s'},{}],kX2ah:[function(e,t,r,n){t.exports=''},{}],cYqbE:[function(e,t,r,n){t.exports=''},{}],dCZ1q:[function(e,t,r,n){t.exports=''},{}],enWOR:[function(e,t,r,n){t.exports=''},{}],aEYUh:[function(e,t,r,n){t.exports=''},{}],"6sWtx":[function(e,t,r,n){t.exports=''},{}],bhixJ:[function(e,t,r,n){t.exports=''},{}],aonuB:[function(e,t,r,n){t.exports=''},{}],hbNgp:[function(e,t,r,n){t.exports=''},{}],aNXxH:[function(e,t,r,n){t.exports=''},{}],ezk36:[function(e,t,r,n){t.exports=''},{}],kPsyz:[function(e,t,r,n){t.exports=''},{}],cUJ9T:[function(e,t,r,n){t.exports=''},{}],"9MnDP":[function(e,t,r,n){t.exports=''},{}],gtJ8Q:[function(e,t,r,n){t.exports=''},{}],luvRR:[function(e,t,r,n){t.exports=''},{}],"2VikP":[function(e,t,r,n){t.exports=''},{}],"9eYwu":[function(e,t,r,n){t.exports=''},{}],"5m73X":[function(e,t,r,n){t.exports=''},{}],"2ZLsh":[function(e,t,r,n){t.exports=''},{}],fXkDR:[function(e,t,r,n){t.exports=''},{}],jcnGd:[function(e,t,r,n){t.exports=''},{}],"2QwX5":[function(e,t,r,n){t.exports=''},{}],"9oiD9":[function(e,t,r,n){t.exports=''},{}],"68oNy":[function(e,t,r,n){t.exports=''},{}],j2oAd:[function(e,t,r,n){t.exports=''},{}],"9sVMb":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return p});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("./utils"),u=e("./utils/component"),p=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="info",l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.proxy,n=t.constructor,o=t.template,a=o.$infoPanel,s=o.$infoClose,i=o.$video;r(s,"click",function(){e.show=!1});var c=null,u=(0,l.queryAll)("[data-video]",a)||[];this.art.on("destroy",function(){return clearTimeout(c)}),!function e(){for(var t=0;tu?((0,a.setStyle)(o,"width","".concat(u*l,"px")),(0,a.setStyle)(o,"height","100%"),(0,a.setStyle)(o,"margin","0 auto")):((0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","".concat(c/u,"px")),(0,a.setStyle)(o,"margin","auto 0")),s.dataset.aspectRatio=n}r.show="".concat(t.get("Aspect Ratio"),": ").concat("default"===n?t.get("Default"):n),e.emit("aspectRatio",n)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],rWA5h:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"attr",{value:function(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ekP8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$video;(0,a.def)(e,"autoHeight",{value:function(){var t=r.clientWidth,o=n.videoHeight,s=t/n.videoWidth*o;(0,a.setStyle)(r,"height","".concat(s,"px")),e.emit("autoHeight",s)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3d2R8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$player,o=t.$video;(0,a.def)(e,"autoSize",{value:function(){var t=o.videoWidth,s=o.videoHeight,i=(0,a.getRect)(r),c=i.width,l=i.height,u=t/s;c/l>u?((0,a.setStyle)(n,"width","".concat(l*u/c*100,"%")),(0,a.setStyle)(n,"height","100%")):((0,a.setStyle)(n,"width","100%"),(0,a.setStyle)(n,"height","".concat(c/u/l*100,"%"))),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2nLRH":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$player;(0,a.def)(e,"cssVar",{value:function(e,r){return r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3lhzv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"currentTime",{get:function(){return t.currentTime||0},set:function(r){Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,a.clamp)(r,0,e.duration))}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQmmf:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"duration",{get:function(){var t=e.template.$video.duration;return t===1/0?0:t||0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1KU3q":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return u});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../config"),c=o.interopDefault(i),l=e("../utils");function u(e){for(var t=e.i18n,r=e.notice,n=e.option,o=e.constructor,i=e.proxy,u=e.template,p=u.$player,f=u.$video,d=u.$poster,h=0,m=0;m0&&void 0!==arguments[0]?arguments[0]:document.documentElement,t=arguments.length>1?arguments[1]:void 0;return new Promise(function(r,n){var o=function(){c.off("change",o),r()};c.on("change",o);var a=e[s.requestFullscreen](t);a instanceof Promise&&a.then(o).catch(n)})},exit:function(){return new Promise(function(e,t){if(!c.isFullscreen)return void e();var r=function(){c.off("change",r),e()};c.on("change",r);var n=document[s.exitFullscreen]();n instanceof Promise&&n.then(r).catch(t)})},toggle:function(e,t){return c.isFullscreen?c.exit():c.request(e,t)},onchange:function(e){c.on("change",e)},onerror:function(e){c.on("error",e)},on:function(e,t){var r=i[e];r&&document.addEventListener(r,t,!1)},off:function(e,t){var r=i[e];r&&document.removeEventListener(r,t,!1)},raw:s};Object.defineProperties(c,{isFullscreen:{get:function(){return!!document[s.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[s.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return!!document[s.fullscreenEnabled]}}}),r.default=c},{"@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gIQTH:[function(e,t,r,n){"use strict";var o=e("d7c30a5ae0c1ab2"),a=e("3aacfce52f67defd"),s=e("f0dae09a1a08b16a"),i=e("83f3648e614d0830");r._=function(e,t){return o._(e)||a._(e,t)||i._(e,t)||s._()}},{d7c30a5ae0c1ab2:"3QSPl","3aacfce52f67defd":"5SSeo",f0dae09a1a08b16a:"heYSj","83f3648e614d0830":"fh7mx"}],"3QSPl":[function(e,t,r,n){"use strict";r._=function(e){if(Array.isArray(e))return e}},{}],"5SSeo":[function(e,t,r,n){"use strict";r._=function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],s=!0,i=!1;try{for(o=o.call(e);!(s=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);s=!0);}catch(e){i=!0,n=e}finally{try{s||null==o.return||o.return()}finally{if(i)throw n}}return a}}},{}],heYSj:[function(e,t,r,n){"use strict";r._=function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},{}],itVYl:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.template,n=r.$container,o=r.$player,s="";(0,a.def)(e,"fullscreenWeb",{get:function(){return(0,a.hasClass)(o,"art-fullscreen-web")},set:function(r){r?(s=o.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(document.body,o),e.state="fullscreenWeb",(0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","100%"),(0,a.addClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(n,o),s&&(o.style.cssText=s,s=""),(0,a.removeClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],dE0YW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"loaded",{get:function(){return e.loadedTime/t.duration}}),(0,a.def)(e,"loadedTime",{get:function(){return t.buffered.length?t.buffered.end(t.buffered.length-1):0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kwpHL:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.icons,r=e.proxy,n=e.storage,o=e.template,s=o.$player,i=o.$video,c=!1,l=0,u=0;function p(){var t=e.template.$mini;t&&((0,a.removeClass)(s,"art-mini"),(0,a.setStyle)(t,"display","none"),s.prepend(i),e.emit("mini",!1))}function f(t,r){e.playing?((0,a.setStyle)(t,"display","none"),(0,a.setStyle)(r,"display","flex")):((0,a.setStyle)(t,"display","flex"),(0,a.setStyle)(r,"display","none"))}function d(){var t=e.template.$mini,r=(0,a.getRect)(t),o=window.innerHeight-r.height-50,s=window.innerWidth-r.width-50;n.set("top",o),n.set("left",s),(0,a.setStyle)(t,"top","".concat(o,"px")),(0,a.setStyle)(t,"left","".concat(s,"px"))}(0,a.def)(e,"mini",{get:function(){return(0,a.hasClass)(s,"art-mini")},set:function(o){if(o){e.state="mini",(0,a.addClass)(s,"art-mini");var h=function(){var o=e.template.$mini;if(o)return(0,a.append)(o,i),(0,a.setStyle)(o,"display","flex");var s=(0,a.createElement)("div");(0,a.addClass)(s,"art-mini-popup"),(0,a.append)(document.body,s),e.template.$mini=s,(0,a.append)(s,i);var d=(0,a.append)(s,'
');(0,a.append)(d,t.close),r(d,"click",p);var h=(0,a.append)(s,'
'),m=(0,a.append)(h,t.play),v=(0,a.append)(h,t.pause);return r(m,"click",function(){return e.play()}),r(v,"click",function(){return e.pause()}),f(m,v),e.on("video:playing",function(){return f(m,v)}),e.on("video:pause",function(){return f(m,v)}),e.on("video:timeupdate",function(){return f(m,v)}),r(s,"mousedown",function(e){c=0===e.button,l=e.pageX,u=e.pageY}),e.on("document:mousemove",function(e){if(c){(0,a.addClass)(s,"art-mini-dragging");var t=e.pageX-l,r=e.pageY-u;(0,a.setStyle)(s,"transform","translate(".concat(t,"px, ").concat(r,"px)"))}}),e.on("document:mouseup",function(){if(c){c=!1,(0,a.removeClass)(s,"art-mini-dragging");var e=(0,a.getRect)(s);n.set("left",e.left),n.set("top",e.top),(0,a.setStyle)(s,"left","".concat(e.left,"px")),(0,a.setStyle)(s,"top","".concat(e.top,"px")),(0,a.setStyle)(s,"transform",null)}}),s}(),m=n.get("top"),v=n.get("left");"number"==typeof m&&"number"==typeof v?((0,a.setStyle)(h,"top","".concat(m,"px")),(0,a.setStyle)(h,"left","".concat(v,"px")),(0,a.isInViewport)(h)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"72iXq":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.option,r=e.storage,n=e.template,o=n.$video,s=n.$poster;for(var i in t.moreVideoAttr)e.attr(i,t.moreVideoAttr[i]);t.muted&&(e.muted=t.muted),t.volume&&(o.volume=(0,a.clamp)(t.volume,0,1));var c=r.get("volume");for(var l in"number"==typeof c&&(o.volume=(0,a.clamp)(c,0,1)),t.poster&&(0,a.setStyle)(s,"backgroundImage","url(".concat(t.poster,")")),t.autoplay&&(o.autoplay=t.autoplay),t.playsInline&&(o.playsInline=!0,o["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(l,t.cssVar[l]);e.url=t.url}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1B8xv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"pause",{value:function(){var o=t.pause();return n.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2ayfA":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t,r,n,o,s=e.i18n,i=e.notice,c=e.template.$video;document.pictureInPictureEnabled?(t=e.template.$video,r=e.proxy,n=e.notice,t.disablePictureInPicture=!1,(0,a.def)(e,"pip",{get:function(){return document.pictureInPictureElement},set:function(r){r?(e.state="pip",t.requestPictureInPicture().catch(function(e){throw n.show=e,e})):document.exitPictureInPicture().catch(function(e){throw n.show=e,e})}}),r(t,"enterpictureinpicture",function(){e.emit("pip",!0)}),r(t,"leavepictureinpicture",function(){e.emit("pip",!1)})):c.webkitSupportsPresentationMode?((o=e.template.$video).webkitSetPresentationMode("inline"),(0,a.def)(e,"pip",{get:function(){return"picture-in-picture"===o.webkitPresentationMode},set:function(t){t?(e.state="pip",o.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(o.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})):(0,a.def)(e,"pip",{get:function(){return!1},set:function(){i.show=s.get("PIP Not Supported")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4pWSp":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"playbackRate",{get:function(){return t.playbackRate},set:function(o){o?o!==t.playbackRate&&(t.playbackRate=o,n.show="".concat(r.get("Rate"),": ").concat(1===o?r.get("Normal"):"".concat(o,"x"))):e.playbackRate=1}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3GKs4":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"played",{get:function(){return e.currentTime/e.duration}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],in83u:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"playing",{get:function(){return"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cVJNG:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.i18n,r=e.notice,n=e.option,o=e.constructor.instances,c=e.template.$video;(0,i.def)(e,"play",{value:function(){return(0,a._)(function(){var a,i,l;return(0,s._)(this,function(s){switch(s.label){case 0:return[4,c.play()];case 1:if(a=s.sent(),r.show=t.get("Play"),e.emit("play"),n.mutex)for(i=0;i0&&jo.clientWidth-m/2?(0,i.setStyle)(a,"left","".concat(o.clientWidth-m,"px")):(0,i.setStyle)(a,"left","".concat(t-m/2,"px"))}}(j):i.isMobile||(0,i.setStyle)(m,"display","none"),b&&(clearTimeout(l),l=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500)),s.label=3;case 3:return[2]}})})()}),(0,i.def)(e,"thumbnails",{get:function(){return e.option.thumbnails},set:function(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(l),l=null,u=null,p=!1,f=!1)}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],bdo2A:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"toggle",{value:function(){return e.playing?e.pause():e.play()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7uOqt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"type",{get:function(){return e.option.type},set:function(t){e.option.type=t}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4QAa0":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.option,r=e.template.$video;(0,i.def)(e,"url",{get:function(){return r.src},set:function(n){return(0,a._)(function(){var o,a,c;return(0,s._)(this,function(s){switch(s.label){case 0:if(!n)return[3,4];if(o=e.url,a=t.type||(0,i.getExt)(n),c=t.customType[a],!(a&&c))return[3,2];return[4,(0,i.sleep)()];case 1:return s.sent(),e.loading.show=!0,c.call(e,r,n,e),[3,3];case 2:URL.revokeObjectURL(o),r.src=n,s.label=3;case 3:return o!==e.url&&(e.option.url=n,e.isReady&&o&&e.once("video:canplay",function(){e.emit("restart",n)})),[3,6];case 4:return[4,(0,i.sleep)()];case 5:s.sent(),e.loading.show=!0,s.label=6;case 6:return[2]}})})()}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3sLEt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice,o=e.storage;(0,a.def)(e,"volume",{get:function(){return t.volume||0},set:function(e){t.volume=(0,a.clamp)(e,0,1),n.show="".concat(r.get("Volume"),": ").concat(Number.parseInt(100*t.volume,10)),0!==t.volume&&o.set("volume",t.volume)}}),(0,a.def)(e,"muted",{get:function(){return t.muted},set:function(r){t.muted=r,e.emit("muted",r)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"83Crr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return y});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../utils"),c=e("./autoOrientation"),l=o.interopDefault(c),u=e("./autoPlayback"),p=o.interopDefault(u),f=e("./fastForward"),d=o.interopDefault(f),h=e("./lock"),m=o.interopDefault(h),v=e("./miniProgressBar"),g=o.interopDefault(v),y=function(){"use strict";function e(t){(0,a._)(this,e),this.art=t,this.id=0;var r=t.option;r.miniProgressBar&&!r.isLive&&this.add(g.default),r.lock&&i.isMobile&&this.add(m.default),r.autoPlayback&&!r.isLive&&this.add(p.default),r.autoOrientation&&i.isMobile&&this.add(l.default),r.fastForward&&i.isMobile&&!r.isLive&&this.add(d.default);for(var n=0;nt&&rn}return e.on("fullscreenWeb",function(t){if(t){if(f()){var n;setTimeout(function(){var t,r;e.fullscreenWeb&&!(0,i.hasClass)(o,l)&&(t=document.documentElement.clientWidth,r=document.documentElement.clientHeight,(0,i.setStyle)(o,"width","".concat(r,"px")),(0,i.setStyle)(o,"height","".concat(t,"px")),(0,i.setStyle)(o,"transform-origin","0 0"),(0,i.setStyle)(o,"transform","rotate(90deg) translate(0, -".concat(t,"px)")),(0,i.addClass)(o,l),e.isRotate=!0,e.emit("resize"))},Number(null!=(n=r.AUTO_ORIENTATION_TIME)?n:0))}}else(0,i.hasClass)(o,l)&&((0,i.setStyle)(o,"width",""),(0,i.setStyle)(o,"height",""),(0,i.setStyle)(o,"transform-origin",""),(0,i.setStyle)(o,"transform",""),(0,i.removeClass)(o,l),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",function(e){return(0,a._)(function(){var r,n,a,c,l;return(0,s._)(this,function(s){switch(s.label){case 0:if(a=!!(null==(n=screen)||null==(r=n.orientation)?void 0:r.lock),!e)return[3,5];if(!(a&&f()))return[3,4];s.label=1;case 1:return s.trys.push([1,3,,4]),c=screen.orientation.type.startsWith("portrait")?"landscape":"portrait",[4,screen.orientation.lock(c)];case 2:return s.sent(),p=!0,(0,i.addClass)(o,u),[3,4];case 3:return l=s.sent(),p=!1,t.show=l,[3,4];case 4:return[3,6];case 5:if((0,i.hasClass)(o,u)&&(0,i.removeClass)(o,u),a&&p){try{screen.orientation.unlock()}catch(e){}p=!1}s.label=6;case 6:return[2]}})})()}),{name:"autoOrientation",get state(){return(0,i.hasClass)(o,l)}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"76uK8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.i18n,r=e.icons,n=e.storage,o=e.constructor,s=e.proxy,i=e.template.$poster,c=e.layers.add({name:"auto-playback",html:'\n
\n
\n
\n '}),l=(0,a.query)(".art-auto-playback-last",c),u=(0,a.query)(".art-auto-playback-jump",c),p=(0,a.query)(".art-auto-playback-close",c);(0,a.append)(p,r.close);var f=null;function d(){var r=(n.get("times")||{})[e.option.id||e.option.url];clearTimeout(f),(0,a.setStyle)(c,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,a.setStyle)(c,"display","flex"),l.textContent="".concat(t.get("Last Seen")," ").concat((0,a.secondToTime)(r)),u.textContent=t.get("Jump Play"),s(p,"click",function(){(0,a.setStyle)(c,"display","none")}),s(u,"click",function(){e.seek=r,e.play(),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(c,"display","none")}),e.once("video:timeupdate",function(){f=setTimeout(function(){(0,a.setStyle)(c,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",function(){if(e.playing){var t=n.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,n.set("times",t)}}),e.on("ready",d),e.on("restart",d),{name:"auto-playback",get times(){return n.get("times")||{}},clear:function(){return n.del("times")},delete:function(e){var t=n.get("times")||{};return delete t[e],n.set("times",t),t}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gLGPW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.proxy,n=e.template,o=n.$player,s=n.$video,i=null,c=!1,l=1,u=function(){clearTimeout(i),c&&(c=!1,e.playbackRate=l,(0,a.removeClass)(o,"art-fast-forward"))};return r(s,"touchstart",function(r){1===r.touches.length&&e.playing&&!e.isLock&&(i=setTimeout(function(){c=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,a.addClass)(o,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",u),e.on("document:touchend",u),{name:"fastForward",get state(){return(0,a.hasClass)(o,"art-fast-forward")}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9btcI":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.layers,r=e.icons,n=e.template.$player;function o(){return(0,a.hasClass)(n,"art-lock")}function s(){(0,a.addClass)(n,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function i(){(0,a.removeClass)(n,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted:function(t){var n=(0,a.append)(t,r.lock),o=(0,a.append)(t,r.unlock);(0,a.setStyle)(n,"display","none"),e.on("lock",function(e){e?((0,a.setStyle)(n,"display","inline-flex"),(0,a.setStyle)(o,"display","none")):((0,a.setStyle)(n,"display","none"),(0,a.setStyle)(o,"display","inline-flex"))})},click:function(){o()?i():s()}}),{name:"lock",get state(){return o()},set state(value){value?s():i()}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iSnmg:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){return e.on("control",function(t){t?(0,a.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,a.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4ARoj":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),u=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("../utils"),d=e("../utils/component"),h=o.interopDefault(d),m=e("./aspectRatio"),v=o.interopDefault(m),g=e("./flip"),y=o.interopDefault(g),b=e("./playbackRate"),j=o.interopDefault(b),w=e("./subtitleOffset"),_=o.interopDefault(w),x=function(e){"use strict";function t(e){(0,i._)(this,t);var r=(0,s._)(this,t,[e]),n=e.option,o=e.controls,a=e.template.$setting;return r.name="setting",r.$parent=a,r.id=0,r.active=null,r.cache=new Map,r.option=(0,u._)(r.builtin).concat((0,u._)(n.settings)),n.setting&&(r.format(),r.render(),e.on("blur",function(){r.show&&(r.show=!1,r.render())}),e.on("focus",function(e){var t=(0,f.includeFromEvent)(e,o.setting),n=(0,f.includeFromEvent)(e,r.$parent);!r.show||t||n||(r.show=!1,r.render())}),e.on("resize",function(){return r.resize()})),r}return(0,l._)(t,e),(0,c._)(t,[{key:"builtin",get:function(){var e=[],t=this.art.option;return t.playbackRate&&e.push((0,j.default)(this.art)),t.aspectRatio&&e.push((0,v.default)(this.art)),t.flip&&e.push((0,y.default)(this.art)),t.subtitleOffset&&e.push((0,_.default)(this.art)),e}},{key:"traverse",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.option,r=0;r0&&void 0!==arguments[0]?arguments[0]:this.option,r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=0;a0&&void 0!==arguments[0]?arguments[0]:"",t=null;return this.traverse(function(r){r.name===e&&(t=r)}),t}},{key:"resize",value:function(){var e=this.art,t=e.controls,r=e.constructor,n=r.SETTING_WIDTH,o=r.SETTING_ITEM_HEIGHT,a=e.template,s=a.$player,i=a.$setting;if(t.setting&&this.show){var c,l,u=(null==(l=this.active[0])||null==(c=l.$parent)?void 0:c.width)||n,p=(0,f.getRect)(t.setting),d=p.left,h=p.width,m=(0,f.getRect)(s),v=m.left,g=m.width,y=d-v+h/2-u/2,b=this.active===this.option?this.active.length*o:(this.active.length+1)*o;if((0,f.setStyle)(i,"height","".concat(b,"px")),(0,f.setStyle)(i,"width","".concat(u,"px")),this.art.isRotate||f.isMobile)return;y+u>g?((0,f.setStyle)(i,"left",null),(0,f.setStyle)(i,"right",null)):((0,f.setStyle)(i,"left","".concat(y,"px")),(0,f.setStyle)(i,"right","auto"))}}},{key:"inactivate",value:function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:this.option;return t.push(e),this.format(),this.createItem(e),this.render(),e}},{key:"createHeader",value:function(e){var t=this;if(this.cache.has(e.$option)){var r=this.cache.get(e.$option),n=this.art,o=n.proxy,a=n.icons.arrowLeft,s=n.constructor.SETTING_ITEM_HEIGHT,i=(0,f.createElement)("div");(0,f.setStyle)(i,"height","".concat(s,"px")),(0,f.addClass)(i,"art-setting-item"),(0,f.addClass)(i,"art-setting-item-back");var c=(0,f.append)(i,'
'),l=(0,f.createElement)("div");(0,f.addClass)(l,"art-setting-item-left-icon"),(0,f.append)(l,a),(0,f.append)(c,l),(0,f.append)(c,e.$parent.html);var u=o(i,"click",function(){return t.render(e.$parents)});e.$parent.$events.push(u),(0,f.append)(r,i)}}},{key:"createItem",value:function(e){var t,r,n=this,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.cache.has(e.$option)){var s=this.cache.get(e.$option),i=e.$item,c="selector";(0,f.has)(e,"switch")&&(c="switch"),(0,f.has)(e,"range")&&(c="range"),(0,f.has)(e,"onClick")&&(c="button");var l=this.art,d=l.icons,h=l.proxy,m=l.constructor,v=(0,f.createElement)("div");(0,f.addClass)(v,"art-setting-item"),(0,f.setStyle)(v,"height","".concat(m.SETTING_ITEM_HEIGHT,"px")),v.dataset.name=e.name||"",v.dataset.value=e.value||"";var g=(0,f.append)(v,'
'),y=(0,f.append)(v,'
'),b=(0,f.createElement)("div");switch((0,f.addClass)(b,"art-setting-item-left-icon"),c){case"button":case"switch":case"range":(0,f.append)(b,e.icon||d.config);break;case"selector":(null==(t=e.selector)?void 0:t.length)?(0,f.append)(b,e.icon||d.config):(0,f.append)(b,d.check)}(0,f.append)(g,b),(0,f.def)(e,"$icon",{configurable:!0,get:function(){return b}}),(0,f.def)(e,"icon",{configurable:!0,get:function(){return b.innerHTML},set:function(e){b.innerHTML="",(0,f.append)(b,e)}});var j=(0,f.createElement)("div");(0,f.addClass)(j,"art-setting-item-left-text"),(0,f.append)(j,e.html||""),(0,f.append)(g,j),(0,f.def)(e,"$html",{configurable:!0,get:function(){return j}}),(0,f.def)(e,"html",{configurable:!0,get:function(){return j.innerHTML},set:function(e){j.innerHTML="",(0,f.append)(j,e)}});var w=(0,f.createElement)("div");switch((0,f.addClass)(w,"art-setting-item-right-tooltip"),(0,f.append)(w,e.tooltip||""),(0,f.append)(y,w),(0,f.def)(e,"$tooltip",{configurable:!0,get:function(){return w}}),(0,f.def)(e,"tooltip",{configurable:!0,get:function(){return w.innerHTML},set:function(e){w.innerHTML="",(0,f.append)(w,e)}}),c){case"switch":var _=(0,f.createElement)("div");(0,f.addClass)(_,"art-setting-item-right-icon");var x=(0,f.append)(_,d.switchOn),k=(0,f.append)(_,d.switchOff);(0,f.setStyle)(e.switch?k:x,"display","none"),(0,f.append)(y,_),(0,f.def)(e,"$switch",{configurable:!0,get:function(){return _}});var M=e.switch;(0,f.def)(e,"switch",{configurable:!0,get:function(){return M},set:function(e){M=e,e?((0,f.setStyle)(k,"display","none"),(0,f.setStyle)(x,"display",null)):((0,f.setStyle)(k,"display",null),(0,f.setStyle)(x,"display","none"))}});break;case"range":var S=(0,f.createElement)("div");(0,f.addClass)(S,"art-setting-item-right-icon");var E=(0,f.append)(S,'');E.value=e.range[0],E.min=e.range[1],E.max=e.range[2],E.step=e.range[3],(0,f.addClass)(E,"art-setting-range"),(0,f.append)(y,S),(0,f.def)(e,"$range",{configurable:!0,get:function(){return E}});var I=(0,u._)(e.range);(0,f.def)(e,"range",{configurable:!0,get:function(){return I},set:function(e){I=(0,u._)(e),E.value=e[0],E.min=e[1],E.max=e[2],E.step=e[3]}});break;case"selector":if(null==(r=e.selector)?void 0:r.length){var T=(0,f.createElement)("div");(0,f.addClass)(T,"art-setting-item-right-icon"),(0,f.append)(T,d.arrowRight),(0,f.append)(y,T)}}switch(c){case"switch":if(e.onSwitch){var L=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onSwitch.call(this.art,e,v,t)];case 1:return e.switch=r.sent(),[2]}})}).call(n)});e.$events.push(L)}break;case"range":if(e.$range){if(e.onRange){var C=h(e.$range,"change",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onRange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(C)}if(e.onChange){var O=h(e.$range,"input",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onChange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(O)}}break;case"selector":var D=h(v,"click",function(t){return(0,a._)(function(){var r,n;return(0,p._)(this,function(o){switch(o.label){case 0:if(!(null==(r=e.selector)?void 0:r.length))return[3,1];return this.render(e.selector),[3,3];case 1:if(this.check(e),!e.$parent.onSelect)return[3,3];return n=e.$parent,[4,e.$parent.onSelect.call(this.art,e,v,t)];case 2:n.tooltip=o.sent(),o.label=3;case 3:return[2]}})}).call(n)});e.$events.push(D),e.default&&(0,f.addClass)(v,"art-current");break;case"button":if(e.onClick){var F=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onClick.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(F)}}(0,f.def)(e,"$item",{configurable:!0,get:function(){return v}}),o?(0,f.replaceElement)(v,i):(0,f.append)(s,v),e.mounted&&setTimeout(function(){return e.mounted.call(n.art,e.$item,e)},0)}}},{key:"render",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.option;if(this.active=e,this.cache.has(e)){var t=this.cache.get(e);(0,f.inverseClass)(t,"art-current")}else{var r,n=(0,f.createElement)("div");this.cache.set(e,n),(0,f.addClass)(n,"art-setting-panel"),(0,f.append)(this.$parent,n),(0,f.inverseClass)(n,"art-current"),(null==(r=e[0])?void 0:r.$parent)&&this.createHeader(e[0]);for(var o=0;o\n ').concat(t.escape?(0,y.escape)(e):e,"\n")}).join("")}).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}},{key:"switch",value:function(e){return(0,a._)(function(e){var t,r,n,o,a,s,i,c=arguments;return(0,d._)(this,function(l){switch(l.label){case 0:return t=c.length>1&&void 0!==c[1]?c[1]:{},n=(r=this.art).i18n,o=r.notice,a=r.option,s=(0,p._)((0,u._)({},a.subtitle,t),{url:e}),[4,this.init(s)];case 1:return i=l.sent(),t.name&&(o.show="".concat(n.get("Switch Subtitle"),": ").concat(t.name)),[2,i]}})}).apply(this,arguments)}},{key:"createTrack",value:function(e,t){var r=this,n=this.art,o=n.template,a=n.proxy,s=n.option,i=o.$video,c=o.$track,l=(0,y.createElement)("track");l.default=!0,l.kind=e,l.src=t,l.label=s.subtitle.name||"Artplayer",l.track.mode="hidden",l.onload=function(){r.art.emit("subtitleLoad",r.cues,r.option)},this.art.events.remove(this.destroyEvent),c.onload=null,(0,y.remove)(c),(0,y.append)(i,l),o.$track=l,this.destroyEvent=a(this.textTrack,"cuechange",function(){return r.update()})}},{key:"init",value:function(e){return(0,a._)(function(){var t,r,n,o;return(0,d._)(this,function(a){return(t=this,n=(r=this.art).notice,o=r.template.$subtitle,this.textTrack)?((0,m.default)(e,g.default.subtitle),e.url)?(this.option=e,this.style(e.style),[2,fetch(e.url).then(function(e){return e.arrayBuffer()}).then(function(t){var r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,y.getExt)(e.url)){case"srt":var n=(0,y.srtToVtt)(r),o=e.onVttLoad(n);return(0,y.vttToBlob)(o);case"ass":var a=(0,y.assToVtt)(r),s=e.onVttLoad(a);return(0,y.vttToBlob)(s);case"vtt":var i=e.onVttLoad(r);return(0,y.vttToBlob)(i);default:return e.url}}).then(function(e){return o.innerHTML="",t.url===e||(URL.revokeObjectURL(t.url),t.createTrack("metadata",e)),e}).catch(function(e){throw o.innerHTML="",n.show=e,e})]):[2]:[2,null]})}).call(this)}}]),t}(o.interopDefault(b).default)},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","option-validator":"8zKz5","./scheme":"3Srhh","./utils":"hQMLb","./utils/component":"hXsfe","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],jkHHJ:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return l});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../package.json"),c=e("./utils"),l=function(){"use strict";function e(t){var r=this;(0,a._)(this,e),this.art=t;var n=t.option,o=t.constructor;n.container instanceof Element?this.$container=n.container:(this.$container=(0,c.query)(n.container),(0,c.errorHandle)(this.$container,"No container element found by ".concat(n.container))),(0,c.errorHandle)((0,c.supportsFlex)(),"The current browser does not support flex layout");var s=this.$container.tagName.toLowerCase();(0,c.errorHandle)("div"===s,"Unsupported container element type, only support 'div' but got '".concat(s,"'")),(0,c.errorHandle)(o.instances.every(function(e){return e.template.$container!==r.$container}),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}return(0,s._)(e,[{key:"query",value:function(e){return(0,c.query)(e,this.$container)}},{key:"init",value:function(){var t=this.art.option;if(t.useSSR||(this.$container.innerHTML=e.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),t.proxy){var r=t.proxy.call(this.art,this.art);(0,c.errorHandle)(r instanceof HTMLVideoElement||r instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,c.replaceElement)(r,this.$video),r.className="art-video",this.$video=r}t.backdrop&&(0,c.addClass)(this.$player,"art-backdrop"),c.isMobile&&(0,c.addClass)(this.$player,"art-mobile")}},{key:"destroy",value:function(e){e?this.$container.innerHTML="":(0,c.addClass)(this.$player,"art-destroy")}}],[{key:"html",get:function(){return'\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Player version:
\n
'.concat(i.version,'
\n
\n
\n
Video url:
\n
\n
\n
\n
Video volume:
\n
\n
\n
\n
Video time:
\n
\n
\n
\n
Video duration:
\n
\n
\n
\n
Video resolution:
\n
\nx\n
\n
\n
\n
[x]
\n
\n
\n
\n ')}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","../package.json":"2Jf7W","./utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ikoiH:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=function(){"use strict";function e(){(0,a._)(this,e)}return(0,s._)(e,[{key:"on",value:function(e,t,r){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:t,ctx:r}),this}},{key:"once",value:function(e,t,r){var n=this;function o(){for(var a=arguments.length,s=Array(a),i=0;i1?t-1:0),n=1;n").concat(e))};i("Version@".concat(t.version));for(var c=0;c0)||void 0===arguments[0]||arguments[0];t.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),er.splice(er.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}],[{key:"instances",get:function(){return er}},{key:"version",get:function(){return d.version}},{key:"config",get:function(){return m.default}},{key:"utils",get:function(){return K}},{key:"scheme",get:function(){return V.default}},{key:"Emitter",get:function(){return ee.default}},{key:"validator",get:function(){return f.default}},{key:"kindOf",get:function(){return f.default.kindOf}},{key:"html",get:function(){return Z.default.html}},{key:"option",get:function(){var e;return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:function(e){return e}},moreVideoAttr:{controls:!1,preload:K.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==(e=navigator)?void 0:e.language.toLowerCase()}}}]),t}(ee.default);en.STYLE=u.default,en.DEBUG=!1,en.CONTEXTMENU=!0,en.NOTICE_TIME=2e3,en.SETTING_WIDTH=250,en.SETTING_ITEM_WIDTH=200,en.SETTING_ITEM_HEIGHT=35,en.RESIZE_TIME=200,en.SCROLL_TIME=200,en.SCROLL_GAP=50,en.AUTO_PLAYBACK_MAX=10,en.AUTO_PLAYBACK_MIN=5,en.AUTO_PLAYBACK_TIMEOUT=3e3,en.RECONNECT_TIME_MAX=5,en.RECONNECT_SLEEP_TIME=1e3,en.CONTROL_HIDE_TIME=3e3,en.DBCLICK_TIME=300,en.DBCLICK_FULLSCREEN=!0,en.MOBILE_DBCLICK_PLAY=!0,en.MOBILE_CLICK_PLAY=!1,en.AUTO_ORIENTATION_TIME=200,en.INFO_LOOP_TIME=1e3,en.FAST_FORWARD_VALUE=3,en.FAST_FORWARD_TIME=1e3,en.TOUCH_MOVE_RATIO=.5,en.VOLUME_STEP=.1,en.SEEK_STEP=5,en.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],en.ASPECT_RATIO=["default","4:3","16:9"],en.FLIP=["normal","horizontal","vertical"],en.FULLSCREEN_WEB_IN_BODY=!0,en.LOG_VERSION=!0,en.USE_RAF=!1,en.REMOVE_SRC_WHEN_DESTROY=!0,K.isBrowser&&(window.Artplayer=en,K.setStyleText("artplayer-style",u.default),setTimeout(function(){en.LOG_VERSION&&console.log("%c ArtPlayer %c ".concat(en.version," %c https://artplayer.org"),"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","bundle-text:./style/index.less":"A7TwB","option-validator":"8zKz5","../package.json":"2Jf7W","./config":"3vlyb","./contextmenu":"46D5s","./control":"9MunV","./events":"kSrJ9","./hotkey":"fSjZi","./i18n":"5q3H4","./icons":"lkjMg","./info":"9sVMb","./layer":"dsBH4","./loading":"hLYDH","./mask":"5YaCM","./notice":"6kSNS","./player":"gJ9uy","./plugins":"83Crr","./scheme":"3Srhh","./setting":"4ARoj","./storage":"a5A5h","./subtitle":"kEcFl","./template":"jkHHJ","./utils":"hQMLb","./utils/emitter":"ikoiH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],clpdF:[function(e,t,r,n){"use strict";var o=e("feddc910f69a01a6"),a=e("b644f6b72647b399"),s=e("ba991daace2b8ed9");r._=function(e,t,r){return t=o._(t),s._(e,a._()?Reflect.construct(t,r||[],o._(e).constructor):t.apply(e,r))}},{feddc910f69a01a6:"NOGHw",b644f6b72647b399:"83nDe",ba991daace2b8ed9:"hd12h"}],NOGHw:[function(e,t,r,n){"use strict";function o(e){return r._=o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}r._=o},{}],"83nDe":[function(e,t,r,n){"use strict";function o(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r._=o=function(){return!!e})()}r._=o},{}],hd12h:[function(e,t,r,n){"use strict";var o=e("f7151fe13994d2aa"),a=e("f18e81760bb14899");r._=function(e,t){return t&&("object"===a._(t)||"function"==typeof t)?t:o._(e)}},{f7151fe13994d2aa:"1tlYe",f18e81760bb14899:"iXhRw"}],"1tlYe":[function(e,t,r,n){"use strict";r._=function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},{}],iXhRw:[function(e,t,r,n){"use strict";r._=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}},{}],"4Uf9M":[function(e,t,r,n){"use strict";r._=function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}},{}],igUuK:[function(e,t,r,n){"use strict";function o(e,t){for(var r=0;r","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],"3vlyb":[function(e,t,r,n){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],qpMMf:[function(e,t,r,n){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"46D5s":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return k});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("../utils"),u=e("../utils/component"),p=o.interopDefault(u),f=e("./aspectRatio"),d=o.interopDefault(f),h=e("./close"),m=o.interopDefault(h),v=e("./flip"),g=o.interopDefault(v),y=e("./info"),b=o.interopDefault(y),j=e("./playbackRate"),w=o.interopDefault(j),_=e("./version"),x=o.interopDefault(_),k=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="contextmenu",r.$parent=e.template.$contextmenu,l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.option,n=t.proxy,o=t.template,a=o.$player,s=o.$contextmenu;r.playbackRate&&this.add((0,w.default)({name:"playbackRate",index:10})),r.aspectRatio&&this.add((0,d.default)({name:"aspectRatio",index:20})),r.flip&&this.add((0,g.default)({name:"flip",index:30})),this.add((0,b.default)({name:"info",index:40})),this.add((0,x.default)({name:"version",index:50})),this.add((0,m.default)({name:"close",index:60}));for(var i=0;iu+c&&(m=c-h),n+d>p+i&&(v=i-d),(0,l.setStyles)(s,{top:"".concat(v,"px"),left:"".concat(m,"px")})}}),n(a,"click",function(t){(0,l.includeFromEvent)(t,s)||(e.show=!1)}),this.art.on("blur",function(){e.show=!1})}}]),t}(p.default)},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","../utils":"hQMLb","../utils/component":"hXsfe","./aspectRatio":"dCCaf","./close":"j6SRT","./flip":"cyTC8","./info":"cU7aj","./playbackRate":"01vHs","./version":"64r3r","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQMLb:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var a=e("./compatibility");o.exportAll(a,r);var s=e("./dom");o.exportAll(s,r);var i=e("./error");o.exportAll(i,r);var c=e("./file");o.exportAll(c,r);var l=e("./format");o.exportAll(l,r);var u=e("./property");o.exportAll(u,r);var p=e("./subtitle");o.exportAll(p,r);var f=e("./time");o.exportAll(f,r)},{"./compatibility":"iDd6B","./dom":"7V5Cu","./error":"2cjgc","./file":"8XY4p","./format":"lHh8q","./property":"iccpW","./subtitle":"ctswB","./time":"8KDy9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iDd6B:[function(e,t,r,n){var o,a,s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(r),s.export(r,"userAgent",function(){return i}),s.export(r,"isSafari",function(){return c}),s.export(r,"isIOS",function(){return l}),s.export(r,"isIOS13",function(){return u}),s.export(r,"isMobile",function(){return p}),s.export(r,"isBrowser",function(){return f});var i=null!=(a=null==(o=globalThis)?void 0:o.CUSTOM_USER_AGENT)?a:"undefined"!=typeof navigator?navigator.userAgent:"",c=/^(?:(?!chrome|android).)*safari/i.test(i),l=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,u=l||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||u,f="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7V5Cu":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",function(){return s}),o.export(r,"queryAll",function(){return i}),o.export(r,"addClass",function(){return c}),o.export(r,"removeClass",function(){return l}),o.export(r,"hasClass",function(){return u}),o.export(r,"append",function(){return p}),o.export(r,"remove",function(){return f}),o.export(r,"setStyle",function(){return d}),o.export(r,"setStyles",function(){return h}),o.export(r,"getStyle",function(){return m}),o.export(r,"siblings",function(){return v}),o.export(r,"inverseClass",function(){return g}),o.export(r,"tooltip",function(){return y}),o.export(r,"isInViewport",function(){return b}),o.export(r,"includeFromEvent",function(){return j}),o.export(r,"replaceElement",function(){return w}),o.export(r,"createElement",function(){return _}),o.export(r,"getIcon",function(){return x}),o.export(r,"setStyleText",function(){return k}),o.export(r,"supportsFlex",function(){return M}),o.export(r,"getRect",function(){return S}),o.export(r,"loadImg",function(){return E}),o.export(r,"getComposedPath",function(){return I});var a=e("./compatibility");function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelector(e)}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return Array.from(t.querySelectorAll(e))}function c(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function u(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function f(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function h(e,t){for(var r in t)d(e,r,t[r]);return e}function m(e,t){var r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(n):n}function v(e){return Array.from(e.parentElement.children).filter(function(t){return t!==e})}function g(e,t){v(e).forEach(function(e){return l(e,t)}),c(e,t)}function y(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";a.isMobile||(e.setAttribute("aria-label",t),c(e,"hint--rounded"),c(e,"hint--".concat(r)))}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,a=r.top-t<=n&&r.top+r.height+t>=0,s=r.left-t<=o+t&&r.left+r.width+t>=0;return a&&s}function j(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function _(e){return document.createElement(e)}function x(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=_("i");return c(r,"art-icon"),c(r,"art-icon-".concat(e)),p(r,t),r}function k(e,t){var r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function M(){var e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function S(e){return e.getBoundingClientRect()}function E(e,t){return new Promise(function(r,n){var o=new Image;o.onload=function(){if(t&&1!==t){var a=document.createElement("canvas"),s=a.getContext("2d");a.width=o.width*t,a.height=o.height*t,s.drawImage(o,0,0,a.width,a.height),a.toBlob(function(t){var o=URL.createObjectURL(t),a=new Image;a.onload=function(){r(a)},a.onerror=function(){URL.revokeObjectURL(o),n(Error("Image load failed: ".concat(e)))},a.src=o})}else r(o)},o.onerror=function(){n(Error("Image load failed: ".concat(e)))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();for(var t=[],r=e.target;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"iDd6B","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2cjgc":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",function(){return c}),o.export(r,"errorHandle",function(){return l});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_inherits.cjs"),c=function(e){"use strict";function t(e,r){var n;return(0,s._)(this,t),n=(0,a._)(this,t,[e]),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(n,r||n.constructor),n.name="ArtPlayerError",n}return(0,i._)(t,e),t}((0,e("@swc/helpers/cjs/_wrap_native_super.cjs")._)(Error));function l(e,t){if(!e)throw new c(t);return e}},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,t,r,n){"use strict";var o=e("c8857d56f4968279"),a=e("2ed7bdf1701f2d07"),s=e("5c5ad8846076b9cd"),i=e("2db6fa09e8a5be4c");function c(e){var t="function"==typeof Map?new Map:void 0;return r._=c=function(e){if(null===e||!s._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return o._(e,arguments,a._(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),i._(r,e)},c(e)}r._=c},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,t,r,n){"use strict";var o=e("62fc231ae2e75266"),a=e("3f98bf9d4f706151");function s(e,t,n){return o._()?r._=s=Reflect.construct:r._=s=function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&a._(o,r.prototype),o},s.apply(null,arguments)}r._=s},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,t,r,n){"use strict";r._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"8XY4p":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",function(){return function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}}),o.export(r,"download",function(){return a})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],lHh8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function s(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){if(!e)return"00:00";var t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*r);return(t>0?[t,r,n]:[r,n]).map(function(e){return e<10?"0".concat(e):String(e)}).join(":")}function c(e){return e.replace(/[&<>'"]/g,function(e){return({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e})}function l(e){var t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp("(".concat(Object.keys(t).join("|"),")"),"g");return e.replace(r,function(e){return t[e]||e})}o.defineInteropFlag(r),o.export(r,"clamp",function(){return a}),o.export(r,"capitalize",function(){return s}),o.export(r,"secondToTime",function(){return i}),o.export(r,"escape",function(){return c}),o.export(r,"unescape",function(){return l})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iccpW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",function(){return i}),o.export(r,"has",function(){return l}),o.export(r,"get",function(){return u}),o.export(r,"mergeDeep",function(){return function e(){for(var t=arguments.length,r=Array(t),n=0;ne.length)&&(t=e.length);for(var r=0,n=Array(t);r").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function s(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function i(e){var t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.split(/[:.]/).map(function(e,t,r){if(t===r.length-1){if(1===e.length)return".".concat(e,"00");if(2===e.length)return".".concat(e,"0")}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?".".concat(e):":".concat(e)}).join("")}return"WEBVTT\n"+"\n".concat(e.split(/\r?\n/).map(function(e){var n=e.match(t);return n?{start:r(n[1].trim()),end:r(n[2].trim()),text:n[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(function(e){return e.trim()}).join("\n")}:null}).filter(function(e){return e}).map(function(e,t){return e?"".concat(t+1,"\n")+"".concat(e.start," --\x3e ").concat(e.end)+"\n"+"".concat(e.text):""}).filter(function(e){return e.trim()}).join("\n\n"))}o.defineInteropFlag(r),o.export(r,"srtToVtt",function(){return a}),o.export(r,"vttToBlob",function(){return s}),o.export(r,"assToVtt",function(){return i})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KDy9":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new Promise(function(t){return setTimeout(t,e)})}function s(e,t){var r;return function(){for(var n=this,o=arguments.length,a=Array(o),s=0;s=Number(o.dataset.index)});s?s.insertAdjacentElement("beforebegin",o):(0,u.append)(this.$parent,o),r.html&&(0,u.append)(o,r.html),r.style&&(0,u.setStyles)(o,r.style),r.tooltip&&(0,u.tooltip)(o,r.tooltip);var i=[];if(r.click){var f=this.art.events.proxy(o,"click",function(e){e.preventDefault(),r.click.call(t.art,t,e)});i.push(f)}return r.selector&&["left","right"].includes(r.position)&&this.selector(r,o,i),this[n]=o,this.cache.set(n,{$ref:o,events:i,option:r}),r.mounted&&r.mounted.call(this.art,o),o}}},{key:"remove",value:function(e){(0,p.errorHandle)(this.cache.has(e),"Can't find [".concat(e,"] from the [").concat(this.name,"]"));var t=this.cache.get(e);t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);var r=!0,n=!1,o=void 0;try{for(var a,s=t.events[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var i=a.value;this.art.events.remove(i)}}catch(e){n=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw o}}this.cache.delete(e),delete this[e],(0,u.remove)(t.$ref)}},{key:"update",value:function(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","option-validator":"8zKz5","../scheme":"3Srhh","./dom":"7V5Cu","./error":"2cjgc","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3Srhh":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",function(){return m});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils"),c="array",l="boolean",u="string",p="number",f="object",d="function";function h(e,t,r){return(0,i.errorHandle)(t===u||t===p||e instanceof Element,"".concat(r.join(".")," require '").concat(u,"' or 'Element' type"))}var m={html:h,disable:"?".concat(l),name:"?".concat(u),index:"?".concat(p),style:"?".concat(f),click:"?".concat(d),mounted:"?".concat(d),tooltip:"?".concat(u,"|").concat(p),width:"?".concat(p),selector:"?".concat(c),onSelect:"?".concat(d),switch:"?".concat(l),onSwitch:"?".concat(d),range:"?".concat(c),onRange:"?".concat(d),onChange:"?".concat(d)};r.default={id:u,container:h,url:u,poster:u,type:u,theme:u,lang:u,volume:p,isLive:l,muted:l,autoplay:l,autoSize:l,autoMini:l,loop:l,flip:l,playbackRate:l,aspectRatio:l,screenshot:l,setting:l,hotkey:l,pip:l,mutex:l,backdrop:l,fullscreen:l,fullscreenWeb:l,subtitleOffset:l,miniProgressBar:l,useSSR:l,playsInline:l,lock:l,gesture:l,fastForward:l,autoPlayback:l,autoOrientation:l,airplay:l,proxy:"?".concat(d),plugins:[d],layers:[m],contextmenu:[m],settings:[m],controls:[(0,s._)((0,a._)({},m),{position:function(e,t,r){var n=["top","left","right"];return(0,i.errorHandle)(n.includes(e),"".concat(r.join(".")," only accept ").concat(n.toString()," as parameters"))}})],quality:[{default:"?".concat(l),html:u,url:u}],highlight:[{time:p,text:u}],thumbnails:{url:u,number:p,column:p,width:p,height:p,scale:p},subtitle:{url:u,name:u,type:u,style:f,escape:l,encoding:u,onVttLoad:d},moreVideoAttr:f,i18n:f,icons:f,cssVar:f,customType:f}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kyoEj:[function(e,t,r,n){"use strict";var o=e("9f9b8a24218ee51e");r._=function(e){for(var t=1;t').concat("default"===e?r.get("Default"):e,"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Aspect Ratio"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.aspectRatio=n,e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j6SRT:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Close"),click:function(e){e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cyTC8:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.FLIP.map(function(e){return'').concat(r.get((0,i.capitalize)(e)),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Video Flip"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.flip=n.toLowerCase(),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cU7aj:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Video Info"),click:function(e){t.info.show=!0,e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"01vHs":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.PLAYBACK_RATE.map(function(e){return'').concat(1===e?r.get("Normal"):e.toFixed(1),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Play Speed"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.playbackRate=Number(n),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",function(){var r=(0,i.queryAll)("span",e).find(function(e){return Number(e.dataset.value)===t.playbackRate});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"64r3r":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return function(e){return(0,s._)((0,a._)({},e),{html:'ArtPlayer '.concat(i.version,"")})}});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../../package.json")},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../../package.json":"2Jf7W","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9MunV":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return R});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_get.cjs"),u=e("@swc/helpers/cjs/_get_prototype_of.cjs"),p=e("@swc/helpers/cjs/_inherits.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),d=e("../utils"),h=e("../utils/component"),m=o.interopDefault(h),v=e("./airplay"),g=o.interopDefault(v),y=e("./fullscreen"),b=o.interopDefault(y),j=e("./fullscreenWeb"),w=o.interopDefault(j),_=e("./pip"),x=o.interopDefault(_),k=e("./playAndPause"),M=o.interopDefault(k),S=e("./progress"),E=o.interopDefault(S),I=e("./screenshot"),T=o.interopDefault(I),L=e("./setting"),C=o.interopDefault(L),O=e("./time"),F=o.interopDefault(O),D=e("./volume"),A=o.interopDefault(D),R=function(e){"use strict";function t(e){(0,i._)(this,t),(r=(0,s._)(this,t,[e])).isHover=!1,r.name="control",r.timer=Date.now();var r,n=e.constructor,o=r.art.template,a=o.$player,c=o.$bottom;return e.on("mousemove",function(){d.isMobile||(r.show=!0)}),e.on("click",function(){d.isMobile?r.toggle():r.show=!0}),e.on("document:mousemove",function(e){r.isHover=(0,d.includeFromEvent)(e,c)}),e.on("video:timeupdate",function(){!e.setting.show&&!r.isHover&&!e.isInput&&e.playing&&r.show&&Date.now()-r.timer>=n.CONTROL_HIDE_TIME&&(r.show=!1)}),e.on("control",function(e){e?((0,d.removeClass)(a,"art-hide-cursor"),(0,d.addClass)(a,"art-hover"),r.timer=Date.now()):((0,d.addClass)(a,"art-hide-cursor"),(0,d.removeClass)(a,"art-hover"))}),r.init(),r}return(0,p._)(t,e),(0,c._)(t,[{key:"init",value:function(){var e=this,t=this.art.option;t.isLive||this.add((0,E.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,M.default)({name:"playAndPause",position:"left",index:10})),this.add((0,A.default)({name:"volume",position:"left",index:20})),t.isLive||this.add((0,F.default)({name:"time",position:"left",index:30})),t.quality.length&&(0,d.sleep)().then(function(){e.art.quality=t.quality}),t.screenshot&&!d.isMobile&&this.add((0,T.default)({name:"screenshot",position:"right",index:20})),t.setting&&this.add((0,C.default)({name:"setting",position:"right",index:30})),t.pip&&this.add((0,x.default)({name:"pip",position:"right",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,g.default)({name:"airplay",position:"right",index:50})),t.fullscreenWeb&&this.add((0,w.default)({name:"fullscreenWeb",position:"right",index:60})),t.fullscreen&&this.add((0,b.default)({name:"fullscreen",position:"right",index:70}));for(var r=0;rt.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r}function u(e,t,r,n){var o,s=arguments.length,i=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(("undefined"==typeof Reflect?"undefined":(0,a._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(i=(s<3?o(i):s>3?o(t,r,i):o(t,r))||i);return s>3&&i&&Object.defineProperty(t,r,i),i}function p(e,t){return function(r,n){t(r,n,e)}}function f(e,t,r,n,o,s){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var c,l=n.kind,u="getter"===l?"get":"setter"===l?"set":"value",p=!t&&e?n.static?e:e.prototype:null,f=t||(p?Object.getOwnPropertyDescriptor(p,n.name):{}),d=!1,h=r.length-1;h>=0;h--){var m={};for(var v in n)m[v]="access"===v?{}:n[v];for(var v in n.access)m.access[v]=n.access[v];m.addInitializer=function(e){if(d)throw TypeError("Cannot add initializers after decoration has completed");s.push(i(e||null))};var g=(0,r[h])("accessor"===l?{get:f.get,set:f.set}:f[u],m);if("accessor"===l){if(void 0===g)continue;if(null===g||(void 0===g?"undefined":(0,a._)(g))!=="object")throw TypeError("Object expected");(c=i(g.get))&&(f.get=c),(c=i(g.set))&&(f.set=c),(c=i(g.init))&&o.unshift(c)}else(c=i(g))&&("field"===l?o.unshift(c):f[u]=c)}p&&Object.defineProperty(p,n.name,f),d=!0}function d(e,t,r){for(var n=arguments.length>2,o=0;o0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function _(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return s}function x(){for(var e=[],t=0;t1||i(e,t)})},t&&(n[e]=t(n[e])))}function i(e,t){try{var r;(r=o[e](t)).value instanceof S?Promise.resolve(r.value.v).then(c,l):u(a[0][2],r)}catch(e){u(a[0][3],e)}}function c(e){i("next",e)}function l(e){i("throw",e)}function u(e,t){e(t),a.shift(),a.length&&i(a[0][0],a[0][1])}}function I(e){var t,r;return t={},n("next"),n("throw",function(e){throw e}),n("return"),t[Symbol.iterator]=function(){return this},t;function n(n,o){t[n]=e[n]?function(t){return(r=!r)?{value:S(e[n](t)),done:!1}:o?o(t):t}:o}}function T(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e=w(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise(function(n,o){var a,s,i;a=n,s=o,i=(t=e[r](t)).done,Promise.resolve(t.value).then(function(e){a({value:e,done:i})},s)})}}}function L(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},O=function(e){return(O=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)};function F(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=O(e),n=0;n\n
\n
\n
\n
\n
\n
\n\n ',mounted:function(e){var a=null,s=!1,u=(0,i.query)(".art-progress-hover",e),p=(0,i.query)(".art-progress-loaded",e),f=(0,i.query)(".art-progress-played",e),d=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function v(r,n){var o=n||c(t,r),a=o.width;m.textContent=o.time;var s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-s,"px")):(0,i.setStyle)(m,"left","".concat(a-s/2,"px"))}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,n,o){var s="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(p,"width","".concat(100*n,"%")),"hover"===r&&(0,i.setStyle)(u,"width","".concat(100*n,"%")),"played"===r&&((0,i.setStyle)(f,"width","".concat(100*n,"%")),(0,i.setStyle)(h,"left","".concat(100*n,"%"))),s&&((0,i.setStyle)(m,"display","flex"),v(o,{width:e.clientWidth*n,time:(0,i.secondToTime)(n*t.duration)}),clearTimeout(a),a=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){d.textContent="";for(var e=0;e');(0,i.append)(d,a)}}),t.constructor.USE_RAF?t.on("raf",function(){t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",function(){t.emit("setBar","played",t.played)}),t.on("video:progress",function(){t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",function(){t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",function(e){e.target!==h&&l(t,e)}),o(e,"mousemove",function(r){var n,o,a=c(t,r).percentage;(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,d))?(n=c(t,r).width,m.textContent=r.target.dataset.text,n<=(o=m.clientWidth)/2?(0,i.setStyle)(m,"left",0):n>e.clientWidth-o/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-o,"px")):(0,i.setStyle)(m,"left","".concat(n-o/2,"px"))):v(r)}),o(e,"mouseleave",function(e){(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",function(e){s=0===e.button}),t.on("document:mousemove",function(e){if(s){var r=c(t,e),n=r.second,o=r.percentage;t.emit("setBar","played",o,e),t.seek=n}}),t.on("document:mouseup",function(){s&&(s=!1)}))}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4LBtY":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Screenshot"),mounted:function(e){var r=t.proxy,n=t.icons;(0,i.append)(e,n.screenshot),r(e,"click",function(){t.screenshot()})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hXIX5:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Show Setting"),mounted:function(e){var r=t.proxy,n=t.icons,o=t.i18n;(0,i.append)(e,n.setting),r(e,"click",function(){t.setting.toggle(),t.setting.resize()}),t.on("setting",function(t){(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7Zm5j":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:function(e){function r(){var r="".concat((0,i.secondToTime)(t.currentTime)," / ").concat((0,i.secondToTime)(t.duration));r!==e.textContent&&(e.textContent=r)}r();for(var n=["video:loadedmetadata","video:timeupdate","video:progress"],o=0;o'),c=(0,i.append)(s,'
'),l=(0,i.append)(c,'
'),u=(0,i.append)(c,'
'),p=(0,i.append)(u,'
'),f=(0,i.append)(p,'
'),d=(0,i.append)(u,'
');function h(e){var t=(0,i.getRect)(u),r=t.top,n=t.height;return 1-(e.clientY-r)/n}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(a,"display","flex"),(0,i.setStyle)(d,"top","100%"),(0,i.setStyle)(f,"top","100%"),l.textContent=0;else{var e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(a,"display","none"),(0,i.setStyle)(d,"top","".concat(100-e,"%")),(0,i.setStyle)(f,"top","".concat(100-e,"%")),l.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",function(){t.muted=!0}),r(a,"click",function(){t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{var v=!1;r(u,"mousedown",function(e){v=0===e.button,t.volume=h(e)}),t.on("document:mousemove",function(e){v&&(t.muted=!1,t.volume=h(e))}),t.on("document:mouseup",function(){v&&(v=!1)})}}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kSrJ9:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("./clickInit"),c=o.interopDefault(i),l=e("./gestureInit"),u=o.interopDefault(l),p=e("./globalInit"),f=o.interopDefault(p),d=e("./hoverInit"),h=o.interopDefault(d),m=e("./moveInit"),v=o.interopDefault(m),g=e("./resizeInit"),y=o.interopDefault(g),b=e("./updateInit"),j=o.interopDefault(b),w=e("./viewInit"),_=o.interopDefault(w),x=function(){"use strict";function e(t){(0,a._)(this,e),this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,c.default)(t,this),(0,h.default)(t,this),(0,v.default)(t,this),(0,y.default)(t,this),(0,u.default)(t,this),(0,_.default)(t,this),(0,f.default)(t,this),(0,j.default)(t,this)}return(0,s._)(e,[{key:"proxy",value:function(e,t,r){var n=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Array.isArray(t))return t.map(function(t){return n.proxy(e,t,r,o)});e.addEventListener(t,r,o);var a=function(){return e.removeEventListener(t,r,o)};return this.destroyEvents.add(a),a}},{key:"hover",value:function(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}},{key:"remove",value:function(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}},{key:"destroy",value:function(){var e=!0,t=!1,r=void 0;try{for(var n,o=this.destroyEvents[Symbol.iterator]();!(e=(n=o.next()).done);e=!0){var a=n.value;try{a()}catch(e){console.warn("Failed to destroy event listener:",e)}}}catch(e){t=!0,r=e}finally{try{e||null==o.return||o.return()}finally{if(t)throw r}}this.destroyEvents.clear()}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","./clickInit":"eyr86","./gestureInit":"7TxZr","./globalInit":"hOg1v","./hoverInit":"7OoRN","./moveInit":"6UdvL","./resizeInit":"csHAr","./updateInit":"jOkhG","./viewInit":"k3U5a","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],eyr86:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e,t){var r=e.constructor,n=e.template,o=n.$player,s=n.$video;function i(t){(0,a.includeFromEvent)(t,o)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",i),e.on("document:contextmenu",i);var c=[];t.proxy(s,"click",function(t){var n=Date.now();c.push(n);var o=r.MOBILE_CLICK_PLAY,s=r.DBCLICK_TIME,i=r.MOBILE_DBCLICK_PLAY,l=r.DBCLICK_FULLSCREEN,u=c.filter(function(e){return n-e<=s});switch(u.length){case 1:e.emit("click",t),a.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),c=u;break;case 2:e.emit("dblclick",t),a.isMobile?!e.isLock&&i&&e.toggle():l&&(e.fullscreen=!e.fullscreen),c=[];break;default:c=[]}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7TxZr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("../control/progress"),s=e("../utils");function i(e,t){if(s.isMobile&&!e.option.isLive){var r=e.template,n=r.$video,o=r.$progress,i=null,c=!1,l=0,u=0,p=0,f=function(t){if(1===t.touches.length&&!e.isLock){i===o&&(0,a.setCurrentTime)(e,t),c=!0;var r=t.touches[0],n=r.pageX,s=r.pageY;l=n,u=s,p=e.currentTime}},d=function(t){if(1===t.touches.length&&c&&e.duration){var r=t.touches[0],o=r.pageX,a=r.pageY,f=function(e,t,r,n){var o=t-n,a=r-e,s=0;if(2>Math.abs(a)&&2>Math.abs(o))return s;var i=180*Math.atan2(o,a)/Math.PI;return i>=-45&&i<45?s=4:i>=45&&i<135?s=1:i>=-135&&i<-45?s=2:(i>=135&&i<=180||i>=-180&&i<-135)&&(s=3),s}(l,u,o,a),d=[3,4].includes(f),h=[1,2].includes(f);if(d&&!e.isRotate||h&&e.isRotate){var m=(0,s.clamp)((o-l)/e.width,-1,1),v=(0,s.clamp)((a-u)/e.height,-1,1),g=e.isRotate?v:m,y=i===n?e.constructor.TOUCH_MOVE_RATIO:1,b=(0,s.clamp)(p+e.duration*g*y,0,e.duration);e.seek=b,e.emit("setBar","played",(0,s.clamp)(b/e.duration,0,1),t),e.notice.show="".concat((0,s.secondToTime)(b)," / ").concat((0,s.secondToTime)(e.duration))}}};e.option.gesture&&(t.proxy(n,"touchstart",function(e){i=n,f(e)}),t.proxy(n,"touchmove",d)),t.proxy(o,"touchstart",function(e){i=o,f(e)}),t.proxy(o,"touchmove",d),e.on("document:touchend",function(){c&&(l=0,u=0,p=0,c=!1,i=null)})}}},{"../control/progress":"lLsXv","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hOg1v:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],n=["resize","scroll","orientationchange"],o=[];function a(){for(var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=0;s'},{}],kX2ah:[function(e,t,r,n){t.exports=''},{}],cYqbE:[function(e,t,r,n){t.exports=''},{}],dCZ1q:[function(e,t,r,n){t.exports=''},{}],enWOR:[function(e,t,r,n){t.exports=''},{}],aEYUh:[function(e,t,r,n){t.exports=''},{}],"6sWtx":[function(e,t,r,n){t.exports=''},{}],bhixJ:[function(e,t,r,n){t.exports=''},{}],aonuB:[function(e,t,r,n){t.exports=''},{}],hbNgp:[function(e,t,r,n){t.exports=''},{}],aNXxH:[function(e,t,r,n){t.exports=''},{}],ezk36:[function(e,t,r,n){t.exports=''},{}],kPsyz:[function(e,t,r,n){t.exports=''},{}],cUJ9T:[function(e,t,r,n){t.exports=''},{}],"9MnDP":[function(e,t,r,n){t.exports=''},{}],gtJ8Q:[function(e,t,r,n){t.exports=''},{}],luvRR:[function(e,t,r,n){t.exports=''},{}],"2VikP":[function(e,t,r,n){t.exports=''},{}],"9eYwu":[function(e,t,r,n){t.exports=''},{}],"5m73X":[function(e,t,r,n){t.exports=''},{}],"2ZLsh":[function(e,t,r,n){t.exports=''},{}],fXkDR:[function(e,t,r,n){t.exports=''},{}],jcnGd:[function(e,t,r,n){t.exports=''},{}],"2QwX5":[function(e,t,r,n){t.exports=''},{}],"9oiD9":[function(e,t,r,n){t.exports=''},{}],"68oNy":[function(e,t,r,n){t.exports=''},{}],j2oAd:[function(e,t,r,n){t.exports=''},{}],"9sVMb":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return p});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("./utils"),u=e("./utils/component"),p=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="info",l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.proxy,n=t.constructor,o=t.template,a=o.$infoPanel,s=o.$infoClose,i=o.$video;r(s,"click",function(){e.show=!1});var c=null,u=(0,l.queryAll)("[data-video]",a)||[];this.art.on("destroy",function(){return clearTimeout(c)}),!function e(){for(var t=0;tu?((0,a.setStyle)(o,"width","".concat(u*l,"px")),(0,a.setStyle)(o,"height","100%"),(0,a.setStyle)(o,"margin","0 auto")):((0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","".concat(c/u,"px")),(0,a.setStyle)(o,"margin","auto 0")),s.dataset.aspectRatio=n}r.show="".concat(t.get("Aspect Ratio"),": ").concat("default"===n?t.get("Default"):n),e.emit("aspectRatio",n)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],rWA5h:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"attr",{value:function(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ekP8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$video;(0,a.def)(e,"autoHeight",{value:function(){var t=r.clientWidth,o=n.videoHeight,s=t/n.videoWidth*o;(0,a.setStyle)(r,"height","".concat(s,"px")),e.emit("autoHeight",s)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3d2R8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$player,o=t.$video;(0,a.def)(e,"autoSize",{value:function(){var t=o.videoWidth,s=o.videoHeight,i=(0,a.getRect)(r),c=i.width,l=i.height,u=t/s;c/l>u?((0,a.setStyle)(n,"width","".concat(l*u/c*100,"%")),(0,a.setStyle)(n,"height","100%")):((0,a.setStyle)(n,"width","100%"),(0,a.setStyle)(n,"height","".concat(c/u/l*100,"%"))),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2nLRH":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$player;(0,a.def)(e,"cssVar",{value:function(e,r){return r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3lhzv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"currentTime",{get:function(){return t.currentTime||0},set:function(r){Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,a.clamp)(r,0,e.duration))}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQmmf:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"duration",{get:function(){var t=e.template.$video.duration;return t===1/0?0:t||0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1KU3q":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return u});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../config"),c=o.interopDefault(i),l=e("../utils");function u(e){for(var t=e.i18n,r=e.notice,n=e.option,o=e.constructor,i=e.proxy,u=e.template,p=u.$player,f=u.$video,d=u.$poster,h=0,m=0;m0&&void 0!==arguments[0]?arguments[0]:document.documentElement,t=arguments.length>1?arguments[1]:void 0;return new Promise(function(r,n){var o=function(){c.off("change",o),r()};c.on("change",o);var a=e[s.requestFullscreen](t);a instanceof Promise&&a.then(o).catch(n)})},exit:function(){return new Promise(function(e,t){if(!c.isFullscreen)return void e();var r=function(){c.off("change",r),e()};c.on("change",r);var n=document[s.exitFullscreen]();n instanceof Promise&&n.then(r).catch(t)})},toggle:function(e,t){return c.isFullscreen?c.exit():c.request(e,t)},onchange:function(e){c.on("change",e)},onerror:function(e){c.on("error",e)},on:function(e,t){var r=i[e];r&&document.addEventListener(r,t,!1)},off:function(e,t){var r=i[e];r&&document.removeEventListener(r,t,!1)},raw:s};Object.defineProperties(c,{isFullscreen:{get:function(){return!!document[s.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[s.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return!!document[s.fullscreenEnabled]}}}),r.default=c},{"@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gIQTH:[function(e,t,r,n){"use strict";var o=e("d7c30a5ae0c1ab2"),a=e("3aacfce52f67defd"),s=e("f0dae09a1a08b16a"),i=e("83f3648e614d0830");r._=function(e,t){return o._(e)||a._(e,t)||i._(e,t)||s._()}},{d7c30a5ae0c1ab2:"3QSPl","3aacfce52f67defd":"5SSeo",f0dae09a1a08b16a:"heYSj","83f3648e614d0830":"fh7mx"}],"3QSPl":[function(e,t,r,n){"use strict";r._=function(e){if(Array.isArray(e))return e}},{}],"5SSeo":[function(e,t,r,n){"use strict";r._=function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],s=!0,i=!1;try{for(o=o.call(e);!(s=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);s=!0);}catch(e){i=!0,n=e}finally{try{s||null==o.return||o.return()}finally{if(i)throw n}}return a}}},{}],heYSj:[function(e,t,r,n){"use strict";r._=function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},{}],itVYl:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.template,n=r.$container,o=r.$player,s="";(0,a.def)(e,"fullscreenWeb",{get:function(){return(0,a.hasClass)(o,"art-fullscreen-web")},set:function(r){r?(s=o.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(document.body,o),e.state="fullscreenWeb",(0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","100%"),(0,a.addClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(n,o),s&&(o.style.cssText=s,s=""),(0,a.removeClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],dE0YW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"loaded",{get:function(){return e.loadedTime/t.duration}}),(0,a.def)(e,"loadedTime",{get:function(){return t.buffered.length?t.buffered.end(t.buffered.length-1):0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kwpHL:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.icons,r=e.proxy,n=e.storage,o=e.template,s=o.$player,i=o.$video,c=!1,l=0,u=0;function p(){var t=e.template.$mini;t&&((0,a.removeClass)(s,"art-mini"),(0,a.setStyle)(t,"display","none"),s.prepend(i),e.emit("mini",!1))}function f(t,r){e.playing?((0,a.setStyle)(t,"display","none"),(0,a.setStyle)(r,"display","flex")):((0,a.setStyle)(t,"display","flex"),(0,a.setStyle)(r,"display","none"))}function d(){var t=e.template.$mini,r=(0,a.getRect)(t),o=window.innerHeight-r.height-50,s=window.innerWidth-r.width-50;n.set("top",o),n.set("left",s),(0,a.setStyle)(t,"top","".concat(o,"px")),(0,a.setStyle)(t,"left","".concat(s,"px"))}(0,a.def)(e,"mini",{get:function(){return(0,a.hasClass)(s,"art-mini")},set:function(o){if(o){e.state="mini",(0,a.addClass)(s,"art-mini");var h=function(){var o=e.template.$mini;if(o)return(0,a.append)(o,i),(0,a.setStyle)(o,"display","flex");var s=(0,a.createElement)("div");(0,a.addClass)(s,"art-mini-popup"),(0,a.append)(document.body,s),e.template.$mini=s,(0,a.append)(s,i);var d=(0,a.append)(s,'
');(0,a.append)(d,t.close),r(d,"click",p);var h=(0,a.append)(s,'
'),m=(0,a.append)(h,t.play),v=(0,a.append)(h,t.pause);return r(m,"click",function(){return e.play()}),r(v,"click",function(){return e.pause()}),f(m,v),e.on("video:playing",function(){return f(m,v)}),e.on("video:pause",function(){return f(m,v)}),e.on("video:timeupdate",function(){return f(m,v)}),r(s,"mousedown",function(e){c=0===e.button,l=e.pageX,u=e.pageY}),e.on("document:mousemove",function(e){if(c){(0,a.addClass)(s,"art-mini-dragging");var t=e.pageX-l,r=e.pageY-u;(0,a.setStyle)(s,"transform","translate(".concat(t,"px, ").concat(r,"px)"))}}),e.on("document:mouseup",function(){if(c){c=!1,(0,a.removeClass)(s,"art-mini-dragging");var e=(0,a.getRect)(s);n.set("left",e.left),n.set("top",e.top),(0,a.setStyle)(s,"left","".concat(e.left,"px")),(0,a.setStyle)(s,"top","".concat(e.top,"px")),(0,a.setStyle)(s,"transform",null)}}),s}(),m=n.get("top"),v=n.get("left");"number"==typeof m&&"number"==typeof v?((0,a.setStyle)(h,"top","".concat(m,"px")),(0,a.setStyle)(h,"left","".concat(v,"px")),(0,a.isInViewport)(h)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"72iXq":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.option,r=e.storage,n=e.template,o=n.$video,s=n.$poster;for(var i in t.moreVideoAttr)e.attr(i,t.moreVideoAttr[i]);t.muted&&(e.muted=t.muted),t.volume&&(o.volume=(0,a.clamp)(t.volume,0,1));var c=r.get("volume");for(var l in"number"==typeof c&&(o.volume=(0,a.clamp)(c,0,1)),t.poster&&(0,a.setStyle)(s,"backgroundImage","url(".concat(t.poster,")")),t.autoplay&&(o.autoplay=t.autoplay),t.playsInline&&(o.playsInline=!0,o["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(l,t.cssVar[l]);e.url=t.url}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1B8xv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"pause",{value:function(){var o=t.pause();return n.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2ayfA":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t,r,n,o,s=e.i18n,i=e.notice,c=e.template.$video;document.pictureInPictureEnabled?(t=e.template.$video,r=e.proxy,n=e.notice,t.disablePictureInPicture=!1,(0,a.def)(e,"pip",{get:function(){return document.pictureInPictureElement},set:function(r){r?(e.state="pip",t.requestPictureInPicture().catch(function(e){throw n.show=e,e})):document.exitPictureInPicture().catch(function(e){throw n.show=e,e})}}),r(t,"enterpictureinpicture",function(){e.emit("pip",!0)}),r(t,"leavepictureinpicture",function(){e.emit("pip",!1)})):c.webkitSupportsPresentationMode?((o=e.template.$video).webkitSetPresentationMode("inline"),(0,a.def)(e,"pip",{get:function(){return"picture-in-picture"===o.webkitPresentationMode},set:function(t){t?(e.state="pip",o.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(o.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})):(0,a.def)(e,"pip",{get:function(){return!1},set:function(){i.show=s.get("PIP Not Supported")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4pWSp":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"playbackRate",{get:function(){return t.playbackRate},set:function(o){o?o!==t.playbackRate&&(t.playbackRate=o,n.show="".concat(r.get("Rate"),": ").concat(1===o?r.get("Normal"):"".concat(o,"x"))):e.playbackRate=1}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3GKs4":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"played",{get:function(){return e.currentTime/e.duration}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],in83u:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"playing",{get:function(){return"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cVJNG:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.i18n,r=e.notice,n=e.option,o=e.constructor.instances,c=e.template.$video;(0,i.def)(e,"play",{value:function(){return(0,a._)(function(){var a,i,l;return(0,s._)(this,function(s){switch(s.label){case 0:return[4,c.play()];case 1:if(a=s.sent(),r.show=t.get("Play"),e.emit("play"),n.mutex)for(i=0;i0&&jo.clientWidth-m/2?(0,i.setStyle)(a,"left","".concat(o.clientWidth-m,"px")):(0,i.setStyle)(a,"left","".concat(t-m/2,"px"))}}(j):i.isMobile||(0,i.setStyle)(m,"display","none"),b&&(clearTimeout(l),l=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500)),s.label=3;case 3:return[2]}})})()}),(0,i.def)(e,"thumbnails",{get:function(){return e.option.thumbnails},set:function(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(l),l=null,u=null,p=!1,f=!1)}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],bdo2A:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"toggle",{value:function(){return e.playing?e.pause():e.play()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7uOqt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"type",{get:function(){return e.option.type},set:function(t){e.option.type=t}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4QAa0":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.option,r=e.template.$video;(0,i.def)(e,"url",{get:function(){return r.src},set:function(n){return(0,a._)(function(){var o,a,c;return(0,s._)(this,function(s){switch(s.label){case 0:if(!n)return[3,4];if(o=e.url,a=t.type||(0,i.getExt)(n),c=t.customType[a],!(a&&c))return[3,2];return[4,(0,i.sleep)()];case 1:return s.sent(),e.loading.show=!0,c.call(e,r,n,e),[3,3];case 2:URL.revokeObjectURL(o),r.src=n,s.label=3;case 3:return o!==e.url&&(e.option.url=n,e.isReady&&o&&e.once("video:canplay",function(){e.emit("restart",n)})),[3,6];case 4:return[4,(0,i.sleep)()];case 5:s.sent(),e.loading.show=!0,s.label=6;case 6:return[2]}})})()}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3sLEt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice,o=e.storage;(0,a.def)(e,"volume",{get:function(){return t.volume||0},set:function(e){t.volume=(0,a.clamp)(e,0,1),n.show="".concat(r.get("Volume"),": ").concat(Number.parseInt(100*t.volume,10)),0!==t.volume&&o.set("volume",t.volume)}}),(0,a.def)(e,"muted",{get:function(){return t.muted},set:function(r){t.muted=r,e.emit("muted",r)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"83Crr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return y});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../utils"),c=e("./autoOrientation"),l=o.interopDefault(c),u=e("./autoPlayback"),p=o.interopDefault(u),f=e("./fastForward"),d=o.interopDefault(f),h=e("./lock"),m=o.interopDefault(h),v=e("./miniProgressBar"),g=o.interopDefault(v),y=function(){"use strict";function e(t){(0,a._)(this,e),this.art=t,this.id=0;var r=t.option;r.miniProgressBar&&!r.isLive&&this.add(g.default),r.lock&&i.isMobile&&this.add(m.default),r.autoPlayback&&!r.isLive&&this.add(p.default),r.autoOrientation&&i.isMobile&&this.add(l.default),r.fastForward&&i.isMobile&&!r.isLive&&this.add(d.default);for(var n=0;nt&&rn}return e.on("fullscreenWeb",function(t){if(t){if(f()){var n;setTimeout(function(){var t,r;e.fullscreenWeb&&!(0,i.hasClass)(o,l)&&(t=document.documentElement.clientWidth,r=document.documentElement.clientHeight,(0,i.setStyle)(o,"width","".concat(r,"px")),(0,i.setStyle)(o,"height","".concat(t,"px")),(0,i.setStyle)(o,"transform-origin","0 0"),(0,i.setStyle)(o,"transform","rotate(90deg) translate(0, -".concat(t,"px)")),(0,i.addClass)(o,l),e.isRotate=!0,e.emit("resize"))},Number(null!=(n=r.AUTO_ORIENTATION_TIME)?n:0))}}else(0,i.hasClass)(o,l)&&((0,i.setStyle)(o,"width",""),(0,i.setStyle)(o,"height",""),(0,i.setStyle)(o,"transform-origin",""),(0,i.setStyle)(o,"transform",""),(0,i.removeClass)(o,l),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",function(e){return(0,a._)(function(){var r,n,a,c,l;return(0,s._)(this,function(s){switch(s.label){case 0:if(a=!!(null==(n=screen)||null==(r=n.orientation)?void 0:r.lock),!e)return[3,5];if(!(a&&f()))return[3,4];s.label=1;case 1:return s.trys.push([1,3,,4]),c=screen.orientation.type.startsWith("portrait")?"landscape":"portrait",[4,screen.orientation.lock(c)];case 2:return s.sent(),p=!0,(0,i.addClass)(o,u),[3,4];case 3:return l=s.sent(),p=!1,t.show=l,[3,4];case 4:return[3,6];case 5:if((0,i.hasClass)(o,u)&&(0,i.removeClass)(o,u),a&&p){try{screen.orientation.unlock()}catch(e){}p=!1}s.label=6;case 6:return[2]}})})()}),{name:"autoOrientation",get state(){return(0,i.hasClass)(o,l)}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"76uK8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.i18n,r=e.icons,n=e.storage,o=e.constructor,s=e.proxy,i=e.template.$poster,c=e.layers.add({name:"auto-playback",html:'\n
\n
\n
\n '}),l=(0,a.query)(".art-auto-playback-last",c),u=(0,a.query)(".art-auto-playback-jump",c),p=(0,a.query)(".art-auto-playback-close",c);(0,a.append)(p,r.close);var f=null;function d(){var r=(n.get("times")||{})[e.option.id||e.option.url];clearTimeout(f),(0,a.setStyle)(c,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,a.setStyle)(c,"display","flex"),l.textContent="".concat(t.get("Last Seen")," ").concat((0,a.secondToTime)(r)),u.textContent=t.get("Jump Play"),s(p,"click",function(){(0,a.setStyle)(c,"display","none")}),s(u,"click",function(){e.seek=r,e.play(),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(c,"display","none")}),e.once("video:timeupdate",function(){f=setTimeout(function(){(0,a.setStyle)(c,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",function(){if(e.playing){var t=n.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,n.set("times",t)}}),e.on("ready",d),e.on("restart",d),{name:"auto-playback",get times(){return n.get("times")||{}},clear:function(){return n.del("times")},delete:function(e){var t=n.get("times")||{};return delete t[e],n.set("times",t),t}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gLGPW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.proxy,n=e.template,o=n.$player,s=n.$video,i=null,c=!1,l=1,u=function(){clearTimeout(i),c&&(c=!1,e.playbackRate=l,(0,a.removeClass)(o,"art-fast-forward"))};return r(s,"touchstart",function(r){1===r.touches.length&&e.playing&&!e.isLock&&(i=setTimeout(function(){c=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,a.addClass)(o,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",u),e.on("document:touchend",u),{name:"fastForward",get state(){return(0,a.hasClass)(o,"art-fast-forward")}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9btcI":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.layers,r=e.icons,n=e.template.$player;function o(){return(0,a.hasClass)(n,"art-lock")}function s(){(0,a.addClass)(n,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function i(){(0,a.removeClass)(n,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted:function(t){var n=(0,a.append)(t,r.lock),o=(0,a.append)(t,r.unlock);(0,a.setStyle)(n,"display","none"),e.on("lock",function(e){e?((0,a.setStyle)(n,"display","inline-flex"),(0,a.setStyle)(o,"display","none")):((0,a.setStyle)(n,"display","none"),(0,a.setStyle)(o,"display","inline-flex"))})},click:function(){o()?i():s()}}),{name:"lock",get state(){return o()},set state(value){value?s():i()}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iSnmg:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){return e.on("control",function(t){t?(0,a.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,a.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4ARoj":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),u=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("../utils"),d=e("../utils/component"),h=o.interopDefault(d),m=e("./aspectRatio"),v=o.interopDefault(m),g=e("./flip"),y=o.interopDefault(g),b=e("./playbackRate"),j=o.interopDefault(b),w=e("./subtitleOffset"),_=o.interopDefault(w),x=function(e){"use strict";function t(e){(0,i._)(this,t);var r=(0,s._)(this,t,[e]),n=e.option,o=e.controls,a=e.template.$setting;return r.name="setting",r.$parent=a,r.id=0,r.active=null,r.cache=new Map,r.option=(0,u._)(r.builtin).concat((0,u._)(n.settings)),n.setting&&(r.format(),r.render(),e.on("blur",function(){r.show&&(r.show=!1,r.render())}),e.on("focus",function(e){var t=(0,f.includeFromEvent)(e,o.setting),n=(0,f.includeFromEvent)(e,r.$parent);!r.show||t||n||(r.show=!1,r.render())}),e.on("resize",function(){return r.resize()})),r}return(0,l._)(t,e),(0,c._)(t,[{key:"builtin",get:function(){var e=[],t=this.art.option;return t.playbackRate&&e.push((0,j.default)(this.art)),t.aspectRatio&&e.push((0,v.default)(this.art)),t.flip&&e.push((0,y.default)(this.art)),t.subtitleOffset&&e.push((0,_.default)(this.art)),e}},{key:"traverse",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.option,r=0;r0&&void 0!==arguments[0]?arguments[0]:this.option,r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=0;a0&&void 0!==arguments[0]?arguments[0]:"",t=null;return this.traverse(function(r){r.name===e&&(t=r)}),t}},{key:"resize",value:function(){var e=this.art,t=e.controls,r=e.constructor,n=r.SETTING_WIDTH,o=r.SETTING_ITEM_HEIGHT,a=e.template,s=a.$player,i=a.$setting;if(t.setting&&this.show){var c,l,u=(null==(l=this.active[0])||null==(c=l.$parent)?void 0:c.width)||n,p=(0,f.getRect)(t.setting),d=p.left,h=p.width,m=(0,f.getRect)(s),v=m.left,g=m.width,y=d-v+h/2-u/2,b=this.active===this.option?this.active.length*o:(this.active.length+1)*o;if((0,f.setStyle)(i,"height","".concat(b,"px")),(0,f.setStyle)(i,"width","".concat(u,"px")),this.art.isRotate||f.isMobile)return;y+u>g?((0,f.setStyle)(i,"left",null),(0,f.setStyle)(i,"right",null)):((0,f.setStyle)(i,"left","".concat(y,"px")),(0,f.setStyle)(i,"right","auto"))}}},{key:"inactivate",value:function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:this.option;return t.push(e),this.format(),this.createItem(e),this.render(),e}},{key:"createHeader",value:function(e){var t=this;if(this.cache.has(e.$option)){var r=this.cache.get(e.$option),n=this.art,o=n.proxy,a=n.icons.arrowLeft,s=n.constructor.SETTING_ITEM_HEIGHT,i=(0,f.createElement)("div");(0,f.setStyle)(i,"height","".concat(s,"px")),(0,f.addClass)(i,"art-setting-item"),(0,f.addClass)(i,"art-setting-item-back");var c=(0,f.append)(i,'
'),l=(0,f.createElement)("div");(0,f.addClass)(l,"art-setting-item-left-icon"),(0,f.append)(l,a),(0,f.append)(c,l),(0,f.append)(c,e.$parent.html);var u=o(i,"click",function(){return t.render(e.$parents)});e.$parent.$events.push(u),(0,f.append)(r,i)}}},{key:"createItem",value:function(e){var t,r,n=this,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.cache.has(e.$option)){var s=this.cache.get(e.$option),i=e.$item,c="selector";(0,f.has)(e,"switch")&&(c="switch"),(0,f.has)(e,"range")&&(c="range"),(0,f.has)(e,"onClick")&&(c="button");var l=this.art,d=l.icons,h=l.proxy,m=l.constructor,v=(0,f.createElement)("div");(0,f.addClass)(v,"art-setting-item"),(0,f.setStyle)(v,"height","".concat(m.SETTING_ITEM_HEIGHT,"px")),v.dataset.name=e.name||"",v.dataset.value=e.value||"";var g=(0,f.append)(v,'
'),y=(0,f.append)(v,'
'),b=(0,f.createElement)("div");switch((0,f.addClass)(b,"art-setting-item-left-icon"),c){case"button":case"switch":case"range":(0,f.append)(b,e.icon||d.config);break;case"selector":(null==(t=e.selector)?void 0:t.length)?(0,f.append)(b,e.icon||d.config):(0,f.append)(b,d.check)}(0,f.append)(g,b),(0,f.def)(e,"$icon",{configurable:!0,get:function(){return b}}),(0,f.def)(e,"icon",{configurable:!0,get:function(){return b.innerHTML},set:function(e){b.innerHTML="",(0,f.append)(b,e)}});var j=(0,f.createElement)("div");(0,f.addClass)(j,"art-setting-item-left-text"),(0,f.append)(j,e.html||""),(0,f.append)(g,j),(0,f.def)(e,"$html",{configurable:!0,get:function(){return j}}),(0,f.def)(e,"html",{configurable:!0,get:function(){return j.innerHTML},set:function(e){j.innerHTML="",(0,f.append)(j,e)}});var w=(0,f.createElement)("div");switch((0,f.addClass)(w,"art-setting-item-right-tooltip"),(0,f.append)(w,e.tooltip||""),(0,f.append)(y,w),(0,f.def)(e,"$tooltip",{configurable:!0,get:function(){return w}}),(0,f.def)(e,"tooltip",{configurable:!0,get:function(){return w.innerHTML},set:function(e){w.innerHTML="",(0,f.append)(w,e)}}),c){case"switch":var _=(0,f.createElement)("div");(0,f.addClass)(_,"art-setting-item-right-icon");var x=(0,f.append)(_,d.switchOn),k=(0,f.append)(_,d.switchOff);(0,f.setStyle)(e.switch?k:x,"display","none"),(0,f.append)(y,_),(0,f.def)(e,"$switch",{configurable:!0,get:function(){return _}});var M=e.switch;(0,f.def)(e,"switch",{configurable:!0,get:function(){return M},set:function(e){M=e,e?((0,f.setStyle)(k,"display","none"),(0,f.setStyle)(x,"display",null)):((0,f.setStyle)(k,"display",null),(0,f.setStyle)(x,"display","none"))}});break;case"range":var S=(0,f.createElement)("div");(0,f.addClass)(S,"art-setting-item-right-icon");var E=(0,f.append)(S,'');E.value=e.range[0],E.min=e.range[1],E.max=e.range[2],E.step=e.range[3],(0,f.addClass)(E,"art-setting-range"),(0,f.append)(y,S),(0,f.def)(e,"$range",{configurable:!0,get:function(){return E}});var I=(0,u._)(e.range);(0,f.def)(e,"range",{configurable:!0,get:function(){return I},set:function(e){I=(0,u._)(e),E.value=e[0],E.min=e[1],E.max=e[2],E.step=e[3]}});break;case"selector":if(null==(r=e.selector)?void 0:r.length){var T=(0,f.createElement)("div");(0,f.addClass)(T,"art-setting-item-right-icon"),(0,f.append)(T,d.arrowRight),(0,f.append)(y,T)}}switch(c){case"switch":if(e.onSwitch){var L=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onSwitch.call(this.art,e,v,t)];case 1:return e.switch=r.sent(),[2]}})}).call(n)});e.$events.push(L)}break;case"range":if(e.$range){if(e.onRange){var C=h(e.$range,"change",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onRange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(C)}if(e.onChange){var O=h(e.$range,"input",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onChange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(O)}}break;case"selector":var F=h(v,"click",function(t){return(0,a._)(function(){var r,n;return(0,p._)(this,function(o){switch(o.label){case 0:if(!(null==(r=e.selector)?void 0:r.length))return[3,1];return this.render(e.selector),[3,3];case 1:if(this.check(e),!e.$parent.onSelect)return[3,3];return n=e.$parent,[4,e.$parent.onSelect.call(this.art,e,v,t)];case 2:n.tooltip=o.sent(),o.label=3;case 3:return[2]}})}).call(n)});e.$events.push(F),e.default&&(0,f.addClass)(v,"art-current");break;case"button":if(e.onClick){var D=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onClick.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(D)}}(0,f.def)(e,"$item",{configurable:!0,get:function(){return v}}),o?(0,f.replaceElement)(v,i):(0,f.append)(s,v),e.mounted&&setTimeout(function(){return e.mounted.call(n.art,e.$item,e)},0)}}},{key:"render",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.option;if(this.active=e,this.cache.has(e)){var t=this.cache.get(e);(0,f.inverseClass)(t,"art-current")}else{var r,n=(0,f.createElement)("div");this.cache.set(e,n),(0,f.addClass)(n,"art-setting-panel"),(0,f.append)(this.$parent,n),(0,f.inverseClass)(n,"art-current"),(null==(r=e[0])?void 0:r.$parent)&&this.createHeader(e[0]);for(var o=0;o\n ').concat(t.escape?(0,y.escape)(e):e,"\n")}).join("")}).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}},{key:"switch",value:function(e){return(0,a._)(function(e){var t,r,n,o,a,s,i,c=arguments;return(0,d._)(this,function(l){switch(l.label){case 0:return t=c.length>1&&void 0!==c[1]?c[1]:{},n=(r=this.art).i18n,o=r.notice,a=r.option,s=(0,p._)((0,u._)({},a.subtitle,t),{url:e}),[4,this.init(s)];case 1:return i=l.sent(),t.name&&(o.show="".concat(n.get("Switch Subtitle"),": ").concat(t.name)),[2,i]}})}).apply(this,arguments)}},{key:"createTrack",value:function(e,t){var r=this,n=this.art,o=n.template,a=n.proxy,s=n.option,i=o.$video,c=o.$track,l=(0,y.createElement)("track");l.default=!0,l.kind=e,l.src=t,l.label=s.subtitle.name||"Artplayer",l.track.mode="hidden",l.onload=function(){r.art.emit("subtitleLoad",r.cues,r.option)},this.art.events.remove(this.destroyEvent),c.onload=null,(0,y.remove)(c),(0,y.append)(i,l),o.$track=l,this.destroyEvent=a(this.textTrack,"cuechange",function(){return r.update()})}},{key:"init",value:function(e){return(0,a._)(function(){var t,r,n,o;return(0,d._)(this,function(a){return(t=this,n=(r=this.art).notice,o=r.template.$subtitle,this.textTrack)?((0,m.default)(e,g.default.subtitle),e.url)?(this.option=e,this.style(e.style),[2,fetch(e.url).then(function(e){return e.arrayBuffer()}).then(function(t){var r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,y.getExt)(e.url)){case"srt":var n=(0,y.srtToVtt)(r),o=e.onVttLoad(n);return(0,y.vttToBlob)(o);case"ass":var a=(0,y.assToVtt)(r),s=e.onVttLoad(a);return(0,y.vttToBlob)(s);case"vtt":var i=e.onVttLoad(r);return(0,y.vttToBlob)(i);default:return e.url}}).then(function(e){return o.innerHTML="",t.url===e||(URL.revokeObjectURL(t.url),t.createTrack("metadata",e)),e}).catch(function(e){throw o.innerHTML="",n.show=e,e})]):[2]:[2,null]})}).call(this)}}]),t}(o.interopDefault(b).default)},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","option-validator":"8zKz5","./scheme":"3Srhh","./utils":"hQMLb","./utils/component":"hXsfe","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],jkHHJ:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return l});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../package.json"),c=e("./utils"),l=function(){"use strict";function e(t){var r=this;(0,a._)(this,e),this.art=t;var n=t.option,o=t.constructor;n.container instanceof Element?this.$container=n.container:(this.$container=(0,c.query)(n.container),(0,c.errorHandle)(this.$container,"No container element found by ".concat(n.container))),(0,c.errorHandle)((0,c.supportsFlex)(),"The current browser does not support flex layout");var s=this.$container.tagName.toLowerCase();(0,c.errorHandle)("div"===s,"Unsupported container element type, only support 'div' but got '".concat(s,"'")),(0,c.errorHandle)(o.instances.every(function(e){return e.template.$container!==r.$container}),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}return(0,s._)(e,[{key:"query",value:function(e){return(0,c.query)(e,this.$container)}},{key:"init",value:function(){var t=this.art.option;if(t.useSSR||(this.$container.innerHTML=e.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),t.proxy){var r=t.proxy.call(this.art,this.art);(0,c.errorHandle)(r instanceof HTMLVideoElement||r instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,c.replaceElement)(r,this.$video),r.className="art-video",this.$video=r}t.backdrop&&(0,c.addClass)(this.$player,"art-backdrop"),c.isMobile&&(0,c.addClass)(this.$player,"art-mobile")}},{key:"destroy",value:function(e){e?this.$container.innerHTML="":(0,c.addClass)(this.$player,"art-destroy")}}],[{key:"html",get:function(){return'\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Player version:
\n
'.concat(i.version,'
\n
\n
\n
Video url:
\n
\n
\n
\n
Video volume:
\n
\n
\n
\n
Video time:
\n
\n
\n
\n
Video duration:
\n
\n
\n
\n
Video resolution:
\n
\nx\n
\n
\n
\n
[x]
\n
\n
\n
\n ')}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","../package.json":"2Jf7W","./utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ikoiH:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=function(){"use strict";function e(){(0,a._)(this,e)}return(0,s._)(e,[{key:"on",value:function(e,t,r){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:t,ctx:r}),this}},{key:"once",value:function(e,t,r){var n=this;function o(){for(var a=arguments.length,s=Array(a),i=0;i1?t-1:0),n=1;nt.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Y}static get scheme(){return P.default}static get Emitter(){return K.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Y.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Y.isBrowser&&(window.Artplayer=Q,Y.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"2wh8D","option-validator":"g7VGh","../package.json":"lh3R5","./config":"eJfh8","./contextmenu":"9zso8","./control":"dp1yk","./events":"jmVSD","./hotkey":"dswts","./i18n":"d9ktO","./icons":"fFHY0","./info":"kZ0F8","./layer":"j9lbi","./loading":"bMjWd","./mask":"k1nkQ","./notice":"fPVaU","./player":"uR0Sw","./plugins":"cjxJL","./scheme":"biLjm","./setting":"bwLGT","./storage":"kwqbK","./subtitle":"k5613","./template":"fwOA1","./utils":"aBlEo","./utils/emitter":"4NM7P","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2wh8D":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],g7VGh:[function(e,t,r,a){t.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],eJfh8:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"9zso8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"aBlEo","../utils/component":"idCEj","./aspectRatio":"6XHP2","./close":"eF6AX","./flip":"7Wg1P","./info":"fjRnU","./playbackRate":"hm1DY","./version":"aJBeL","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBlEo:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"jg0yq","./dom":"eANXw","./error":"4FwTI","./file":"i2JbS","./format":"dy9GH","./property":"jY49c","./subtitle":"ke7ox","./time":"f7gsx","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jg0yq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eANXw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>j),o.export(r,"getIcon",()=>k),o.export(r,"setStyleText",()=>E),o.export(r,"supportsFlex",()=>S),o.export(r,"getRect",()=>$),o.export(r,"loadImg",()=>M),o.export(r,"getComposedPath",()=>I);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function j(e){return document.createElement(e)}function k(e="",t=""){let r=j("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function E(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function S(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function $(e){return e.getBoundingClientRect()}function M(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"jg0yq","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4FwTI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i2JbS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dy9GH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jY49c:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ke7ox:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f7gsx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],idCEj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`,a=this.cache.get(r);(0,c.errorHandle)(!a,`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let o=(0,l.createElement)("div");(0,l.addClass)(o,`art-${this.name}`),(0,l.addClass)(o,`art-${this.name}-${r}`);let i=Array.from(this.$parent.children);o.dataset.index=t.index||this.id;let p=i.find(e=>Number(e.dataset.index)>=Number(o.dataset.index));p?p.insertAdjacentElement("beforebegin",o):(0,l.append)(this.$parent,o),t.html&&(0,l.append)(o,t.html),t.style&&(0,l.setStyles)(o,t.style),t.tooltip&&(0,l.tooltip)(o,t.tooltip);let d=[];if(t.click){let e=this.art.events.proxy(o,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});d.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,o,d),this[r]=o,this.cache.set(r,{$ref:o,events:d,option:t}),t.mounted&&t.mounted.call(this.art,o),o}remove(e){let t=this.cache.get(e);(0,c.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;ef);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6XHP2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eF6AX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7Wg1P":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjRnU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hm1DY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aJBeL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"lh3R5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dp1yk:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),j=e("./setting"),k=o.interopDefault(j),E=e("./time"),S=o.interopDefault(E),$=e("./volume"),M=o.interopDefault($);class I extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,M.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,S.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,k.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=I},{"../utils":"aBlEo","../utils/component":"idCEj","./airplay":"amOzz","./fullscreen":"3GuBU","./fullscreenWeb":"jj1KV","./pip":"jMeHN","./playAndPause":"u3h8M","./progress":"1XZSS","./screenshot":"dIscA","./setting":"aqA0g","./time":"ihweO","./volume":"fJVWn","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],amOzz:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3GuBU":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jj1KV:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jMeHN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],u3h8M:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1XZSS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
`,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dIscA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aqA0g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ihweO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
'),l=(0,i.append)(s,'
'),c=(0,i.append)(l,'
'),p=(0,i.append)(l,'
'),d=(0,i.append)(p,'
'),u=(0,i.append)(d,'
'),f=(0,i.append)(p,'
');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jmVSD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){let t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;en);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"9wEzB":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"1XZSS","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ikBrS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jwNq0:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eqSsP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"42JNz":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7kM1M":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2IW9m":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dswts:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"gkZgZ","bundle-text:./arrow-left.svg":"kQyD4","bundle-text:./arrow-right.svg":"64ztm","bundle-text:./aspect-ratio.svg":"72LvA","bundle-text:./check.svg":"4QmBo","bundle-text:./close.svg":"j1hoe","bundle-text:./config.svg":"hNZaT","bundle-text:./error.svg":"dKh4l","bundle-text:./flip.svg":"lIEIE","bundle-text:./fullscreen-off.svg":"1533e","bundle-text:./fullscreen-on.svg":"76ut3","bundle-text:./fullscreen-web-off.svg":"3NzMk","bundle-text:./fullscreen-web-on.svg":"12xHc","bundle-text:./loading.svg":"iVcUF","bundle-text:./lock.svg":"1J4so","bundle-text:./pause.svg":"1KgkK","bundle-text:./pip.svg":"4h4tM","bundle-text:./play.svg":"jecAY","bundle-text:./playback-rate.svg":"anPe9","bundle-text:./screenshot.svg":"9BPYQ","bundle-text:./setting.svg":"hsI9k","bundle-text:./state.svg":"gr1ZU","bundle-text:./switch-off.svg":"6kdAr","bundle-text:./switch-on.svg":"ksdMo","bundle-text:./unlock.svg":"iz5Qc","bundle-text:./volume-close.svg":"3OZoa","bundle-text:./volume.svg":"hRYA4","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gkZgZ:[function(e,t,r,a){t.exports=''},{}],kQyD4:[function(e,t,r,a){t.exports=''},{}],"64ztm":[function(e,t,r,a){t.exports=''},{}],"72LvA":[function(e,t,r,a){t.exports=''},{}],"4QmBo":[function(e,t,r,a){t.exports=''},{}],j1hoe:[function(e,t,r,a){t.exports=''},{}],hNZaT:[function(e,t,r,a){t.exports=''},{}],dKh4l:[function(e,t,r,a){t.exports=''},{}],lIEIE:[function(e,t,r,a){t.exports=''},{}],"1533e":[function(e,t,r,a){t.exports=''},{}],"76ut3":[function(e,t,r,a){t.exports=''},{}],"3NzMk":[function(e,t,r,a){t.exports=''},{}],"12xHc":[function(e,t,r,a){t.exports=''},{}],iVcUF:[function(e,t,r,a){t.exports=''},{}],"1J4so":[function(e,t,r,a){t.exports=''},{}],"1KgkK":[function(e,t,r,a){t.exports=''},{}],"4h4tM":[function(e,t,r,a){t.exports=''},{}],jecAY:[function(e,t,r,a){t.exports=''},{}],anPe9:[function(e,t,r,a){t.exports=''},{}],"9BPYQ":[function(e,t,r,a){t.exports=''},{}],hsI9k:[function(e,t,r,a){t.exports=''},{}],gr1ZU:[function(e,t,r,a){t.exports=''},{}],"6kdAr":[function(e,t,r,a){t.exports=''},{}],ksdMo:[function(e,t,r,a){t.exports=''},{}],iz5Qc:[function(e,t,r,a){t.exports=''},{}],"3OZoa":[function(e,t,r,a){t.exports=''},{}],hRYA4:[function(e,t,r,a){t.exports=''},{}],kZ0F8:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fPVaU:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],uR0Sw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),j=o.interopDefault(w),k=e("./flipMix"),E=o.interopDefault(k),S=e("./fullscreenMix"),$=o.interopDefault(S),M=e("./fullscreenWebMix"),I=o.interopDefault(M),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),q=o.interopDefault(F),D=e("./optionInit"),A=o.interopDefault(D),R=e("./pauseMix"),B=o.interopDefault(R),L=e("./pipMix"),O=o.interopDefault(L),P=e("./playbackRateMix"),z=o.interopDefault(P),X=e("./playedMix"),V=o.interopDefault(X),_=e("./playingMix"),H=o.interopDefault(_),N=e("./playMix"),W=o.interopDefault(N),U=e("./posterMix"),Y=o.interopDefault(U),Z=e("./qualityMix"),K=o.interopDefault(Z),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,B.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,z.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,$.default)(e),(0,I.default)(e),(0,O.default)(e),(0,C.default)(e),(0,V.default)(e),(0,H.default)(e),(0,h.default)(e),(0,J.default)(e),(0,E.default)(e),(0,q.default)(e),(0,Y.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,K.default)(e),(0,eu.default)(e),(0,j.default)(e),(0,A.default)(e)}}},{"./airplayMix":"d8BTB","./aspectRatioMix":"aQNJl","./attrMix":"5DA9e","./autoHeightMix":"1swKn","./autoSizeMix":"lSbiD","./cssVarMix":"32Hp1","./currentTimeMix":"kfZbu","./durationMix":"eV1ag","./eventInit":"f8NQq","./flipMix":"ea3Qm","./fullscreenMix":"ffXE3","./fullscreenWebMix":"8tarF","./loadedMix":"f9syH","./miniMix":"dLuS7","./optionInit":"d1F69","./pauseMix":"kewk9","./pipMix":"4XzDs","./playbackRateMix":"jphfi","./playedMix":"iNpeS","./playingMix":"aBIWL","./playMix":"hRBri","./posterMix":"fgfXC","./qualityMix":"17rUP","./rectMix":"55qzI","./screenshotMix":"bC6TG","./seekMix":"j8GRO","./stateMix":"cn7iR","./subtitleOffsetMix":"2k4nP","./switchMix":"6SU6j","./themeMix":"7iMuh","./thumbnailsMix":"6P0RS","./toggleMix":"eNi78","./typeMix":"7AUBD","./urlMix":"cnlLL","./volumeMix":"iX66j","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d8BTB:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aQNJl:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"5DA9e":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1swKn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lSbiD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"32Hp1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kfZbu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eV1ag:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f8NQq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"eJfh8","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ea3Qm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ffXE3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"iSPAQ","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iSPAQ:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8tarF":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f9syH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dLuS7:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
'),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d1F69:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kewk9:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4XzDs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jphfi:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNpeS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBIWL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hRBri:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"17rUP":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"55qzI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bC6TG:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],j8GRO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cn7iR:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return;let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="",e.once("video:error",o),e.once("video:loadedmetadata",()=>{e.currentTime=r}),e.once("video:canplay",async()=>{e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()})})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7iMuh":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6P0RS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eNi78:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7AUBD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cnlLL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iX66j:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cjxJL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"aBlEo","./autoOrientation":"jb9jb","./autoPlayback":"21HWM","./fastForward":"4sxBO","./lock":"fjy9V","./miniProgressBar":"d0xRp","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jb9jb:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"21HWM":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
`}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4sxBO":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjy9V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d0xRp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bwLGT:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t'),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
'),d=(0,i.append)(c,'
'),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ljJTO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3QcSQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eB5hg:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kwqbK:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],k5613:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
${e.escape?(0,c.escape)(t):t}
`).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"g7VGh","./scheme":"biLjm","./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fwOA1:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
Player version:
${o.version}
Video url:
Video volume:
Video time:
Video duration:
Video resolution:
x
[x]
`}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"lh3R5","./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4NM7P":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;et.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Y}static get scheme(){return P.default}static get Emitter(){return K.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Y.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Y.isBrowser&&(window.Artplayer=Q,Y.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"2wh8D","option-validator":"g7VGh","../package.json":"lh3R5","./config":"eJfh8","./contextmenu":"9zso8","./control":"dp1yk","./events":"jmVSD","./hotkey":"dswts","./i18n":"d9ktO","./icons":"fFHY0","./info":"kZ0F8","./layer":"j9lbi","./loading":"bMjWd","./mask":"k1nkQ","./notice":"fPVaU","./player":"uR0Sw","./plugins":"cjxJL","./scheme":"biLjm","./setting":"bwLGT","./storage":"kwqbK","./subtitle":"k5613","./template":"fwOA1","./utils":"aBlEo","./utils/emitter":"4NM7P","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2wh8D":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],g7VGh:[function(e,t,r,a){t.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],eJfh8:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"9zso8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"aBlEo","../utils/component":"idCEj","./aspectRatio":"6XHP2","./close":"eF6AX","./flip":"7Wg1P","./info":"fjRnU","./playbackRate":"hm1DY","./version":"aJBeL","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBlEo:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"jg0yq","./dom":"eANXw","./error":"4FwTI","./file":"i2JbS","./format":"dy9GH","./property":"jY49c","./subtitle":"ke7ox","./time":"f7gsx","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jg0yq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eANXw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>j),o.export(r,"getIcon",()=>k),o.export(r,"setStyleText",()=>E),o.export(r,"supportsFlex",()=>S),o.export(r,"getRect",()=>$),o.export(r,"loadImg",()=>M),o.export(r,"getComposedPath",()=>I);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function j(e){return document.createElement(e)}function k(e="",t=""){let r=j("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function E(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function S(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function $(e){return e.getBoundingClientRect()}function M(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"jg0yq","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4FwTI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i2JbS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dy9GH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jY49c:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ke7ox:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f7gsx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],idCEj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`;(0,c.errorHandle)(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let a=(0,l.createElement)("div");(0,l.addClass)(a,`art-${this.name}`),(0,l.addClass)(a,`art-${this.name}-${r}`);let o=Array.from(this.$parent.children);a.dataset.index=t.index||this.id;let i=o.find(e=>Number(e.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement("beforebegin",a):(0,l.append)(this.$parent,a),t.html&&(0,l.append)(a,t.html),t.style&&(0,l.setStyles)(a,t.style),t.tooltip&&(0,l.tooltip)(a,t.tooltip);let p=[];if(t.click){let e=this.art.events.proxy(a,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});p.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,a,p),this[r]=a,this.cache.set(r,{$ref:a,events:p,option:t}),t.mounted&&t.mounted.call(this.art,a),a}remove(e){(0,c.errorHandle)(this.cache.has(e),`Can't find [${e}] from the [${this.name}]`);let t=this.cache.get(e);for(let e of(t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref),t.events))this.art.events.remove(e);this.cache.delete(e),delete this[e],(0,l.remove)(t.$ref)}update(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}},{"option-validator":"g7VGh","../scheme":"biLjm","./dom":"eANXw","./error":"4FwTI","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],biLjm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",()=>f);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6XHP2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eF6AX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7Wg1P":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjRnU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hm1DY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aJBeL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"lh3R5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dp1yk:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),j=e("./setting"),k=o.interopDefault(j),E=e("./time"),S=o.interopDefault(E),$=e("./volume"),M=o.interopDefault($);class I extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,M.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,S.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,k.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=I},{"../utils":"aBlEo","../utils/component":"idCEj","./airplay":"amOzz","./fullscreen":"3GuBU","./fullscreenWeb":"jj1KV","./pip":"jMeHN","./playAndPause":"u3h8M","./progress":"1XZSS","./screenshot":"dIscA","./setting":"aqA0g","./time":"ihweO","./volume":"fJVWn","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],amOzz:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3GuBU":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jj1KV:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jMeHN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],u3h8M:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1XZSS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
`,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dIscA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aqA0g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ihweO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
'),l=(0,i.append)(s,'
'),c=(0,i.append)(l,'
'),p=(0,i.append)(l,'
'),d=(0,i.append)(p,'
'),u=(0,i.append)(d,'
'),f=(0,i.append)(p,'
');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jmVSD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.add(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}destroy(){for(let e of this.destroyEvents)try{e()}catch(e){console.warn("Failed to destroy event listener:",e)}this.destroyEvents.clear()}}},{"./clickInit":"i8G6V","./gestureInit":"9wEzB","./globalInit":"ikBrS","./hoverInit":"jwNq0","./moveInit":"eqSsP","./resizeInit":"42JNz","./updateInit":"7kM1M","./viewInit":"2IW9m","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i8G6V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"9wEzB":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"1XZSS","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ikBrS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jwNq0:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eqSsP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"42JNz":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7kM1M":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2IW9m":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dswts:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"gkZgZ","bundle-text:./arrow-left.svg":"kQyD4","bundle-text:./arrow-right.svg":"64ztm","bundle-text:./aspect-ratio.svg":"72LvA","bundle-text:./check.svg":"4QmBo","bundle-text:./close.svg":"j1hoe","bundle-text:./config.svg":"hNZaT","bundle-text:./error.svg":"dKh4l","bundle-text:./flip.svg":"lIEIE","bundle-text:./fullscreen-off.svg":"1533e","bundle-text:./fullscreen-on.svg":"76ut3","bundle-text:./fullscreen-web-off.svg":"3NzMk","bundle-text:./fullscreen-web-on.svg":"12xHc","bundle-text:./loading.svg":"iVcUF","bundle-text:./lock.svg":"1J4so","bundle-text:./pause.svg":"1KgkK","bundle-text:./pip.svg":"4h4tM","bundle-text:./play.svg":"jecAY","bundle-text:./playback-rate.svg":"anPe9","bundle-text:./screenshot.svg":"9BPYQ","bundle-text:./setting.svg":"hsI9k","bundle-text:./state.svg":"gr1ZU","bundle-text:./switch-off.svg":"6kdAr","bundle-text:./switch-on.svg":"ksdMo","bundle-text:./unlock.svg":"iz5Qc","bundle-text:./volume-close.svg":"3OZoa","bundle-text:./volume.svg":"hRYA4","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gkZgZ:[function(e,t,r,a){t.exports=''},{}],kQyD4:[function(e,t,r,a){t.exports=''},{}],"64ztm":[function(e,t,r,a){t.exports=''},{}],"72LvA":[function(e,t,r,a){t.exports=''},{}],"4QmBo":[function(e,t,r,a){t.exports=''},{}],j1hoe:[function(e,t,r,a){t.exports=''},{}],hNZaT:[function(e,t,r,a){t.exports=''},{}],dKh4l:[function(e,t,r,a){t.exports=''},{}],lIEIE:[function(e,t,r,a){t.exports=''},{}],"1533e":[function(e,t,r,a){t.exports=''},{}],"76ut3":[function(e,t,r,a){t.exports=''},{}],"3NzMk":[function(e,t,r,a){t.exports=''},{}],"12xHc":[function(e,t,r,a){t.exports=''},{}],iVcUF:[function(e,t,r,a){t.exports=''},{}],"1J4so":[function(e,t,r,a){t.exports=''},{}],"1KgkK":[function(e,t,r,a){t.exports=''},{}],"4h4tM":[function(e,t,r,a){t.exports=''},{}],jecAY:[function(e,t,r,a){t.exports=''},{}],anPe9:[function(e,t,r,a){t.exports=''},{}],"9BPYQ":[function(e,t,r,a){t.exports=''},{}],hsI9k:[function(e,t,r,a){t.exports=''},{}],gr1ZU:[function(e,t,r,a){t.exports=''},{}],"6kdAr":[function(e,t,r,a){t.exports=''},{}],ksdMo:[function(e,t,r,a){t.exports=''},{}],iz5Qc:[function(e,t,r,a){t.exports=''},{}],"3OZoa":[function(e,t,r,a){t.exports=''},{}],hRYA4:[function(e,t,r,a){t.exports=''},{}],kZ0F8:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fPVaU:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null,e.on("destroy",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],uR0Sw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),j=o.interopDefault(w),k=e("./flipMix"),E=o.interopDefault(k),S=e("./fullscreenMix"),$=o.interopDefault(S),M=e("./fullscreenWebMix"),I=o.interopDefault(M),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),q=o.interopDefault(F),D=e("./optionInit"),A=o.interopDefault(D),R=e("./pauseMix"),B=o.interopDefault(R),L=e("./pipMix"),O=o.interopDefault(L),P=e("./playbackRateMix"),z=o.interopDefault(P),X=e("./playedMix"),V=o.interopDefault(X),_=e("./playingMix"),H=o.interopDefault(_),N=e("./playMix"),W=o.interopDefault(N),U=e("./posterMix"),Y=o.interopDefault(U),Z=e("./qualityMix"),K=o.interopDefault(Z),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,B.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,z.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,$.default)(e),(0,I.default)(e),(0,O.default)(e),(0,C.default)(e),(0,V.default)(e),(0,H.default)(e),(0,h.default)(e),(0,J.default)(e),(0,E.default)(e),(0,q.default)(e),(0,Y.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,K.default)(e),(0,eu.default)(e),(0,j.default)(e),(0,A.default)(e)}}},{"./airplayMix":"d8BTB","./aspectRatioMix":"aQNJl","./attrMix":"5DA9e","./autoHeightMix":"1swKn","./autoSizeMix":"lSbiD","./cssVarMix":"32Hp1","./currentTimeMix":"kfZbu","./durationMix":"eV1ag","./eventInit":"f8NQq","./flipMix":"ea3Qm","./fullscreenMix":"ffXE3","./fullscreenWebMix":"8tarF","./loadedMix":"f9syH","./miniMix":"dLuS7","./optionInit":"d1F69","./pauseMix":"kewk9","./pipMix":"4XzDs","./playbackRateMix":"jphfi","./playedMix":"iNpeS","./playingMix":"aBIWL","./playMix":"hRBri","./posterMix":"fgfXC","./qualityMix":"17rUP","./rectMix":"55qzI","./screenshotMix":"bC6TG","./seekMix":"j8GRO","./stateMix":"cn7iR","./subtitleOffsetMix":"2k4nP","./switchMix":"6SU6j","./themeMix":"7iMuh","./thumbnailsMix":"6P0RS","./toggleMix":"eNi78","./typeMix":"7AUBD","./urlMix":"cnlLL","./volumeMix":"iX66j","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d8BTB:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aQNJl:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"5DA9e":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1swKn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lSbiD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"32Hp1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kfZbu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eV1ag:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f8NQq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"eJfh8","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ea3Qm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ffXE3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"iSPAQ","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iSPAQ:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8tarF":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f9syH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dLuS7:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
'),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d1F69:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kewk9:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4XzDs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jphfi:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNpeS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBIWL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hRBri:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"17rUP":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"55qzI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bC6TG:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],j8GRO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cn7iR:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return void a();let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="";let l={};l.error=t=>{e.off("video:canplay",l.canplay),e.off("video:loadedmetadata",l.metadata),o(t)},l.metadata=()=>{e.currentTime=r},l.canplay=async()=>{e.off("video:error",l.error),e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()},e.once("video:error",l.error),e.once("video:loadedmetadata",l.metadata),e.once("video:canplay",l.canplay)})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7iMuh":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6P0RS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eNi78:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7AUBD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cnlLL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iX66j:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cjxJL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"aBlEo","./autoOrientation":"jb9jb","./autoPlayback":"21HWM","./fastForward":"4sxBO","./lock":"fjy9V","./miniProgressBar":"d0xRp","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jb9jb:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"21HWM":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
`}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4sxBO":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjy9V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d0xRp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bwLGT:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t'),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
'),d=(0,i.append)(c,'
'),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ljJTO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3QcSQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eB5hg:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kwqbK:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],k5613:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
${e.escape?(0,c.escape)(t):t}
`).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"g7VGh","./scheme":"biLjm","./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fwOA1:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
Player version:
${o.version}
Video url:
Video volume:
Video time:
Video duration:
Video resolution:
x
[x]
`}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"lh3R5","./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4NM7P":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;e - + @@ -21,7 +21,7 @@
- + \ No newline at end of file diff --git a/docs/document/advanced/built-in.html b/docs/document/advanced/built-in.html index 84df5f103..995cb278c 100644 --- a/docs/document/advanced/built-in.html +++ b/docs/document/advanced/built-in.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

高级属性 ​

这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用

option ​

播放器的选项

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

高级属性 ​

这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用

option ​

播放器的选项

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -138,7 +138,18 @@
     art.subtitle.style({
         color: 'red',
     });
-});

loading ​

管理播放器的加载层

  • show 属性用于设置是否显示加载层
  • toggle 属性用于切换是否显示加载层
▶ Run Code
js
var art = new Artplayer({
+});

info ​

管理播放器的信息面板,常用于查看当前播放器和视频的运行状态,例如版本号、分辨率、时长等。

  • 通过 art.info.show 控制面板的显示与隐藏
  • 触发的事件名为 info(详见事件文档)
▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.info.show = true;
+
+    setTimeout(() => {
+        art.info.show = false;
+    }, 3000);
+});

loading ​

管理播放器的加载层

  • show 属性用于设置是否显示加载层
  • toggle 属性用于切换是否显示加载层
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -205,8 +216,8 @@
 
 art.on('ready', () => {
     art.plugins.add(myPlugin);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/advanced/class.html b/docs/document/advanced/class.html index 8f23aa30f..5e2ed9498 100644 --- a/docs/document/advanced/class.html +++ b/docs/document/advanced/class.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

静态属性 ​

这里的 静态属性 是指挂载在 构造函数 的 一级属性,非常少使用

instances ​

返回全部播放器实例的数组,假如你想同时管理多个播放器的时候,可以用到该属性

▶ Run Code
js
console.info([...Artplayer.instances]);
+    
Skip to content

静态属性 ​

这里的 静态属性 是指挂载在 构造函数 的 一级属性,非常少使用

instances ​

返回全部播放器实例的数组,假如你想同时管理多个播放器的时候,可以用到该属性

▶ Run Code
js
console.info([...Artplayer.instances]);
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -31,7 +31,7 @@
 });
 
 console.info([...Artplayer.instances]);

version ​

返回播放器的版本信息

▶ Run Code
js
console.info(Artplayer.version);

env ​

返回播放器的环境变量

▶ Run Code
js
console.info(Artplayer.env);

build ​

返回播放器的打包时间

▶ Run Code
js
console.info(Artplayer.build);

config ​

返回视频的默认配置

▶ Run Code
js
console.info(Artplayer.config);

utils ​

返回播放器的工具函数集合

▶ Run Code
js
console.info(Artplayer.utils);

全部工具函数请参考以下地址:

artplayer/types/utils.d.ts

scheme ​

返回播放器选项的校验方案

▶ Run Code
js
console.info(Artplayer.scheme);

Emitter ​

返回事件分发器的构造函数

▶ Run Code
js
console.info(Artplayer.Emitter);

validator ​

返回选项的校验函数

▶ Run Code
js
console.info(Artplayer.validator);

kindOf ​

返回类型检测的函数工具

▶ Run Code
js
console.info(Artplayer.kindOf);

html ​

返回播放器所需的 html 字符串

▶ Run Code
js
console.info(Artplayer.html);

option ​

返回播放器的默认选项

▶ Run Code
js
console.info(Artplayer.option);
- + \ No newline at end of file diff --git a/docs/document/advanced/event.html b/docs/document/advanced/event.html index 6f14e07e0..a893b671c 100644 --- a/docs/document/advanced/event.html +++ b/docs/document/advanced/event.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

实例事件 ​

播放器的事件分为两种,一种视频的 原生事件 (前缀 video:),另外一种是 自定义事件

监听事件:

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

实例事件 ​

播放器的事件分为两种,一种视频的 原生事件 (前缀 video:),另外一种是 自定义事件

监听事件:

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -385,7 +385,7 @@
 art.on('keydown', (event) => {
     console.log(event.code);
 });

video:canplay ​

浏览器可以播放媒体文件了,但估计没有足够的数据来支撑播放到结束,不必停下来进一步缓冲内容

video:canplaythrough ​

浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束

video:complete ​

OfflineAudioContext 渲染完成

video:durationchange ​

duration 属性的值改变时触发

video:emptied ​

媒体内容变为空;例如,当这个 media 已经加载完成(或者部分加载完成),则发送此事件,并调用 load() 方法重新加载它

video:ended ​

视频停止播放,因为 media 已经到达结束点

video:error ​

获取媒体数据时出错,或者资源类型不是受支持的媒体格式

video:loadeddata ​

media 中的首帧已经完成加载

video:loadedmetadata ​

已加载元数据

video:pause ​

播放已暂停

video:play ​

播放已开始

video:playing ​

由于缺乏数据而暂停或延迟后,播放准备开始

video:progress ​

在浏览器加载资源时周期性触发

video:ratechange ​

播放速率发生变化

video:seeked ​

跳帧(seek)操作完成

video:seeking ​

跳帧(seek)操作开始

video:stalled ​

用户代理(user agent)正在尝试获取媒体数据,但数据意外未出现

video:suspend ​

媒体数据加载已暂停

video:timeupdate ​

currentTime 属性指定的时间发生变化

video:volumechange ​

音量发生变化

video:waiting ​

由于暂时缺少数据,播放已停止

- + \ No newline at end of file diff --git a/docs/document/advanced/global.html b/docs/document/advanced/global.html index 2a2f3c5ad..dcf2f7e31 100644 --- a/docs/document/advanced/global.html +++ b/docs/document/advanced/global.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

全局属性 ​

这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到

DEBUG ​

是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭

▶ Run Code
js
Artplayer.DEBUG = true;
+    
Skip to content

全局属性 ​

这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到

DEBUG ​

是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭

▶ Run Code
js
Artplayer.DEBUG = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -222,7 +222,7 @@
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

网页全屏时,是否把播放器挂在在 body 元素下,默认为 false

▶ Run Code
js
Artplayer.FULLSCREEN_WEB_IN_BODY = true;
+art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

网页全屏时,是否把播放器挂在在 body 元素下,默认为 true

▶ Run Code
js
Artplayer.FULLSCREEN_WEB_IN_BODY = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -239,8 +239,16 @@
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     miniProgressBar: true,
-});
- +});

REMOVE_SRC_WHEN_DESTROY ​

在销毁播放器时,是否同时移除视频的 src 属性并调用 load() 以主动释放媒体资源,默认为 true。

开启后可以在单页应用或频繁创建/销毁播放器的场景下,减少视频资源占用;如果你希望保留 video 元素的状态,仅移除界面,可将其设置为 false。

▶ Run Code
js
Artplayer.REMOVE_SRC_WHEN_DESTROY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+// 只销毁界面,不主动清空 src
+art.destroy();
+ \ No newline at end of file diff --git a/docs/document/advanced/plugin.html b/docs/document/advanced/plugin.html index f74c6cf5a..67085bdf9 100644 --- a/docs/document/advanced/plugin.html +++ b/docs/document/advanced/plugin.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

编写插件 ​

但你已经知道播放器的属性, 方法和事件后,再编写插件是非常简单的事

可以在实例化的时候加载插件的函数

▶ Run Code
js
function myPlugin(art) {
+    
Skip to content

编写插件 ​

但你已经知道播放器的属性, 方法和事件后,再编写插件是非常简单的事

可以在实例化的时候加载插件的函数

▶ Run Code
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -122,7 +122,7 @@
         })
     ],
 });
- + \ No newline at end of file diff --git a/docs/document/advanced/property.html b/docs/document/advanced/property.html index eaf6e8eff..744fe4ac5 100644 --- a/docs/document/advanced/property.html +++ b/docs/document/advanced/property.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

实例属性 ​

这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用

play ​

  • Type: Function

播放视频

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

实例属性 ​

这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用

play ​

  • Type: Function

播放视频

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -62,7 +62,15 @@
 
 art.on('ready', () => {
     art.destroy();
-});

seek ​

  • Type: Setter
  • Parameter: Number

视频时间跳转,单位秒

▶ Run Code
js
var art = new Artplayer({
+});

reset ​

  • Type: Function

重置播放器的视频元素:会移除当前 src 并调用一次 load(),常用于在单页应用中手动释放媒体资源或重新初始化视频标签。

注意:全局配置 Artplayer.REMOVE_SRC_WHEN_DESTROY 也会在调用 destroy() 时自动执行类似逻辑。

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    // 仅重置 video,不移除界面
+    art.reset();
+});

seek ​

  • Type: Setter
  • Parameter: Number

视频时间跳转,单位秒

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -242,6 +250,14 @@
 
 art.on('ready', () => {
     console.info(art.playing);
+});

state ​

  • Type: Setter/Getter
  • Parameter: String

获取或设置播放器当前状态,支持:standard(正常)、mini(迷你窗)、pip(画中画)、fullscreen(窗口全屏)、fullscreenWeb(网页全屏)。

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.state); // 默认 standard
+    art.state = 'mini';
 });

autoSize ​

  • Type: Function

设置视频是否自适应尺寸

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -256,7 +272,14 @@
 
 art.on('ready', () => {
     console.info(JSON.stringify(art.rect));
-});

提示

尺寸和坐标信息是通过 getBoundingClientRect 获取的

flip ​

  • Type: Setter/Getter
  • Parameter: String

设置和获取播放器翻转,支持normal, horizontal, vertical

▶ Run Code
js
var art = new Artplayer({
+});

提示

尺寸和坐标信息是通过 getBoundingClientRect 获取的

bottom / top / left / right / x / y / width / height ​

  • Type: Getter

这些属性是对 rect 的快捷访问:

  • bottom, top, left, right, x, y:对应 DOMRect 的同名字段
  • width, height:播放器当前可见宽高
▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.width, art.height, art.left, art.top);
+});

flip ​

  • Type: Setter/Getter
  • Parameter: String

设置和获取播放器翻转,支持normal, horizontal, vertical

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -340,6 +363,13 @@
 
 art.on('video:timeupdate', () => {
     console.info(art.loaded);
+});

loadedTime ​

  • Type: Getter

已缓存的媒体时长,单位为秒。通常与 loaded 一起使用,用于展示缓冲进度细节。

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('video:timeupdate', () => {
+    console.info(art.loadedTime);
 });

played ​

  • Type: Getter

视频播放的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -426,8 +456,8 @@
 
 art.on('ready', () => {
     art.subtitleOffset = 1;
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/assets/advanced_built-in.md.B5ccy6gK.js b/docs/document/assets/advanced_built-in.md.DiyRIcIA.js similarity index 93% rename from docs/document/assets/advanced_built-in.md.B5ccy6gK.js rename to docs/document/assets/advanced_built-in.md.DiyRIcIA.js index bb1cfa124..9f4bc302e 100644 --- a/docs/document/assets/advanced_built-in.md.B5ccy6gK.js +++ b/docs/document/assets/advanced_built-in.md.DiyRIcIA.js @@ -1,4 +1,4 @@ -import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"高级属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/built-in.md","filePath":"advanced/built-in.md","lastUpdated":1726997712000}'),e={name:"advanced/built-in.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

高级属性 ​

这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用

option ​

播放器的选项

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"高级属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/built-in.md","filePath":"advanced/built-in.md","lastUpdated":1764425558000}'),e={name:"advanced/built-in.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

高级属性 ​

这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用

option ​

播放器的选项

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -113,7 +113,18 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     art.subtitle.style({
         color: 'red',
     });
-});

loading ​

管理播放器的加载层

  • show 属性用于设置是否显示加载层
  • toggle 属性用于切换是否显示加载层
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

info ​

管理播放器的信息面板,常用于查看当前播放器和视频的运行状态,例如版本号、分辨率、时长等。

  • 通过 art.info.show 控制面板的显示与隐藏
  • 触发的事件名为 info(详见事件文档)
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.info.show = true;
+
+    setTimeout(() => {
+        art.info.show = false;
+    }, 3000);
+});

loading ​

管理播放器的加载层

  • show 属性用于设置是否显示加载层
  • toggle 属性用于切换是否显示加载层
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
diff --git a/docs/document/assets/advanced_built-in.md.B5ccy6gK.lean.js b/docs/document/assets/advanced_built-in.md.DiyRIcIA.lean.js
similarity index 77%
rename from docs/document/assets/advanced_built-in.md.B5ccy6gK.lean.js
rename to docs/document/assets/advanced_built-in.md.DiyRIcIA.lean.js
index 82d6b846a..f3fd8d4d9 100644
--- a/docs/document/assets/advanced_built-in.md.B5ccy6gK.lean.js
+++ b/docs/document/assets/advanced_built-in.md.DiyRIcIA.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"高级属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/built-in.md","filePath":"advanced/built-in.md","lastUpdated":1726997712000}'),e={name:"advanced/built-in.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(e,[["render",h]]);export{g as __pageData,o as default};
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"高级属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/built-in.md","filePath":"advanced/built-in.md","lastUpdated":1764425558000}'),e={name:"advanced/built-in.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(e,[["render",h]]);export{g as __pageData,o as default};
diff --git a/docs/document/assets/advanced_global.md.C-56tmUD.js b/docs/document/assets/advanced_global.md.Bdw3azKs.js
similarity index 95%
rename from docs/document/assets/advanced_global.md.C-56tmUD.js
rename to docs/document/assets/advanced_global.md.Bdw3azKs.js
index 6e682fb4c..ea1408703 100644
--- a/docs/document/assets/advanced_global.md.C-56tmUD.js
+++ b/docs/document/assets/advanced_global.md.Bdw3azKs.js
@@ -1,4 +1,4 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"全局属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/global.md","filePath":"advanced/global.md","lastUpdated":1718941442000}'),e={name:"advanced/global.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

全局属性 ​

这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到

DEBUG ​

是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DEBUG = true;
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"全局属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/global.md","filePath":"advanced/global.md","lastUpdated":1764425558000}'),e={name:"advanced/global.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

全局属性 ​

这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到

DEBUG ​

是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DEBUG = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -197,7 +197,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

网页全屏时,是否把播放器挂在在 body 元素下,默认为 false

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FULLSCREEN_WEB_IN_BODY = true;
+art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

网页全屏时,是否把播放器挂在在 body 元素下,默认为 true

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FULLSCREEN_WEB_IN_BODY = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -214,4 +214,12 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     miniProgressBar: true,
-});
`,1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; +});

REMOVE_SRC_WHEN_DESTROY ​

在销毁播放器时,是否同时移除视频的 src 属性并调用 load() 以主动释放媒体资源,默认为 true。

开启后可以在单页应用或频繁创建/销毁播放器的场景下,减少视频资源占用;如果你希望保留 video 元素的状态,仅移除界面,可将其设置为 false。

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.REMOVE_SRC_WHEN_DESTROY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+// 只销毁界面,不主动清空 src
+art.destroy();
`,1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/advanced_global.md.C-56tmUD.lean.js b/docs/document/assets/advanced_global.md.Bdw3azKs.lean.js similarity index 87% rename from docs/document/assets/advanced_global.md.C-56tmUD.lean.js rename to docs/document/assets/advanced_global.md.Bdw3azKs.lean.js index 7e5502203..01e266f7b 100644 --- a/docs/document/assets/advanced_global.md.C-56tmUD.lean.js +++ b/docs/document/assets/advanced_global.md.Bdw3azKs.lean.js @@ -1 +1 @@ -import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"全局属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/global.md","filePath":"advanced/global.md","lastUpdated":1718941442000}'),e={name:"advanced/global.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; +import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"全局属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/global.md","filePath":"advanced/global.md","lastUpdated":1764425558000}'),e={name:"advanced/global.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/advanced_property.md.D59FnDH1.js b/docs/document/assets/advanced_property.md.CA7GaeI3.js similarity index 90% rename from docs/document/assets/advanced_property.md.D59FnDH1.js rename to docs/document/assets/advanced_property.md.CA7GaeI3.js index cc0ca731e..4c7b42d77 100644 --- a/docs/document/assets/advanced_property.md.D59FnDH1.js +++ b/docs/document/assets/advanced_property.md.CA7GaeI3.js @@ -1,4 +1,4 @@ -import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"实例属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/property.md","filePath":"advanced/property.md","lastUpdated":1726306667000}'),e={name:"advanced/property.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

实例属性 ​

这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用

play ​

  • Type: Function

播放视频

',5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"实例属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/property.md","filePath":"advanced/property.md","lastUpdated":1764425558000}'),e={name:"advanced/property.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s('

实例属性 ​

这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用

play ​

  • Type: Function

播放视频

',5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -37,7 +37,15 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     art.destroy();
-});

seek ​

  • Type: Setter
  • Parameter: Number

视频时间跳转,单位秒

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

reset ​

  • Type: Function

重置播放器的视频元素:会移除当前 src 并调用一次 load(),常用于在单页应用中手动释放媒体资源或重新初始化视频标签。

注意:全局配置 Artplayer.REMOVE_SRC_WHEN_DESTROY 也会在调用 destroy() 时自动执行类似逻辑。

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    // 仅重置 video,不移除界面
+    art.reset();
+});

seek ​

  • Type: Setter
  • Parameter: Number

视频时间跳转,单位秒

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -217,6 +225,14 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     console.info(art.playing);
+});

state ​

  • Type: Setter/Getter
  • Parameter: String

获取或设置播放器当前状态,支持:standard(正常)、mini(迷你窗)、pip(画中画)、fullscreen(窗口全屏)、fullscreenWeb(网页全屏)。

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.state); // 默认 standard
+    art.state = 'mini';
 });

autoSize ​

  • Type: Function

设置视频是否自适应尺寸

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -224,14 +240,14 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     art.autoSize();
-});

rect ​

  • Type: Getter

获取播放器的尺寸和坐标信息

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

rect ​

  • Type: Getter

获取播放器的尺寸和坐标信息

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s('
js
var art = new Artplayer({\n    container: '.artplayer-app',\n    url: '/assets/sample/video.mp4',\n});\n\nart.on('ready', () => {\n    console.info(JSON.stringify(art.rect));\n});

提示

尺寸和坐标信息是通过 getBoundingClientRect 获取的

bottom / top / left / right / x / y / width / height ​

  • Type: Getter

这些属性是对 rect 的快捷访问:

  • bottom, top, left, right, x, y:对应 DOMRect 的同名字段
  • width, height:播放器当前可见宽高
',6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
-    console.info(JSON.stringify(art.rect));
-});

提示

尺寸和坐标信息是通过 getBoundingClientRect 获取的

flip ​

  • Type: Setter/Getter
  • Parameter: String

设置和获取播放器翻转,支持normal, horizontal, vertical

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    console.info(art.width, art.height, art.left, art.top);
+});

flip ​

  • Type: Setter/Getter
  • Parameter: String

设置和获取播放器翻转,支持normal, horizontal, vertical

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -315,6 +331,13 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('video:timeupdate', () => {
     console.info(art.loaded);
+});

loadedTime ​

  • Type: Getter

已缓存的媒体时长,单位为秒。通常与 loaded 一起使用,用于展示缓冲进度细节。

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('video:timeupdate', () => {
+    console.info(art.loadedTime);
 });

played ​

  • Type: Getter

视频播放的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
diff --git a/docs/document/assets/advanced_property.md.D59FnDH1.lean.js b/docs/document/assets/advanced_property.md.CA7GaeI3.lean.js
similarity index 60%
rename from docs/document/assets/advanced_property.md.D59FnDH1.lean.js
rename to docs/document/assets/advanced_property.md.CA7GaeI3.lean.js
index 470b26a35..c084d7154 100644
--- a/docs/document/assets/advanced_property.md.D59FnDH1.lean.js
+++ b/docs/document/assets/advanced_property.md.CA7GaeI3.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"实例属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/property.md","filePath":"advanced/property.md","lastUpdated":1726306667000}'),e={name:"advanced/property.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default};
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"实例属性","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/property.md","filePath":"advanced/property.md","lastUpdated":1764425558000}'),e={name:"advanced/property.md"};function h(t,a,k,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default};
diff --git a/docs/document/assets/app.BlRCrxkx.js b/docs/document/assets/app.BCRud2d5.js
similarity index 95%
rename from docs/document/assets/app.BlRCrxkx.js
rename to docs/document/assets/app.BCRud2d5.js
index bfbeb21d9..8da0958fa 100644
--- a/docs/document/assets/app.BlRCrxkx.js
+++ b/docs/document/assets/app.BCRud2d5.js
@@ -1 +1 @@
-import{t as p}from"./chunks/theme.eweRVmWa.js";import{R as s,a6 as i,a7 as u,a8 as c,a9 as l,aa as f,ab as d,ac as m,ad as h,ae as g,af as A,d as v,u as y,v as C,s as P,ag as b,ah as w,ai as R,aj as E}from"./chunks/framework.xxfEszSJ.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=D(),a=j();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return A(S)}function D(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
+import{t as p}from"./chunks/theme.Njr0hWwi.js";import{R as s,a6 as i,a7 as u,a8 as c,a9 as l,aa as f,ab as d,ac as m,ad as h,ae as g,af as A,d as v,u as y,v as C,s as P,ag as b,ah as w,ai as R,aj as E}from"./chunks/framework.xxfEszSJ.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=D(),a=j();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return A(S)}function D(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
diff --git a/docs/document/assets/chunks/theme.eweRVmWa.js b/docs/document/assets/chunks/theme.Njr0hWwi.js
similarity index 99%
rename from docs/document/assets/chunks/theme.eweRVmWa.js
rename to docs/document/assets/chunks/theme.Njr0hWwi.js
index f63ab3d27..aa4f23f46 100644
--- a/docs/document/assets/chunks/theme.eweRVmWa.js
+++ b/docs/document/assets/chunks/theme.Njr0hWwi.js
@@ -1 +1 @@
-import{d as k,c as h,r as p,n as A,o as i,a as ee,t as C,b as P,w as f,T as we,e as g,_ as V,u as Re,i as it,f as lt,g as he,h as S,j as d,k as c,l as te,m as Pe,p as T,q as J,s as fe,v as Q,x as Me,y as Ne,z as ct,A as ut,F as H,B as z,C as Z,D as We,E as ve,G as y,H as W,I as Ke,J as me,K as Y,L as _e,M as dt,N as Je,O as pt,P as Ie,Q as xe,R as ge,S as ht,U as ft,V as vt,W as Fe,X as mt,Y as Xe,Z as _t,$ as gt,a0 as Ye,a1 as Qe,a2 as kt,a3 as bt,a4 as $t,a5 as yt}from"./framework.xxfEszSJ.js";const Pt=k({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(i(),h("span",{class:A(["VPBadge",e.type])},[p(e.$slots,"default",{},()=>[ee(C(e.text),1)])],2))}}),Lt={key:0,class:"VPBackdrop"},Vt=k({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(i(),P(we,{name:"fade"},{default:f(()=>[e.show?(i(),h("div",Lt)):g("",!0)]),_:1}))}}),St=V(Vt,[["__scopeId","data-v-b2600058"]]),M=Re;function Tt(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function Le(n){return n.startsWith("/")?n:`/${n}`}function Ce(n){const{pathname:e,search:t,hash:s,protocol:o}=new URL(n,"http://a.com");if(it(n)||n.startsWith("#")||!o.startsWith("http")||!lt(e))return n;const{site:a}=M(),r=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${t}${s}`);return he(r)}function ae({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:s,theme:o,hash:a}=M(),r=S(()=>{var u,v;return{label:(u=e.value.locales[t.value])==null?void 0:u.label,link:((v=e.value.locales[t.value])==null?void 0:v.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:S(()=>Object.entries(e.value.locales).flatMap(([u,v])=>r.value.label===v.label?[]:{text:v.label,link:wt(v.link||(u==="root"?"/":`/${u}/`),o.value.i18nRouting!==!1&&n,s.value.relativePath.slice(r.value.link.length-1),!e.value.cleanUrls)+a.value})),currentLang:r}}function wt(n,e,t,s){return e?n.replace(/\/$/,"")+Le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const Mt={class:"NotFound"},Nt={class:"code"},It={class:"title"},Ct={class:"quote"},At={class:"action"},Ht=["href","aria-label"],Bt=k({__name:"NotFound",setup(n){const{theme:e}=M(),{currentLang:t}=ae();return(s,o)=>{var a,r,l,u,v;return i(),h("div",Mt,[d("p",Nt,C(((a=c(e).notFound)==null?void 0:a.code)??"404"),1),d("h1",It,C(((r=c(e).notFound)==null?void 0:r.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",Ct,C(((l=c(e).notFound)==null?void 0:l.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",At,[d("a",{class:"link",href:c(he)(c(t).link),"aria-label":((u=c(e).notFound)==null?void 0:u.linkLabel)??"go to home"},C(((v=c(e).notFound)==null?void 0:v.linkText)??"Take me home"),9,Ht)])])}}}),Et=V(Bt,[["__scopeId","data-v-93fd8736"]]);function Ze(n,e){if(Array.isArray(n))return le(n);if(n==null)return[];e=Le(e);const t=Object.keys(n).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>e.startsWith(Le(o))),s=t?n[t]:[];return Array.isArray(s)?le(s):le(s.items,s.base)}function Ot(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function Dt(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function Ve(n,e){return Array.isArray(e)?e.some(t=>Ve(n,t)):te(n,e.link)?!0:e.items?Ve(n,e.items):!1}function le(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=le(s.items,o)),s})}function x(){const{frontmatter:n,page:e,theme:t}=M(),s=Pe("(min-width: 960px)"),o=T(!1),a=S(()=>{const N=t.value.sidebar,w=e.value.relativePath;return N?Ze(N,w):[]}),r=T(a.value);J(a,(N,w)=>{JSON.stringify(N)!==JSON.stringify(w)&&(r.value=a.value)});const l=S(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),u=S(()=>v?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),v=S(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),_=S(()=>l.value&&s.value),m=S(()=>l.value?Ot(r.value):[]);function L(){o.value=!0}function b(){o.value=!1}function $(){o.value?b():L()}return{isOpen:o,sidebar:r,sidebarGroups:m,hasSidebar:l,hasAside:v,leftAside:u,isSidebarEnabled:_,open:L,close:b,toggle:$}}function Ft(n,e){let t;fe(()=>{t=n.value?document.activeElement:void 0}),Q(()=>{window.addEventListener("keyup",s)}),Me(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function zt(n){const{page:e,hash:t}=M(),s=T(!1),o=S(()=>n.value.collapsed!=null),a=S(()=>!!n.value.link),r=T(!1),l=()=>{r.value=te(e.value.relativePath,n.value.link)};J([e,n,t],l),Q(l);const u=S(()=>r.value?!0:n.value.items?Ve(e.value.relativePath,n.value.items):!1),v=S(()=>!!(n.value.items&&n.value.items.length));fe(()=>{s.value=!!(o.value&&n.value.collapsed)}),Ne(()=>{(r.value||u.value)&&(s.value=!1)});function _(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:_}}function jt(){const{hasSidebar:n}=x(),e=Pe("(min-width: 960px)"),t=Pe("(min-width: 1280px)");return{isAsideEnabled:S(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ut=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,Se=[];function et(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Ae(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:qt(t),link:"#"+t.id,level:s}});return Gt(e,n)}function qt(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(Ut.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Gt(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return Kt(n,s,o)}function Rt(n,e){const{isAsideEnabled:t}=jt(),s=Tt(a,100);let o=null;Q(()=>{requestAnimationFrame(a),window.addEventListener("scroll",s)}),ct(()=>{r(location.hash)}),Me(()=>{window.removeEventListener("scroll",s)});function a(){if(!t.value)return;const l=window.scrollY,u=window.innerHeight,v=document.body.offsetHeight,_=Math.abs(l+u-v)<1,m=Se.map(({element:b,link:$})=>({link:$,top:Wt(b)})).filter(({top:b})=>!Number.isNaN(b)).sort((b,$)=>b.top-$.top);if(!m.length){r(null);return}if(l<1){r(null);return}if(_){r(m[m.length-1].link);return}let L=null;for(const{link:b,top:$}of m){if($>l+ut()+4)break;L=b}r(L)}function r(l){o&&o.classList.remove("active"),l==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(l)}"]`);const u=o;u?(u.classList.add("active"),e.value.style.top=u.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Wt(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}function Kt(n,e,t){Se.length=0;const s=[],o=[];return n.forEach(a=>{const r={...a,children:[]};let l=o[o.length-1];for(;l&&l.level>=r.level;)o.pop(),l=o[o.length-1];if(r.element.classList.contains("ignore-header")||l&&"shouldIgnore"in l){o.push({level:r.level,shouldIgnore:!0});return}r.level>t||r.level{const o=Z("VPDocOutlineItem",!0);return i(),h("ul",{class:A(["VPDocOutlineItem",t.root?"root":"nested"])},[(i(!0),h(H,null,z(t.headers,({children:a,link:r,title:l})=>(i(),h("li",null,[d("a",{class:"outline-link",href:r,onClick:e,title:l},C(l),9,Jt),a!=null&&a.length?(i(),P(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}}),tt=V(xt,[["__scopeId","data-v-da421f78"]]),Xt={class:"content"},Yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Qt=k({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=M(),s=We([]);ve(()=>{s.value=Ae(e.value.outline??t.value.outline)});const o=T(),a=T();return Rt(o,a),(r,l)=>(i(),h("nav",{"aria-labelledby":"doc-outline-aria-label",class:A(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[d("div",Xt,[d("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),d("div",Yt,C(c(et)(c(t))),1),y(tt,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Zt=V(Qt,[["__scopeId","data-v-dfbd9fb8"]]),en={class:"VPDocAsideCarbonAds"},tn=k({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(i(),h("div",en,[y(c(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),nn={class:"VPDocAside"},sn=k({__name:"VPDocAside",setup(n){const{theme:e}=M();return(t,s)=>(i(),h("div",nn,[p(t.$slots,"aside-top",{},void 0,!0),p(t.$slots,"aside-outline-before",{},void 0,!0),y(Zt),p(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=d("div",{class:"spacer"},null,-1)),p(t.$slots,"aside-ads-before",{},void 0,!0),c(e).carbonAds?(i(),P(tn,{key:0,"carbon-ads":c(e).carbonAds},null,8,["carbon-ads"])):g("",!0),p(t.$slots,"aside-ads-after",{},void 0,!0),p(t.$slots,"aside-bottom",{},void 0,!0)]))}}),on=V(sn,[["__scopeId","data-v-79cae1a0"]]);function an(){const{theme:n,page:e}=M();return S(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function rn(){const{page:n,theme:e,frontmatter:t}=M();return S(()=>{var v,_,m,L,b,$,N,w;const s=Ze(e.value.sidebar,n.value.relativePath),o=Dt(s),a=ln(o,O=>O.link.replace(/[?#].*$/,"")),r=a.findIndex(O=>te(n.value.relativePath,O.link)),l=((v=e.value.docFooter)==null?void 0:v.prev)===!1&&!t.value.prev||t.value.prev===!1,u=((_=e.value.docFooter)==null?void 0:_.next)===!1&&!t.value.next||t.value.next===!1;return{prev:l?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((m=a[r-1])==null?void 0:m.docFooterText)??((L=a[r-1])==null?void 0:L.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((b=a[r-1])==null?void 0:b.link)},next:u?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??(($=a[r+1])==null?void 0:$.docFooterText)??((N=a[r+1])==null?void 0:N.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((w=a[r+1])==null?void 0:w.link)}}})}function ln(n,e){const t=new Set;return n.filter(s=>{const o=e(s);return t.has(o)?!1:t.add(o)})}const K=k({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.tag??(e.href?"a":"span")),s=S(()=>e.href&&Ke.test(e.href)||e.target==="_blank");return(o,a)=>(i(),P(W(t.value),{class:A(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?c(Ce)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[p(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),cn={class:"VPLastUpdated"},un=["datetime"],dn=k({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:s}=M(),o=S(()=>new Date(t.value.lastUpdated)),a=S(()=>o.value.toISOString()),r=T("");return Q(()=>{fe(()=>{var l,u,v;r.value=new Intl.DateTimeFormat((u=(l=e.value.lastUpdated)==null?void 0:l.formatOptions)!=null&&u.forceLocale?s.value:void 0,((v=e.value.lastUpdated)==null?void 0:v.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(l,u)=>{var v;return i(),h("p",cn,[ee(C(((v=c(e).lastUpdated)==null?void 0:v.text)||c(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:a.value},C(r.value),9,un)])}}}),pn=V(dn,[["__scopeId","data-v-e95db471"]]),hn={key:0,class:"VPDocFooter"},fn={key:0,class:"edit-info"},vn={key:0,class:"edit-link"},mn={key:1,class:"last-updated"},_n={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},gn={class:"pager"},kn=["innerHTML"],bn=["innerHTML"],$n={class:"pager"},yn=["innerHTML"],Pn=["innerHTML"],Ln=k({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=M(),o=an(),a=rn(),r=S(()=>e.value.editLink&&s.value.editLink!==!1),l=S(()=>t.value.lastUpdated),u=S(()=>r.value||l.value||a.value.prev||a.value.next);return(v,_)=>{var m,L,b,$;return u.value?(i(),h("footer",hn,[p(v.$slots,"doc-footer-before",{},void 0,!0),r.value||l.value?(i(),h("div",fn,[r.value?(i(),h("div",vn,[y(K,{class:"edit-link-button",href:c(o).url,"no-icon":!0},{default:f(()=>[_[0]||(_[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),ee(" "+C(c(o).text),1)]),_:1},8,["href"])])):g("",!0),l.value?(i(),h("div",mn,[y(pn)])):g("",!0)])):g("",!0),(m=c(a).prev)!=null&&m.link||(L=c(a).next)!=null&&L.link?(i(),h("nav",_n,[_[1]||(_[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",gn,[(b=c(a).prev)!=null&&b.link?(i(),P(K,{key:0,class:"pager-link prev",href:c(a).prev.link},{default:f(()=>{var N;return[d("span",{class:"desc",innerHTML:((N=c(e).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,kn),d("span",{class:"title",innerHTML:c(a).prev.text},null,8,bn)]}),_:1},8,["href"])):g("",!0)]),d("div",$n,[($=c(a).next)!=null&&$.link?(i(),P(K,{key:0,class:"pager-link next",href:c(a).next.link},{default:f(()=>{var N;return[d("span",{class:"desc",innerHTML:((N=c(e).docFooter)==null?void 0:N.next)||"Next page"},null,8,yn),d("span",{class:"title",innerHTML:c(a).next.text},null,8,Pn)]}),_:1},8,["href"])):g("",!0)])])):g("",!0)])):g("",!0)}}}),Vn=V(Ln,[["__scopeId","data-v-07d71ff1"]]),Sn={class:"container"},Tn={class:"aside-container"},wn={class:"aside-content"},Mn={class:"content"},Nn={class:"content-container"},In={class:"main"},Cn=k({__name:"VPDoc",setup(n){const{theme:e}=M(),t=me(),{hasSidebar:s,hasAside:o,leftAside:a}=x(),r=S(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(l,u)=>{const v=Z("Content");return i(),h("div",{class:A(["VPDoc",{"has-sidebar":c(s),"has-aside":c(o)}])},[p(l.$slots,"doc-top",{},void 0,!0),d("div",Sn,[c(o)?(i(),h("div",{key:0,class:A(["aside",{"left-aside":c(a)}])},[u[0]||(u[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Tn,[d("div",wn,[y(on,null,{"aside-top":f(()=>[p(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[p(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[p(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Mn,[d("div",Nn,[p(l.$slots,"doc-before",{},void 0,!0),d("main",In,[y(v,{class:A(["vp-doc",[r.value,c(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),y(Vn,null,{"doc-footer-before":f(()=>[p(l.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),p(l.$slots,"doc-after",{},void 0,!0)])])]),p(l.$slots,"doc-bottom",{},void 0,!0)],2)}}}),An=V(Cn,[["__scopeId","data-v-ef3a4dda"]]),Hn=k({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.href&&Ke.test(e.href)),s=S(()=>e.tag||(e.href?"a":"button"));return(o,a)=>(i(),P(W(s.value),{class:A(["VPButton",[o.size,o.theme]]),href:o.href?c(Ce)(o.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[ee(C(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),Bn=V(Hn,[["__scopeId","data-v-b20c43c2"]]),En=["src","alt"],On=k({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=Z("VPImage",!0);return e.image?(i(),h(H,{key:0},[typeof e.image=="string"||"src"in e.image?(i(),h("img",Y({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(he)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,En)):(i(),h(H,{key:1},[y(s,Y({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),y(s,Y({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}}),ue=V(On,[["__scopeId","data-v-4d414b82"]]),Dn={class:"container"},Fn={class:"main"},zn={class:"heading"},jn=["innerHTML"],Un=["innerHTML"],qn=["innerHTML"],Gn={key:0,class:"actions"},Rn={key:0,class:"image"},Wn={class:"image-container"},Kn=k({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=_e("hero-image-slot-exists");return(t,s)=>(i(),h("div",{class:A(["VPHero",{"has-image":t.image||c(e)}])},[d("div",Dn,[d("div",Fn,[p(t.$slots,"home-hero-info-before",{},void 0,!0),p(t.$slots,"home-hero-info",{},()=>[d("h1",zn,[t.name?(i(),h("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,jn)):g("",!0),t.text?(i(),h("span",{key:1,innerHTML:t.text,class:"text"},null,8,Un)):g("",!0)]),t.tagline?(i(),h("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,qn)):g("",!0)],!0),p(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(i(),h("div",Gn,[(i(!0),h(H,null,z(t.actions,o=>(i(),h("div",{key:o.link,class:"action"},[y(Bn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):g("",!0),p(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||c(e)?(i(),h("div",Rn,[d("div",Wn,[s[0]||(s[0]=d("div",{class:"image-bg"},null,-1)),p(t.$slots,"home-hero-image",{},()=>[t.image?(i(),P(ue,{key:0,class:"image-src",image:t.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}}),Jn=V(Kn,[["__scopeId","data-v-d266baba"]]),xn=k({__name:"VPHomeHero",setup(n){const{frontmatter:e}=M();return(t,s)=>c(e).hero?(i(),P(Jn,{key:0,class:"VPHomeHero",name:c(e).hero.name,text:c(e).hero.text,tagline:c(e).hero.tagline,image:c(e).hero.image,actions:c(e).hero.actions},{"home-hero-info-before":f(()=>[p(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[p(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[p(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[p(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[p(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),Xn={class:"box"},Yn={key:0,class:"icon"},Qn=["innerHTML"],Zn=["innerHTML"],es=["innerHTML"],ts={key:4,class:"link-text"},ns={class:"link-text-value"},ss=k({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(i(),P(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[d("article",Xn,[typeof e.icon=="object"&&e.icon.wrap?(i(),h("div",Yn,[y(ue,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(i(),P(ue,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(i(),h("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Qn)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Zn),e.details?(i(),h("p",{key:3,class:"details",innerHTML:e.details},null,8,es)):g("",!0),e.linkText?(i(),h("div",ts,[d("p",ns,[ee(C(e.linkText)+" ",1),t[0]||(t[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),os=V(ss,[["__scopeId","data-v-95001937"]]),as={key:0,class:"VPFeatures"},rs={class:"container"},is={class:"items"},ls=k({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=S(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(i(),h("div",as,[d("div",rs,[d("div",is,[(i(!0),h(H,null,z(s.features,a=>(i(),h("div",{key:a.title,class:A(["item",[t.value]])},[y(os,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}}),cs=V(ls,[["__scopeId","data-v-1da4ff3d"]]),us=k({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=M();return(t,s)=>c(e).features?(i(),P(cs,{key:0,class:"VPHomeFeatures",features:c(e).features},null,8,["features"])):g("",!0)}}),ds=k({__name:"VPHomeContent",setup(n){const{width:e}=dt({initialWidth:0,includeScrollbar:!1});return(t,s)=>(i(),h("div",{class:"vp-doc container",style:Je(c(e)?{"--vp-offset":`calc(50% - ${c(e)/2}px)`}:{})},[p(t.$slots,"default",{},void 0,!0)],4))}}),ps=V(ds,[["__scopeId","data-v-2498cc33"]]),hs=k({__name:"VPHome",setup(n){const{frontmatter:e,theme:t}=M();return(s,o)=>{const a=Z("Content");return i(),h("div",{class:A(["VPHome",{"external-link-icon-enabled":c(t).externalLinkIcon}])},[p(s.$slots,"home-hero-before",{},void 0,!0),y(xn,null,{"home-hero-info-before":f(()=>[p(s.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(s.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(s.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(s.$slots,"home-hero-image",{},void 0,!0)]),_:3}),p(s.$slots,"home-hero-after",{},void 0,!0),p(s.$slots,"home-features-before",{},void 0,!0),y(us),p(s.$slots,"home-features-after",{},void 0,!0),c(e).markdownStyles!==!1?(i(),P(ps,{key:0},{default:f(()=>[y(a)]),_:1})):(i(),P(a,{key:1}))],2)}}}),fs=V(hs,[["__scopeId","data-v-8b59c434"]]),vs={},ms={class:"VPPage"};function _s(n,e){const t=Z("Content");return i(),h("div",ms,[p(n.$slots,"page-top"),y(t),p(n.$slots,"page-bottom")])}const gs=V(vs,[["render",_s]]),ks=k({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=M(),{hasSidebar:s}=x();return(o,a)=>(i(),h("div",{class:A(["VPContent",{"has-sidebar":c(s),"is-home":c(t).layout==="home"}]),id:"VPContent"},[c(e).isNotFound?p(o.$slots,"not-found",{key:0},()=>[y(Et)],!0):c(t).layout==="page"?(i(),P(gs,{key:1},{"page-top":f(()=>[p(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[p(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):c(t).layout==="home"?(i(),P(fs,{key:2},{"home-hero-before":f(()=>[p(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[p(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[p(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[p(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[p(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):c(t).layout&&c(t).layout!=="doc"?(i(),P(W(c(t).layout),{key:3})):(i(),P(An,{key:4},{"doc-top":f(()=>[p(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[p(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[p(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[p(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[p(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[p(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[p(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[p(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),bs=V(ks,[["__scopeId","data-v-d2aef184"]]),$s={class:"container"},ys=["innerHTML"],Ps=["innerHTML"],Ls=k({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=M(),{hasSidebar:s}=x();return(o,a)=>c(e).footer&&c(t).footer!==!1?(i(),h("footer",{key:0,class:A(["VPFooter",{"has-sidebar":c(s)}])},[d("div",$s,[c(e).footer.message?(i(),h("p",{key:0,class:"message",innerHTML:c(e).footer.message},null,8,ys)):g("",!0),c(e).footer.copyright?(i(),h("p",{key:1,class:"copyright",innerHTML:c(e).footer.copyright},null,8,Ps)):g("",!0)])],2)):g("",!0)}}),Vs=V(Ls,[["__scopeId","data-v-e3157d6d"]]);function Ss(){const{theme:n,frontmatter:e}=M(),t=We([]),s=S(()=>t.value.length>0);return ve(()=>{t.value=Ae(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:s}}const Ts={class:"menu-text"},ws={class:"header"},Ms={class:"outline"},Ns=k({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=M(),s=T(!1),o=T(0),a=T(),r=T();function l(m){var L;(L=a.value)!=null&&L.contains(m.target)||(s.value=!1)}J(s,m=>{if(m){document.addEventListener("click",l);return}document.removeEventListener("click",l)}),pt("Escape",()=>{s.value=!1}),ve(()=>{s.value=!1});function u(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function v(m){m.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Ie(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(m,L)=>(i(),h("div",{class:"VPLocalNavOutlineDropdown",style:Je({"--vp-vh":o.value+"px"}),ref_key:"main",ref:a},[m.headers.length>0?(i(),h("button",{key:0,onClick:u,class:A({open:s.value})},[d("span",Ts,C(c(et)(c(t))),1),L[0]||(L[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(i(),h("button",{key:1,onClick:_},C(c(t).returnToTopLabel||"Return to top"),1)),y(we,{name:"flyout"},{default:f(()=>[s.value?(i(),h("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("div",ws,[d("a",{class:"top-link",href:"#",onClick:_},C(c(t).returnToTopLabel||"Return to top"),1)]),d("div",Ms,[y(tt,{headers:m.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}}),Is=V(Ns,[["__scopeId","data-v-d61422fe"]]),Cs={class:"container"},As=["aria-expanded"],Hs={class:"menu-text"},Bs=k({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=M(),{hasSidebar:s}=x(),{headers:o}=Ss(),{y:a}=xe(),r=T(0);Q(()=>{r.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ve(()=>{o.value=Ae(t.value.outline??e.value.outline)});const l=S(()=>o.value.length===0),u=S(()=>l.value&&!s.value),v=S(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:l.value,fixed:u.value}));return(_,m)=>c(t).layout!=="home"&&(!u.value||c(a)>=r.value)?(i(),h("div",{key:0,class:A(v.value)},[d("div",Cs,[c(s)?(i(),h("button",{key:0,class:"menu","aria-expanded":_.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=L=>_.$emit("open-menu"))},[m[1]||(m[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",Hs,C(c(e).sidebarMenuLabel||"Menu"),1)],8,As)):g("",!0),y(Is,{headers:c(o),navHeight:r.value},null,8,["headers","navHeight"])])],2)):g("",!0)}}),Es=V(Bs,[["__scopeId","data-v-9d8129cc"]]);function Os(){const n=T(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const a=me();return J(()=>a.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Ds={},Fs={class:"VPSwitch",type:"button",role:"switch"},zs={class:"check"},js={key:0,class:"icon"};function Us(n,e){return i(),h("button",Fs,[d("span",zs,[n.$slots.default?(i(),h("span",js,[p(n.$slots,"default",{},void 0,!0)])):g("",!0)])])}const qs=V(Ds,[["render",Us],["__scopeId","data-v-7012e5dd"]]),Gs=k({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=M(),s=_e("toggle-appearance",()=>{e.value=!e.value}),o=T("");return Ne(()=>{o.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(a,r)=>(i(),P(qs,{title:o.value,class:"VPSwitchAppearance","aria-checked":c(e),onClick:c(s)},{default:f(()=>r[0]||(r[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),He=V(Gs,[["__scopeId","data-v-fa1daf57"]]),Rs={key:0,class:"VPNavBarAppearance"},Ws=k({__name:"VPNavBarAppearance",setup(n){const{site:e}=M();return(t,s)=>c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",Rs,[y(He)])):g("",!0)}}),Ks=V(Ws,[["__scopeId","data-v-123fcb2f"]]),Be=T();let nt=!1,be=0;function Js(n){const e=T(!1);if(ge){!nt&&xs(),be++;const t=J(Be,s=>{var o,a,r;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(a=n.onFocus)==null||a.call(n)):(e.value=!1,(r=n.onBlur)==null||r.call(n))});Me(()=>{t(),be--,be||Xs()})}return ht(e)}function xs(){document.addEventListener("focusin",st),nt=!0,Be.value=document.activeElement}function Xs(){document.removeEventListener("focusin",st)}function st(){Be.value=document.activeElement}const Ys={class:"VPMenuLink"},Qs=["innerHTML"],Zs=k({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=M();return(t,s)=>(i(),h("div",Ys,[y(K,{class:A({active:c(te)(c(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Qs)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ke=V(Zs,[["__scopeId","data-v-65e4a6b1"]]),eo={class:"VPMenuGroup"},to={key:0,class:"title"},no=k({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(i(),h("div",eo,[e.text?(i(),h("p",to,C(e.text),1)):g("",!0),(i(!0),h(H,null,z(e.items,s=>(i(),h(H,null,["link"in s?(i(),P(ke,{key:0,item:s},null,8,["item"])):g("",!0)],64))),256))]))}}),so=V(no,[["__scopeId","data-v-2bec9359"]]),oo={class:"VPMenu"},ao={key:0,class:"items"},ro=k({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(i(),h("div",oo,[e.items?(i(),h("div",ao,[(i(!0),h(H,null,z(e.items,s=>(i(),h(H,{key:JSON.stringify(s)},["link"in s?(i(),P(ke,{key:0,item:s},null,8,["item"])):"component"in s?(i(),P(W(s.component),Y({key:1,ref_for:!0},s.props),null,16)):(i(),P(so,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0),p(e.$slots,"default",{},void 0,!0)]))}}),io=V(ro,[["__scopeId","data-v-39eca401"]]),lo=["aria-expanded","aria-label"],co={key:0,class:"text"},uo=["innerHTML"],po={key:1,class:"vpi-more-horizontal icon"},ho={class:"menu"},fo=k({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=T(!1),t=T();Js({el:t,onBlur:s});function s(){e.value=!1}return(o,a)=>(i(),h("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:a[1]||(a[1]=r=>e.value=!0),onMouseleave:a[2]||(a[2]=r=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:a[0]||(a[0]=r=>e.value=!e.value)},[o.button||o.icon?(i(),h("span",co,[o.icon?(i(),h("span",{key:0,class:A([o.icon,"option-icon"])},null,2)):g("",!0),o.button?(i(),h("span",{key:1,innerHTML:o.button},null,8,uo)):g("",!0),a[3]||(a[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(i(),h("span",po))],8,lo),d("div",ho,[y(io,{items:o.items},{default:f(()=>[p(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Ee=V(fo,[["__scopeId","data-v-40e55da0"]]),vo=["href","aria-label","innerHTML"],mo=k({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=T();Q(async()=>{var a;await Ie();const o=(a=t.value)==null?void 0:a.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const s=S(()=>typeof e.icon=="object"?e.icon.svg:``);return(o,a)=>(i(),h("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:s.value},null,8,vo))}}),_o=V(mo,[["__scopeId","data-v-fbf39218"]]),go={class:"VPSocialLinks"},ko=k({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(i(),h("div",go,[(i(!0),h(H,null,z(e.links,({link:s,icon:o,ariaLabel:a})=>(i(),P(_o,{key:s,icon:o,link:s,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),Oe=V(ko,[["__scopeId","data-v-f2234a39"]]),bo={key:0,class:"group translations"},$o={class:"trans-title"},yo={key:1,class:"group"},Po={class:"item appearance"},Lo={class:"label"},Vo={class:"appearance-action"},So={key:2,class:"group"},To={class:"item social-links"},wo=k({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=M(),{localeLinks:s,currentLang:o}=ae({correspondingLink:!0}),a=S(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(r,l)=>a.value?(i(),P(Ee,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[c(s).length&&c(o).label?(i(),h("div",bo,[d("p",$o,C(c(o).label),1),(i(!0),h(H,null,z(c(s),u=>(i(),P(ke,{key:u.link,item:u},null,8,["item"]))),128))])):g("",!0),c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",yo,[d("div",Po,[d("p",Lo,C(c(t).darkModeSwitchLabel||"Appearance"),1),d("div",Vo,[y(He)])])])):g("",!0),c(t).socialLinks?(i(),h("div",So,[d("div",To,[y(Oe,{class:"social-links-list",links:c(t).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}}),Mo=V(wo,[["__scopeId","data-v-0c845e5d"]]),No=["aria-expanded"],Io=k({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(i(),h("button",{type:"button",class:A(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)]),10,No))}}),Co=V(Io,[["__scopeId","data-v-670493dd"]]),Ao=["innerHTML"],Ho=k({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=M();return(t,s)=>(i(),P(K,{class:A({VPNavBarMenuLink:!0,active:c(te)(c(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),Bo=V(Ho,[["__scopeId","data-v-8dbce4d0"]]),Eo=k({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=M(),s=a=>"component"in a?!1:"link"in a?te(t.value.relativePath,a.link,!!e.item.activeMatch):a.items.some(s),o=S(()=>s(e.item));return(a,r)=>(i(),P(Ee,{class:A({VPNavBarMenuGroup:!0,active:c(te)(c(t).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),Oo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Do=k({__name:"VPNavBarMenu",setup(n){const{theme:e}=M();return(t,s)=>c(e).nav?(i(),h("nav",Oo,[s[0]||(s[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(i(!0),h(H,null,z(c(e).nav,o=>(i(),h(H,{key:JSON.stringify(o)},["link"in o?(i(),P(Bo,{key:0,item:o},null,8,["item"])):"component"in o?(i(),P(W(o.component),Y({key:1,ref_for:!0},o.props),null,16)):(i(),P(Eo,{key:2,item:o},null,8,["item"]))],64))),128))])):g("",!0)}}),Fo=V(Do,[["__scopeId","data-v-5bacfe89"]]),zo="/document/assets/flex-logo.BJA2J7hW.svg";function $e(n,e){return typeof n>"u"?e:n}function ze(n){const e=Array(n);for(let t=0;t=this.minlength&&(l||!r[_])){let L=ie(u,o,v),b="";switch(this.tokenize){case"full":if(3$;N--)if(N-$>=this.minlength){const w=ie(u,o,v,m,$);b=_.substring($,N),this.push_index(r,b,w,n,t)}break}case"reverse":if(2=this.minlength){const N=ie(u,o,v,m,$);this.push_index(r,b,N,n,t)}b=""}case"forward":if(1=this.minlength&&this.push_index(r,b,L,n,t);break}default:if(this.boost&&(L=Math.min(0|L/this.boost(e,_,v),u-1)),this.push_index(r,_,L,n,t),l&&1=this.minlength&&!$[_]){$[_]=1;const R=ie(N+(o/2>N?0:1),o,v,O-1,F-1),X=this.bidirectional&&_>w;this.push_index(a,X?w:_,R,n,t,X?_:w)}}}}}this.fastupdate||(this.register[n]=1)}}return this};function ie(n,e,t,s,o){return t&&1=this.minlength&&!m[b]){if(!this.optimize&&!a&&!this.map[b])return r;L[N++]=b,m[b]=1}n=L,s=n.length}if(!s)return r;e||(e=100);let u,v=this.depth&&1=t)))));b++);if(v)return o?qe(l,t,0):void(n[n.length]=l)}return!e&&l};function qe(n,e,t){return n=n.length===1?n[0]:Uo(n),t||n.length>e?n.slice(t,t+e):n}function Ge(n,e,t,s){if(t){const o=s&&e>t;n=n[o?e:t],n=n&&n[o?t:e]}else n=n[e];return n}q.prototype.contain=function(n){return!!this.register[n]},q.prototype.update=function(n,e){return this.remove(n).add(n,e)},q.prototype.remove=function(n,e){const t=this.register[n];if(t){if(this.fastupdate)for(let s,o=0;o{if(a.value){for(var B=m.value.search(a.value,{enrich:!0}),I=[],j=0;j!B||!B.length?[]:B.reduce((j,E)=>(j[I(E)]||(j[I(E)]=[]),j[I(E)].push(E),j),{}),R=()=>{setTimeout(()=>{l.value&&l.value.focus()},100),De(),o.value=!0};Q(async()=>{var E,D;const B=await vt(()=>import("./virtual_search-data.lPsPwGvM.js"),[]);u.value=B.default.INDEX_DATA,v.value=B.default.PREVIEW_LOOKUP,_.value=B.default.Options,r.value=window.location.origin+he(t.value==="root"?"/":t.value),L.value=((E=_.value)==null?void 0:E.buttonLabel)||L.value,b.value=((D=_.value)==null?void 0:D.placeholder)||b.value;var I=new q(_.value);I.import("reg",u.value.reg),I.import("cfg",u.value.cfg),I.import("map",u.value.map),I.import("ctx",u.value.ctx),m.value=I,s.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const j=U=>{var se;U.key==="k"&&(U.ctrlKey||U.metaKey)&&(U.preventDefault(),R()),U.key==="Escape"&&((se=a.value)==null?void 0:se.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",j)});const X=S(()=>F(O.value,B=>B.link.split("/").slice(0,-1).join("-"))),ne=S(()=>Object.values(X.value).flat().map(B=>B.id));function De(){o.value=!1,a.value=""}const at=B=>{var I,j;if(document.getElementsByClassName("search-group")[0]){if(B.key=="ArrowUp"||B.key=="ArrowDown"){const E=ne.value.indexOf($.value);if(B.key=="ArrowUp"){const D=E==0?ne.value.length-1:E-1;$.value=ne.value[D]}if(B.key=="ArrowDown"){const D=E>ne.value.length-2?0:E+1;$.value=ne.value[D]}if(E<5){const D=N.value.getElementsByClassName("VPPluginSearch-search-group")[0];D==null||D.scrollIntoView(!0)}else(I=document.getElementById(ne.value[$.value]))==null||I.scrollIntoView(!0);Ie()}B.key=="Enter"&&w.go(e.site.value.base+((j=N.value.getElementsByClassName("link-focused")[0].getAttribute("href"))==null?void 0:j.replace(r.value,"")))}};return(B,I)=>{const j=Z("ClientOnly");return i(),h("div",la,[y(j,null,{default:f(()=>[(i(),P(gt,{to:"body"},[Fe(d("div",{class:"VPPluginSearch-modal-back",onClick:I[2]||(I[2]=E=>o.value=!1),onKeydown:at},[d("div",{class:"VPPluginSearch-modal",onClick:I[1]||(I[1]=Xe(()=>{},["stop"])),ref_key:"modal",ref:N},[d("form",ca,[I[4]||(I[4]=d("label",{class:"DocSearch-MagnifierLabel",for:"docsearch-input",id:"docsearch-label"},[d("svg",{width:"20",height:"20",class:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})])],-1)),Fe(d("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":I[0]||(I[0]=E=>a.value=E),placeholder:b.value,maxlength:"64",type:"search",ref_key:"input",ref:l},null,8,ua),[[_t,a.value]])]),d("div",da,[(i(!0),h(H,null,z(X.value,(E,D)=>(i(),h("div",{class:"search-group",key:D},[d("span",pa,C(D?D.toString()[0].toUpperCase()+D.toString().slice(1):"Home"),1),(i(!0),h(H,null,z(E,(U,se)=>(i(),h("a",{href:r.value+U.link,key:U.id,onClick:De,onMouseenter:re=>$.value=U.id,class:A({"link-focused":$.value==U.id}),id:se.toString()},[d("div",fa,[d("span",va,C(U.link.includes("#")?"#":"▤"),1),d("div",ma,[d("h3",null,C(U.title),1),d("p",null,[d("div",{innerHTML:U.preview},null,8,_a)])]),I[5]||(I[5]=d("span",{class:"VPPluginSearch-search-item-icon"},"↪",-1))])],42,ha))),128))]))),128))]),I[6]||(I[6]=d("img",{class:"VPPluginSearch-flex-logo",src:zo,alt:"flex logo"},null,-1))],512)],544),[[mt,o.value]])]))]),_:1}),d("div",{id:"docsearch",onClick:I[3]||(I[3]=E=>R())},[d("button",ga,[d("span",ka,[I[7]||(I[7]=d("svg",{width:"20",height:"20",class:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1)),d("span",ba,C(L.value),1)]),d("span",$a,[d("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:s},"Meta",512),I[8]||(I[8]=d("span",{class:"DocSearch-Button-Key"},"K",-1))])])])])}}}),Pa=k({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=M();return(t,s)=>c(e).socialLinks?(i(),P(Oe,{key:0,class:"VPNavBarSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),La=V(Pa,[["__scopeId","data-v-08b35e6f"]]),Va=["href","rel","target"],Sa=["innerHTML"],Ta={key:2},wa=k({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=M(),{hasSidebar:s}=x(),{currentLang:o}=ae(),a=S(()=>{var u;return typeof t.value.logoLink=="string"?t.value.logoLink:(u=t.value.logoLink)==null?void 0:u.link}),r=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.rel}),l=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.target});return(u,v)=>(i(),h("div",{class:A(["VPNavBarTitle",{"has-sidebar":c(s)}])},[d("a",{class:"title",href:a.value??c(Ce)(c(o).link),rel:r.value,target:l.value},[p(u.$slots,"nav-bar-title-before",{},void 0,!0),c(t).logo?(i(),P(ue,{key:0,class:"logo",image:c(t).logo},null,8,["image"])):g("",!0),c(t).siteTitle?(i(),h("span",{key:1,innerHTML:c(t).siteTitle},null,8,Sa)):c(t).siteTitle===void 0?(i(),h("span",Ta,C(c(e).title),1)):g("",!0),p(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,Va)],2))}}),Ma=V(wa,[["__scopeId","data-v-5622a072"]]),Na={class:"items"},Ia={class:"title"},Ca=k({__name:"VPNavBarTranslations",setup(n){const{theme:e}=M(),{localeLinks:t,currentLang:s}=ae({correspondingLink:!0});return(o,a)=>c(t).length&&c(s).label?(i(),P(Ee,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:c(e).langMenuLabel||"Change language"},{default:f(()=>[d("div",Na,[d("p",Ia,C(c(s).label),1),(i(!0),h(H,null,z(c(t),r=>(i(),P(ke,{key:r.link,item:r},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}}),Aa=V(Ca,[["__scopeId","data-v-dac637f3"]]),Ha={class:"wrapper"},Ba={class:"container"},Ea={class:"title"},Oa={class:"content"},Da={class:"content-body"},Fa=k({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=xe(),{hasSidebar:s}=x(),{frontmatter:o}=M(),a=T({});return Ne(()=>{a.value={"has-sidebar":s.value,home:o.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(r,l)=>(i(),h("div",{class:A(["VPNavBar",a.value])},[d("div",Ha,[d("div",Ba,[d("div",Ea,[y(Ma,null,{"nav-bar-title-before":f(()=>[p(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Oa,[d("div",Da,[p(r.$slots,"nav-bar-content-before",{},void 0,!0),y(ya,{class:"search"}),y(Fo,{class:"menu"}),y(Aa,{class:"translations"}),y(Ks,{class:"appearance"}),y(La,{class:"social-links"}),y(Mo,{class:"extra"}),p(r.$slots,"nav-bar-content-after",{},void 0,!0),y(Co,{class:"hamburger",active:r.isScreenOpen,onClick:l[0]||(l[0]=u=>r.$emit("toggle-screen"))},null,8,["active"])])])])]),l[1]||(l[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),za=V(Fa,[["__scopeId","data-v-bb7529ee"]]),ja={key:0,class:"VPNavScreenAppearance"},Ua={class:"text"},qa=k({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=M();return(s,o)=>c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",ja,[d("p",Ua,C(c(t).darkModeSwitchLabel||"Appearance"),1),y(He)])):g("",!0)}}),Ga=V(qa,[["__scopeId","data-v-774971f8"]]),Ra=["innerHTML"],Wa=k({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=_e("close-screen");return(t,s)=>(i(),P(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:c(e)},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ra)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ka=V(Wa,[["__scopeId","data-v-29871565"]]),Ja=["innerHTML"],xa=k({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=_e("close-screen");return(t,s)=>(i(),P(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:c(e)},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ja)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),ot=V(xa,[["__scopeId","data-v-581896e9"]]),Xa={class:"VPNavScreenMenuGroupSection"},Ya={key:0,class:"title"},Qa=k({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(i(),h("div",Xa,[e.text?(i(),h("p",Ya,C(e.text),1)):g("",!0),(i(!0),h(H,null,z(e.items,s=>(i(),P(ot,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Za=V(Qa,[["__scopeId","data-v-836cddb8"]]),er=["aria-controls","aria-expanded"],tr=["innerHTML"],nr=["id"],sr={key:0,class:"item"},or={key:1,class:"item"},ar={key:2,class:"group"},rr=k({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=T(!1),s=S(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(a,r)=>(i(),h("div",{class:A(["VPNavScreenMenuGroup",{open:t.value}])},[d("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[d("span",{class:"button-text",innerHTML:a.text},null,8,tr),r[0]||(r[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,er),d("div",{id:s.value,class:"items"},[(i(!0),h(H,null,z(a.items,l=>(i(),h(H,{key:JSON.stringify(l)},["link"in l?(i(),h("div",sr,[y(ot,{item:l},null,8,["item"])])):"component"in l?(i(),h("div",or,[(i(),P(W(l.component),Y({ref_for:!0},l.props,{"screen-menu":""}),null,16))])):(i(),h("div",ar,[y(Za,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,nr)],2))}}),ir=V(rr,[["__scopeId","data-v-a8d3502a"]]),lr={key:0,class:"VPNavScreenMenu"},cr=k({__name:"VPNavScreenMenu",setup(n){const{theme:e}=M();return(t,s)=>c(e).nav?(i(),h("nav",lr,[(i(!0),h(H,null,z(c(e).nav,o=>(i(),h(H,{key:JSON.stringify(o)},["link"in o?(i(),P(Ka,{key:0,item:o},null,8,["item"])):"component"in o?(i(),P(W(o.component),Y({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(i(),P(ir,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),ur=k({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=M();return(t,s)=>c(e).socialLinks?(i(),P(Oe,{key:0,class:"VPNavScreenSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),dr={class:"list"},pr=k({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=ae({correspondingLink:!0}),s=T(!1);function o(){s.value=!s.value}return(a,r)=>c(e).length&&c(t).label?(i(),h("div",{key:0,class:A(["VPNavScreenTranslations",{open:s.value}])},[d("button",{class:"title",onClick:o},[r[0]||(r[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),ee(" "+C(c(t).label)+" ",1),r[1]||(r[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",dr,[(i(!0),h(H,null,z(c(e),l=>(i(),h("li",{key:l.link,class:"item"},[y(K,{class:"link",href:l.link},{default:f(()=>[ee(C(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}}),hr=V(pr,[["__scopeId","data-v-0d43316b"]]),fr={class:"container"},vr=k({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=T(null),t=Ye(ge?document.body:null);return(s,o)=>(i(),P(we,{name:"fade",onEnter:o[0]||(o[0]=a=>t.value=!0),onAfterLeave:o[1]||(o[1]=a=>t.value=!1)},{default:f(()=>[s.open?(i(),h("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[d("div",fr,[p(s.$slots,"nav-screen-content-before",{},void 0,!0),y(cr,{class:"menu"}),y(hr,{class:"translations"}),y(Ga,{class:"appearance"}),y(ur,{class:"social-links"}),p(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}}),mr=V(vr,[["__scopeId","data-v-34fa79a7"]]),_r={key:0,class:"VPNav"},gr=k({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=Os(),{frontmatter:o}=M(),a=S(()=>o.value.navbar!==!1);return Qe("close-screen",t),fe(()=>{ge&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(r,l)=>a.value?(i(),h("header",_r,[y(za,{"is-screen-open":c(e),onToggleScreen:c(s)},{"nav-bar-title-before":f(()=>[p(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(r.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[p(r.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[p(r.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),y(mr,{open:c(e)},{"nav-screen-content-before":f(()=>[p(r.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[p(r.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}}),kr=V(gr,[["__scopeId","data-v-a46e73f0"]]),br=["role","tabindex"],$r={key:1,class:"items"},yr=k({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:a,hasActiveLink:r,hasChildren:l,toggle:u}=zt(S(()=>e.item)),v=S(()=>l.value?"section":"div"),_=S(()=>o.value?"a":"div"),m=S(()=>l.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),L=S(()=>o.value?void 0:"button"),b=S(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":a.value},{"has-active":r.value}]);function $(w){"key"in w&&w.key!=="Enter"||!e.item.link&&u()}function N(){e.item.link&&u()}return(w,O)=>{const F=Z("VPSidebarItem",!0);return i(),P(W(v.value),{class:A(["VPSidebarItem",b.value])},{default:f(()=>[w.item.text?(i(),h("div",Y({key:0,class:"item",role:L.value},kt(w.item.items?{click:$,keydown:$}:{},!0),{tabindex:w.item.items&&0}),[O[1]||(O[1]=d("div",{class:"indicator"},null,-1)),w.item.link?(i(),P(K,{key:0,tag:_.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:f(()=>[(i(),P(W(m.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(i(),P(W(m.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null&&w.item.items&&w.item.items.length?(i(),h("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:bt(N,["enter"]),tabindex:"0"},O[0]||(O[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):g("",!0)],16,br)):g("",!0),w.item.items&&w.item.items.length?(i(),h("div",$r,[w.depth<5?(i(!0),h(H,{key:0},z(w.item.items,R=>(i(),P(F,{key:R.text,item:R,depth:w.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}}),Pr=V(yr,[["__scopeId","data-v-2e0476bc"]]),Lr=k({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=T(!0);let t=null;return Q(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),$t(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,o)=>(i(!0),h(H,null,z(s.items,a=>(i(),h("div",{key:a.text,class:A(["group",{"no-transition":e.value}])},[y(Pr,{item:a,depth:0},null,8,["item"])],2))),128))}}),Vr=V(Lr,[["__scopeId","data-v-ec086cd5"]]),Sr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Tr=k({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=x(),s=n,o=T(null),a=Ye(ge?document.body:null);J([s,o],()=>{var l;s.open?(a.value=!0,(l=o.value)==null||l.focus()):a.value=!1},{immediate:!0,flush:"post"});const r=T(0);return J(e,()=>{r.value+=1},{deep:!0}),(l,u)=>c(t)?(i(),h("aside",{key:0,class:A(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:o,onClick:u[0]||(u[0]=Xe(()=>{},["stop"]))},[u[2]||(u[2]=d("div",{class:"curtain"},null,-1)),d("nav",Sr,[u[1]||(u[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),p(l.$slots,"sidebar-nav-before",{},void 0,!0),(i(),P(Vr,{items:c(e),key:r.value},null,8,["items"])),p(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}}),wr=V(Tr,[["__scopeId","data-v-12a40e3d"]]),Mr=k({__name:"VPSkipLink",setup(n){const{theme:e}=M(),t=me(),s=T();J(()=>t.path,()=>s.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const l=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",l)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",l),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(i(),h(H,null,[d("span",{ref_key:"backToTop",ref:s,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},C(c(e).skipToContentLabel||"Skip to content"),1)],64))}}),Nr=V(Mr,[["__scopeId","data-v-17ad389b"]]),Ir=k({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=x(),o=me();J(()=>o.path,s),Ft(e,s);const{frontmatter:a}=M(),r=yt(),l=S(()=>!!r["home-hero-image"]);return Qe("hero-image-slot-exists",l),(u,v)=>{const _=Z("Content");return c(a).layout!==!1?(i(),h("div",{key:0,class:A(["Layout",c(a).pageClass])},[p(u.$slots,"layout-top",{},void 0,!0),y(Nr),y(St,{class:"backdrop",show:c(e),onClick:c(s)},null,8,["show","onClick"]),y(kr,null,{"nav-bar-title-before":f(()=>[p(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[p(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[p(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[p(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[p(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),y(Es,{open:c(e),onOpenMenu:c(t)},null,8,["open","onOpenMenu"]),y(wr,{open:c(e)},{"sidebar-nav-before":f(()=>[p(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[p(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),y(bs,null,{"page-top":f(()=>[p(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[p(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[p(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[p(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[p(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[p(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[p(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[p(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[p(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[p(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[p(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[p(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[p(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[p(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[p(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[p(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),y(Vs),p(u.$slots,"layout-bottom",{},void 0,!0)],2)):(i(),P(_,{key:1}))}}}),Cr=V(Ir,[["__scopeId","data-v-c4daae71"]]),Hr={Layout:Cr,enhanceApp:({app:n})=>{n.component("Badge",Pt)}};export{Hr as t};
+import{d as k,c as h,r as p,n as A,o as i,a as ee,t as C,b as P,w as f,T as we,e as g,_ as V,u as Re,i as it,f as lt,g as he,h as S,j as d,k as c,l as te,m as Pe,p as T,q as J,s as fe,v as Q,x as Me,y as Ne,z as ct,A as ut,F as H,B as z,C as Z,D as We,E as ve,G as y,H as W,I as Ke,J as me,K as Y,L as _e,M as dt,N as Je,O as pt,P as Ie,Q as xe,R as ge,S as ht,U as ft,V as vt,W as Fe,X as mt,Y as Xe,Z as _t,$ as gt,a0 as Ye,a1 as Qe,a2 as kt,a3 as bt,a4 as $t,a5 as yt}from"./framework.xxfEszSJ.js";const Pt=k({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(i(),h("span",{class:A(["VPBadge",e.type])},[p(e.$slots,"default",{},()=>[ee(C(e.text),1)])],2))}}),Lt={key:0,class:"VPBackdrop"},Vt=k({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(i(),P(we,{name:"fade"},{default:f(()=>[e.show?(i(),h("div",Lt)):g("",!0)]),_:1}))}}),St=V(Vt,[["__scopeId","data-v-b2600058"]]),M=Re;function Tt(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function Le(n){return n.startsWith("/")?n:`/${n}`}function Ce(n){const{pathname:e,search:t,hash:s,protocol:o}=new URL(n,"http://a.com");if(it(n)||n.startsWith("#")||!o.startsWith("http")||!lt(e))return n;const{site:a}=M(),r=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${t}${s}`);return he(r)}function ae({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:s,theme:o,hash:a}=M(),r=S(()=>{var u,v;return{label:(u=e.value.locales[t.value])==null?void 0:u.label,link:((v=e.value.locales[t.value])==null?void 0:v.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:S(()=>Object.entries(e.value.locales).flatMap(([u,v])=>r.value.label===v.label?[]:{text:v.label,link:wt(v.link||(u==="root"?"/":`/${u}/`),o.value.i18nRouting!==!1&&n,s.value.relativePath.slice(r.value.link.length-1),!e.value.cleanUrls)+a.value})),currentLang:r}}function wt(n,e,t,s){return e?n.replace(/\/$/,"")+Le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const Mt={class:"NotFound"},Nt={class:"code"},It={class:"title"},Ct={class:"quote"},At={class:"action"},Ht=["href","aria-label"],Bt=k({__name:"NotFound",setup(n){const{theme:e}=M(),{currentLang:t}=ae();return(s,o)=>{var a,r,l,u,v;return i(),h("div",Mt,[d("p",Nt,C(((a=c(e).notFound)==null?void 0:a.code)??"404"),1),d("h1",It,C(((r=c(e).notFound)==null?void 0:r.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",Ct,C(((l=c(e).notFound)==null?void 0:l.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",At,[d("a",{class:"link",href:c(he)(c(t).link),"aria-label":((u=c(e).notFound)==null?void 0:u.linkLabel)??"go to home"},C(((v=c(e).notFound)==null?void 0:v.linkText)??"Take me home"),9,Ht)])])}}}),Et=V(Bt,[["__scopeId","data-v-93fd8736"]]);function Ze(n,e){if(Array.isArray(n))return le(n);if(n==null)return[];e=Le(e);const t=Object.keys(n).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>e.startsWith(Le(o))),s=t?n[t]:[];return Array.isArray(s)?le(s):le(s.items,s.base)}function Ot(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function Dt(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function Ve(n,e){return Array.isArray(e)?e.some(t=>Ve(n,t)):te(n,e.link)?!0:e.items?Ve(n,e.items):!1}function le(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=le(s.items,o)),s})}function x(){const{frontmatter:n,page:e,theme:t}=M(),s=Pe("(min-width: 960px)"),o=T(!1),a=S(()=>{const N=t.value.sidebar,w=e.value.relativePath;return N?Ze(N,w):[]}),r=T(a.value);J(a,(N,w)=>{JSON.stringify(N)!==JSON.stringify(w)&&(r.value=a.value)});const l=S(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),u=S(()=>v?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),v=S(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),_=S(()=>l.value&&s.value),m=S(()=>l.value?Ot(r.value):[]);function L(){o.value=!0}function b(){o.value=!1}function $(){o.value?b():L()}return{isOpen:o,sidebar:r,sidebarGroups:m,hasSidebar:l,hasAside:v,leftAside:u,isSidebarEnabled:_,open:L,close:b,toggle:$}}function Ft(n,e){let t;fe(()=>{t=n.value?document.activeElement:void 0}),Q(()=>{window.addEventListener("keyup",s)}),Me(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function zt(n){const{page:e,hash:t}=M(),s=T(!1),o=S(()=>n.value.collapsed!=null),a=S(()=>!!n.value.link),r=T(!1),l=()=>{r.value=te(e.value.relativePath,n.value.link)};J([e,n,t],l),Q(l);const u=S(()=>r.value?!0:n.value.items?Ve(e.value.relativePath,n.value.items):!1),v=S(()=>!!(n.value.items&&n.value.items.length));fe(()=>{s.value=!!(o.value&&n.value.collapsed)}),Ne(()=>{(r.value||u.value)&&(s.value=!1)});function _(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:_}}function jt(){const{hasSidebar:n}=x(),e=Pe("(min-width: 960px)"),t=Pe("(min-width: 1280px)");return{isAsideEnabled:S(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ut=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,Se=[];function et(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Ae(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:qt(t),link:"#"+t.id,level:s}});return Gt(e,n)}function qt(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(Ut.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Gt(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return Kt(n,s,o)}function Rt(n,e){const{isAsideEnabled:t}=jt(),s=Tt(a,100);let o=null;Q(()=>{requestAnimationFrame(a),window.addEventListener("scroll",s)}),ct(()=>{r(location.hash)}),Me(()=>{window.removeEventListener("scroll",s)});function a(){if(!t.value)return;const l=window.scrollY,u=window.innerHeight,v=document.body.offsetHeight,_=Math.abs(l+u-v)<1,m=Se.map(({element:b,link:$})=>({link:$,top:Wt(b)})).filter(({top:b})=>!Number.isNaN(b)).sort((b,$)=>b.top-$.top);if(!m.length){r(null);return}if(l<1){r(null);return}if(_){r(m[m.length-1].link);return}let L=null;for(const{link:b,top:$}of m){if($>l+ut()+4)break;L=b}r(L)}function r(l){o&&o.classList.remove("active"),l==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(l)}"]`);const u=o;u?(u.classList.add("active"),e.value.style.top=u.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Wt(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}function Kt(n,e,t){Se.length=0;const s=[],o=[];return n.forEach(a=>{const r={...a,children:[]};let l=o[o.length-1];for(;l&&l.level>=r.level;)o.pop(),l=o[o.length-1];if(r.element.classList.contains("ignore-header")||l&&"shouldIgnore"in l){o.push({level:r.level,shouldIgnore:!0});return}r.level>t||r.level{const o=Z("VPDocOutlineItem",!0);return i(),h("ul",{class:A(["VPDocOutlineItem",t.root?"root":"nested"])},[(i(!0),h(H,null,z(t.headers,({children:a,link:r,title:l})=>(i(),h("li",null,[d("a",{class:"outline-link",href:r,onClick:e,title:l},C(l),9,Jt),a!=null&&a.length?(i(),P(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}}),tt=V(xt,[["__scopeId","data-v-da421f78"]]),Xt={class:"content"},Yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Qt=k({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=M(),s=We([]);ve(()=>{s.value=Ae(e.value.outline??t.value.outline)});const o=T(),a=T();return Rt(o,a),(r,l)=>(i(),h("nav",{"aria-labelledby":"doc-outline-aria-label",class:A(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[d("div",Xt,[d("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),d("div",Yt,C(c(et)(c(t))),1),y(tt,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Zt=V(Qt,[["__scopeId","data-v-dfbd9fb8"]]),en={class:"VPDocAsideCarbonAds"},tn=k({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(i(),h("div",en,[y(c(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),nn={class:"VPDocAside"},sn=k({__name:"VPDocAside",setup(n){const{theme:e}=M();return(t,s)=>(i(),h("div",nn,[p(t.$slots,"aside-top",{},void 0,!0),p(t.$slots,"aside-outline-before",{},void 0,!0),y(Zt),p(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=d("div",{class:"spacer"},null,-1)),p(t.$slots,"aside-ads-before",{},void 0,!0),c(e).carbonAds?(i(),P(tn,{key:0,"carbon-ads":c(e).carbonAds},null,8,["carbon-ads"])):g("",!0),p(t.$slots,"aside-ads-after",{},void 0,!0),p(t.$slots,"aside-bottom",{},void 0,!0)]))}}),on=V(sn,[["__scopeId","data-v-79cae1a0"]]);function an(){const{theme:n,page:e}=M();return S(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function rn(){const{page:n,theme:e,frontmatter:t}=M();return S(()=>{var v,_,m,L,b,$,N,w;const s=Ze(e.value.sidebar,n.value.relativePath),o=Dt(s),a=ln(o,O=>O.link.replace(/[?#].*$/,"")),r=a.findIndex(O=>te(n.value.relativePath,O.link)),l=((v=e.value.docFooter)==null?void 0:v.prev)===!1&&!t.value.prev||t.value.prev===!1,u=((_=e.value.docFooter)==null?void 0:_.next)===!1&&!t.value.next||t.value.next===!1;return{prev:l?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((m=a[r-1])==null?void 0:m.docFooterText)??((L=a[r-1])==null?void 0:L.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((b=a[r-1])==null?void 0:b.link)},next:u?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??(($=a[r+1])==null?void 0:$.docFooterText)??((N=a[r+1])==null?void 0:N.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((w=a[r+1])==null?void 0:w.link)}}})}function ln(n,e){const t=new Set;return n.filter(s=>{const o=e(s);return t.has(o)?!1:t.add(o)})}const K=k({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.tag??(e.href?"a":"span")),s=S(()=>e.href&&Ke.test(e.href)||e.target==="_blank");return(o,a)=>(i(),P(W(t.value),{class:A(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?c(Ce)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[p(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),cn={class:"VPLastUpdated"},un=["datetime"],dn=k({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:s}=M(),o=S(()=>new Date(t.value.lastUpdated)),a=S(()=>o.value.toISOString()),r=T("");return Q(()=>{fe(()=>{var l,u,v;r.value=new Intl.DateTimeFormat((u=(l=e.value.lastUpdated)==null?void 0:l.formatOptions)!=null&&u.forceLocale?s.value:void 0,((v=e.value.lastUpdated)==null?void 0:v.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(l,u)=>{var v;return i(),h("p",cn,[ee(C(((v=c(e).lastUpdated)==null?void 0:v.text)||c(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:a.value},C(r.value),9,un)])}}}),pn=V(dn,[["__scopeId","data-v-e95db471"]]),hn={key:0,class:"VPDocFooter"},fn={key:0,class:"edit-info"},vn={key:0,class:"edit-link"},mn={key:1,class:"last-updated"},_n={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},gn={class:"pager"},kn=["innerHTML"],bn=["innerHTML"],$n={class:"pager"},yn=["innerHTML"],Pn=["innerHTML"],Ln=k({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=M(),o=an(),a=rn(),r=S(()=>e.value.editLink&&s.value.editLink!==!1),l=S(()=>t.value.lastUpdated),u=S(()=>r.value||l.value||a.value.prev||a.value.next);return(v,_)=>{var m,L,b,$;return u.value?(i(),h("footer",hn,[p(v.$slots,"doc-footer-before",{},void 0,!0),r.value||l.value?(i(),h("div",fn,[r.value?(i(),h("div",vn,[y(K,{class:"edit-link-button",href:c(o).url,"no-icon":!0},{default:f(()=>[_[0]||(_[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),ee(" "+C(c(o).text),1)]),_:1},8,["href"])])):g("",!0),l.value?(i(),h("div",mn,[y(pn)])):g("",!0)])):g("",!0),(m=c(a).prev)!=null&&m.link||(L=c(a).next)!=null&&L.link?(i(),h("nav",_n,[_[1]||(_[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",gn,[(b=c(a).prev)!=null&&b.link?(i(),P(K,{key:0,class:"pager-link prev",href:c(a).prev.link},{default:f(()=>{var N;return[d("span",{class:"desc",innerHTML:((N=c(e).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,kn),d("span",{class:"title",innerHTML:c(a).prev.text},null,8,bn)]}),_:1},8,["href"])):g("",!0)]),d("div",$n,[($=c(a).next)!=null&&$.link?(i(),P(K,{key:0,class:"pager-link next",href:c(a).next.link},{default:f(()=>{var N;return[d("span",{class:"desc",innerHTML:((N=c(e).docFooter)==null?void 0:N.next)||"Next page"},null,8,yn),d("span",{class:"title",innerHTML:c(a).next.text},null,8,Pn)]}),_:1},8,["href"])):g("",!0)])])):g("",!0)])):g("",!0)}}}),Vn=V(Ln,[["__scopeId","data-v-07d71ff1"]]),Sn={class:"container"},Tn={class:"aside-container"},wn={class:"aside-content"},Mn={class:"content"},Nn={class:"content-container"},In={class:"main"},Cn=k({__name:"VPDoc",setup(n){const{theme:e}=M(),t=me(),{hasSidebar:s,hasAside:o,leftAside:a}=x(),r=S(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(l,u)=>{const v=Z("Content");return i(),h("div",{class:A(["VPDoc",{"has-sidebar":c(s),"has-aside":c(o)}])},[p(l.$slots,"doc-top",{},void 0,!0),d("div",Sn,[c(o)?(i(),h("div",{key:0,class:A(["aside",{"left-aside":c(a)}])},[u[0]||(u[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Tn,[d("div",wn,[y(on,null,{"aside-top":f(()=>[p(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[p(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[p(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Mn,[d("div",Nn,[p(l.$slots,"doc-before",{},void 0,!0),d("main",In,[y(v,{class:A(["vp-doc",[r.value,c(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),y(Vn,null,{"doc-footer-before":f(()=>[p(l.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),p(l.$slots,"doc-after",{},void 0,!0)])])]),p(l.$slots,"doc-bottom",{},void 0,!0)],2)}}}),An=V(Cn,[["__scopeId","data-v-ef3a4dda"]]),Hn=k({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.href&&Ke.test(e.href)),s=S(()=>e.tag||(e.href?"a":"button"));return(o,a)=>(i(),P(W(s.value),{class:A(["VPButton",[o.size,o.theme]]),href:o.href?c(Ce)(o.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[ee(C(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),Bn=V(Hn,[["__scopeId","data-v-b20c43c2"]]),En=["src","alt"],On=k({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=Z("VPImage",!0);return e.image?(i(),h(H,{key:0},[typeof e.image=="string"||"src"in e.image?(i(),h("img",Y({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(he)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,En)):(i(),h(H,{key:1},[y(s,Y({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),y(s,Y({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}}),ue=V(On,[["__scopeId","data-v-4d414b82"]]),Dn={class:"container"},Fn={class:"main"},zn={class:"heading"},jn=["innerHTML"],Un=["innerHTML"],qn=["innerHTML"],Gn={key:0,class:"actions"},Rn={key:0,class:"image"},Wn={class:"image-container"},Kn=k({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=_e("hero-image-slot-exists");return(t,s)=>(i(),h("div",{class:A(["VPHero",{"has-image":t.image||c(e)}])},[d("div",Dn,[d("div",Fn,[p(t.$slots,"home-hero-info-before",{},void 0,!0),p(t.$slots,"home-hero-info",{},()=>[d("h1",zn,[t.name?(i(),h("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,jn)):g("",!0),t.text?(i(),h("span",{key:1,innerHTML:t.text,class:"text"},null,8,Un)):g("",!0)]),t.tagline?(i(),h("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,qn)):g("",!0)],!0),p(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(i(),h("div",Gn,[(i(!0),h(H,null,z(t.actions,o=>(i(),h("div",{key:o.link,class:"action"},[y(Bn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):g("",!0),p(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||c(e)?(i(),h("div",Rn,[d("div",Wn,[s[0]||(s[0]=d("div",{class:"image-bg"},null,-1)),p(t.$slots,"home-hero-image",{},()=>[t.image?(i(),P(ue,{key:0,class:"image-src",image:t.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}}),Jn=V(Kn,[["__scopeId","data-v-d266baba"]]),xn=k({__name:"VPHomeHero",setup(n){const{frontmatter:e}=M();return(t,s)=>c(e).hero?(i(),P(Jn,{key:0,class:"VPHomeHero",name:c(e).hero.name,text:c(e).hero.text,tagline:c(e).hero.tagline,image:c(e).hero.image,actions:c(e).hero.actions},{"home-hero-info-before":f(()=>[p(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[p(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[p(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[p(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[p(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),Xn={class:"box"},Yn={key:0,class:"icon"},Qn=["innerHTML"],Zn=["innerHTML"],es=["innerHTML"],ts={key:4,class:"link-text"},ns={class:"link-text-value"},ss=k({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(i(),P(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[d("article",Xn,[typeof e.icon=="object"&&e.icon.wrap?(i(),h("div",Yn,[y(ue,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(i(),P(ue,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(i(),h("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Qn)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Zn),e.details?(i(),h("p",{key:3,class:"details",innerHTML:e.details},null,8,es)):g("",!0),e.linkText?(i(),h("div",ts,[d("p",ns,[ee(C(e.linkText)+" ",1),t[0]||(t[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),os=V(ss,[["__scopeId","data-v-95001937"]]),as={key:0,class:"VPFeatures"},rs={class:"container"},is={class:"items"},ls=k({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=S(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(i(),h("div",as,[d("div",rs,[d("div",is,[(i(!0),h(H,null,z(s.features,a=>(i(),h("div",{key:a.title,class:A(["item",[t.value]])},[y(os,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}}),cs=V(ls,[["__scopeId","data-v-1da4ff3d"]]),us=k({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=M();return(t,s)=>c(e).features?(i(),P(cs,{key:0,class:"VPHomeFeatures",features:c(e).features},null,8,["features"])):g("",!0)}}),ds=k({__name:"VPHomeContent",setup(n){const{width:e}=dt({initialWidth:0,includeScrollbar:!1});return(t,s)=>(i(),h("div",{class:"vp-doc container",style:Je(c(e)?{"--vp-offset":`calc(50% - ${c(e)/2}px)`}:{})},[p(t.$slots,"default",{},void 0,!0)],4))}}),ps=V(ds,[["__scopeId","data-v-2498cc33"]]),hs=k({__name:"VPHome",setup(n){const{frontmatter:e,theme:t}=M();return(s,o)=>{const a=Z("Content");return i(),h("div",{class:A(["VPHome",{"external-link-icon-enabled":c(t).externalLinkIcon}])},[p(s.$slots,"home-hero-before",{},void 0,!0),y(xn,null,{"home-hero-info-before":f(()=>[p(s.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(s.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(s.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(s.$slots,"home-hero-image",{},void 0,!0)]),_:3}),p(s.$slots,"home-hero-after",{},void 0,!0),p(s.$slots,"home-features-before",{},void 0,!0),y(us),p(s.$slots,"home-features-after",{},void 0,!0),c(e).markdownStyles!==!1?(i(),P(ps,{key:0},{default:f(()=>[y(a)]),_:1})):(i(),P(a,{key:1}))],2)}}}),fs=V(hs,[["__scopeId","data-v-8b59c434"]]),vs={},ms={class:"VPPage"};function _s(n,e){const t=Z("Content");return i(),h("div",ms,[p(n.$slots,"page-top"),y(t),p(n.$slots,"page-bottom")])}const gs=V(vs,[["render",_s]]),ks=k({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=M(),{hasSidebar:s}=x();return(o,a)=>(i(),h("div",{class:A(["VPContent",{"has-sidebar":c(s),"is-home":c(t).layout==="home"}]),id:"VPContent"},[c(e).isNotFound?p(o.$slots,"not-found",{key:0},()=>[y(Et)],!0):c(t).layout==="page"?(i(),P(gs,{key:1},{"page-top":f(()=>[p(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[p(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):c(t).layout==="home"?(i(),P(fs,{key:2},{"home-hero-before":f(()=>[p(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[p(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[p(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[p(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[p(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):c(t).layout&&c(t).layout!=="doc"?(i(),P(W(c(t).layout),{key:3})):(i(),P(An,{key:4},{"doc-top":f(()=>[p(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[p(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[p(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[p(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[p(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[p(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[p(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[p(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),bs=V(ks,[["__scopeId","data-v-d2aef184"]]),$s={class:"container"},ys=["innerHTML"],Ps=["innerHTML"],Ls=k({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=M(),{hasSidebar:s}=x();return(o,a)=>c(e).footer&&c(t).footer!==!1?(i(),h("footer",{key:0,class:A(["VPFooter",{"has-sidebar":c(s)}])},[d("div",$s,[c(e).footer.message?(i(),h("p",{key:0,class:"message",innerHTML:c(e).footer.message},null,8,ys)):g("",!0),c(e).footer.copyright?(i(),h("p",{key:1,class:"copyright",innerHTML:c(e).footer.copyright},null,8,Ps)):g("",!0)])],2)):g("",!0)}}),Vs=V(Ls,[["__scopeId","data-v-e3157d6d"]]);function Ss(){const{theme:n,frontmatter:e}=M(),t=We([]),s=S(()=>t.value.length>0);return ve(()=>{t.value=Ae(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:s}}const Ts={class:"menu-text"},ws={class:"header"},Ms={class:"outline"},Ns=k({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=M(),s=T(!1),o=T(0),a=T(),r=T();function l(m){var L;(L=a.value)!=null&&L.contains(m.target)||(s.value=!1)}J(s,m=>{if(m){document.addEventListener("click",l);return}document.removeEventListener("click",l)}),pt("Escape",()=>{s.value=!1}),ve(()=>{s.value=!1});function u(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function v(m){m.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Ie(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(m,L)=>(i(),h("div",{class:"VPLocalNavOutlineDropdown",style:Je({"--vp-vh":o.value+"px"}),ref_key:"main",ref:a},[m.headers.length>0?(i(),h("button",{key:0,onClick:u,class:A({open:s.value})},[d("span",Ts,C(c(et)(c(t))),1),L[0]||(L[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(i(),h("button",{key:1,onClick:_},C(c(t).returnToTopLabel||"Return to top"),1)),y(we,{name:"flyout"},{default:f(()=>[s.value?(i(),h("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("div",ws,[d("a",{class:"top-link",href:"#",onClick:_},C(c(t).returnToTopLabel||"Return to top"),1)]),d("div",Ms,[y(tt,{headers:m.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}}),Is=V(Ns,[["__scopeId","data-v-d61422fe"]]),Cs={class:"container"},As=["aria-expanded"],Hs={class:"menu-text"},Bs=k({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=M(),{hasSidebar:s}=x(),{headers:o}=Ss(),{y:a}=xe(),r=T(0);Q(()=>{r.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ve(()=>{o.value=Ae(t.value.outline??e.value.outline)});const l=S(()=>o.value.length===0),u=S(()=>l.value&&!s.value),v=S(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:l.value,fixed:u.value}));return(_,m)=>c(t).layout!=="home"&&(!u.value||c(a)>=r.value)?(i(),h("div",{key:0,class:A(v.value)},[d("div",Cs,[c(s)?(i(),h("button",{key:0,class:"menu","aria-expanded":_.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=L=>_.$emit("open-menu"))},[m[1]||(m[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",Hs,C(c(e).sidebarMenuLabel||"Menu"),1)],8,As)):g("",!0),y(Is,{headers:c(o),navHeight:r.value},null,8,["headers","navHeight"])])],2)):g("",!0)}}),Es=V(Bs,[["__scopeId","data-v-9d8129cc"]]);function Os(){const n=T(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const a=me();return J(()=>a.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Ds={},Fs={class:"VPSwitch",type:"button",role:"switch"},zs={class:"check"},js={key:0,class:"icon"};function Us(n,e){return i(),h("button",Fs,[d("span",zs,[n.$slots.default?(i(),h("span",js,[p(n.$slots,"default",{},void 0,!0)])):g("",!0)])])}const qs=V(Ds,[["render",Us],["__scopeId","data-v-7012e5dd"]]),Gs=k({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=M(),s=_e("toggle-appearance",()=>{e.value=!e.value}),o=T("");return Ne(()=>{o.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(a,r)=>(i(),P(qs,{title:o.value,class:"VPSwitchAppearance","aria-checked":c(e),onClick:c(s)},{default:f(()=>r[0]||(r[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),He=V(Gs,[["__scopeId","data-v-fa1daf57"]]),Rs={key:0,class:"VPNavBarAppearance"},Ws=k({__name:"VPNavBarAppearance",setup(n){const{site:e}=M();return(t,s)=>c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",Rs,[y(He)])):g("",!0)}}),Ks=V(Ws,[["__scopeId","data-v-123fcb2f"]]),Be=T();let nt=!1,be=0;function Js(n){const e=T(!1);if(ge){!nt&&xs(),be++;const t=J(Be,s=>{var o,a,r;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(a=n.onFocus)==null||a.call(n)):(e.value=!1,(r=n.onBlur)==null||r.call(n))});Me(()=>{t(),be--,be||Xs()})}return ht(e)}function xs(){document.addEventListener("focusin",st),nt=!0,Be.value=document.activeElement}function Xs(){document.removeEventListener("focusin",st)}function st(){Be.value=document.activeElement}const Ys={class:"VPMenuLink"},Qs=["innerHTML"],Zs=k({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=M();return(t,s)=>(i(),h("div",Ys,[y(K,{class:A({active:c(te)(c(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Qs)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ke=V(Zs,[["__scopeId","data-v-65e4a6b1"]]),eo={class:"VPMenuGroup"},to={key:0,class:"title"},no=k({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(i(),h("div",eo,[e.text?(i(),h("p",to,C(e.text),1)):g("",!0),(i(!0),h(H,null,z(e.items,s=>(i(),h(H,null,["link"in s?(i(),P(ke,{key:0,item:s},null,8,["item"])):g("",!0)],64))),256))]))}}),so=V(no,[["__scopeId","data-v-2bec9359"]]),oo={class:"VPMenu"},ao={key:0,class:"items"},ro=k({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(i(),h("div",oo,[e.items?(i(),h("div",ao,[(i(!0),h(H,null,z(e.items,s=>(i(),h(H,{key:JSON.stringify(s)},["link"in s?(i(),P(ke,{key:0,item:s},null,8,["item"])):"component"in s?(i(),P(W(s.component),Y({key:1,ref_for:!0},s.props),null,16)):(i(),P(so,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0),p(e.$slots,"default",{},void 0,!0)]))}}),io=V(ro,[["__scopeId","data-v-39eca401"]]),lo=["aria-expanded","aria-label"],co={key:0,class:"text"},uo=["innerHTML"],po={key:1,class:"vpi-more-horizontal icon"},ho={class:"menu"},fo=k({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=T(!1),t=T();Js({el:t,onBlur:s});function s(){e.value=!1}return(o,a)=>(i(),h("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:a[1]||(a[1]=r=>e.value=!0),onMouseleave:a[2]||(a[2]=r=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:a[0]||(a[0]=r=>e.value=!e.value)},[o.button||o.icon?(i(),h("span",co,[o.icon?(i(),h("span",{key:0,class:A([o.icon,"option-icon"])},null,2)):g("",!0),o.button?(i(),h("span",{key:1,innerHTML:o.button},null,8,uo)):g("",!0),a[3]||(a[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(i(),h("span",po))],8,lo),d("div",ho,[y(io,{items:o.items},{default:f(()=>[p(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Ee=V(fo,[["__scopeId","data-v-40e55da0"]]),vo=["href","aria-label","innerHTML"],mo=k({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=T();Q(async()=>{var a;await Ie();const o=(a=t.value)==null?void 0:a.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const s=S(()=>typeof e.icon=="object"?e.icon.svg:``);return(o,a)=>(i(),h("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:s.value},null,8,vo))}}),_o=V(mo,[["__scopeId","data-v-fbf39218"]]),go={class:"VPSocialLinks"},ko=k({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(i(),h("div",go,[(i(!0),h(H,null,z(e.links,({link:s,icon:o,ariaLabel:a})=>(i(),P(_o,{key:s,icon:o,link:s,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),Oe=V(ko,[["__scopeId","data-v-f2234a39"]]),bo={key:0,class:"group translations"},$o={class:"trans-title"},yo={key:1,class:"group"},Po={class:"item appearance"},Lo={class:"label"},Vo={class:"appearance-action"},So={key:2,class:"group"},To={class:"item social-links"},wo=k({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=M(),{localeLinks:s,currentLang:o}=ae({correspondingLink:!0}),a=S(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(r,l)=>a.value?(i(),P(Ee,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[c(s).length&&c(o).label?(i(),h("div",bo,[d("p",$o,C(c(o).label),1),(i(!0),h(H,null,z(c(s),u=>(i(),P(ke,{key:u.link,item:u},null,8,["item"]))),128))])):g("",!0),c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",yo,[d("div",Po,[d("p",Lo,C(c(t).darkModeSwitchLabel||"Appearance"),1),d("div",Vo,[y(He)])])])):g("",!0),c(t).socialLinks?(i(),h("div",So,[d("div",To,[y(Oe,{class:"social-links-list",links:c(t).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}}),Mo=V(wo,[["__scopeId","data-v-0c845e5d"]]),No=["aria-expanded"],Io=k({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(i(),h("button",{type:"button",class:A(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)]),10,No))}}),Co=V(Io,[["__scopeId","data-v-670493dd"]]),Ao=["innerHTML"],Ho=k({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=M();return(t,s)=>(i(),P(K,{class:A({VPNavBarMenuLink:!0,active:c(te)(c(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),Bo=V(Ho,[["__scopeId","data-v-8dbce4d0"]]),Eo=k({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=M(),s=a=>"component"in a?!1:"link"in a?te(t.value.relativePath,a.link,!!e.item.activeMatch):a.items.some(s),o=S(()=>s(e.item));return(a,r)=>(i(),P(Ee,{class:A({VPNavBarMenuGroup:!0,active:c(te)(c(t).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),Oo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Do=k({__name:"VPNavBarMenu",setup(n){const{theme:e}=M();return(t,s)=>c(e).nav?(i(),h("nav",Oo,[s[0]||(s[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(i(!0),h(H,null,z(c(e).nav,o=>(i(),h(H,{key:JSON.stringify(o)},["link"in o?(i(),P(Bo,{key:0,item:o},null,8,["item"])):"component"in o?(i(),P(W(o.component),Y({key:1,ref_for:!0},o.props),null,16)):(i(),P(Eo,{key:2,item:o},null,8,["item"]))],64))),128))])):g("",!0)}}),Fo=V(Do,[["__scopeId","data-v-5bacfe89"]]),zo="/document/assets/flex-logo.BJA2J7hW.svg";function $e(n,e){return typeof n>"u"?e:n}function ze(n){const e=Array(n);for(let t=0;t=this.minlength&&(l||!r[_])){let L=ie(u,o,v),b="";switch(this.tokenize){case"full":if(3$;N--)if(N-$>=this.minlength){const w=ie(u,o,v,m,$);b=_.substring($,N),this.push_index(r,b,w,n,t)}break}case"reverse":if(2=this.minlength){const N=ie(u,o,v,m,$);this.push_index(r,b,N,n,t)}b=""}case"forward":if(1=this.minlength&&this.push_index(r,b,L,n,t);break}default:if(this.boost&&(L=Math.min(0|L/this.boost(e,_,v),u-1)),this.push_index(r,_,L,n,t),l&&1=this.minlength&&!$[_]){$[_]=1;const R=ie(N+(o/2>N?0:1),o,v,O-1,F-1),X=this.bidirectional&&_>w;this.push_index(a,X?w:_,R,n,t,X?_:w)}}}}}this.fastupdate||(this.register[n]=1)}}return this};function ie(n,e,t,s,o){return t&&1=this.minlength&&!m[b]){if(!this.optimize&&!a&&!this.map[b])return r;L[N++]=b,m[b]=1}n=L,s=n.length}if(!s)return r;e||(e=100);let u,v=this.depth&&1=t)))));b++);if(v)return o?qe(l,t,0):void(n[n.length]=l)}return!e&&l};function qe(n,e,t){return n=n.length===1?n[0]:Uo(n),t||n.length>e?n.slice(t,t+e):n}function Ge(n,e,t,s){if(t){const o=s&&e>t;n=n[o?e:t],n=n&&n[o?t:e]}else n=n[e];return n}q.prototype.contain=function(n){return!!this.register[n]},q.prototype.update=function(n,e){return this.remove(n).add(n,e)},q.prototype.remove=function(n,e){const t=this.register[n];if(t){if(this.fastupdate)for(let s,o=0;o{if(a.value){for(var B=m.value.search(a.value,{enrich:!0}),I=[],j=0;j!B||!B.length?[]:B.reduce((j,E)=>(j[I(E)]||(j[I(E)]=[]),j[I(E)].push(E),j),{}),R=()=>{setTimeout(()=>{l.value&&l.value.focus()},100),De(),o.value=!0};Q(async()=>{var E,D;const B=await vt(()=>import("./virtual_search-data.BYUjhbX8.js"),[]);u.value=B.default.INDEX_DATA,v.value=B.default.PREVIEW_LOOKUP,_.value=B.default.Options,r.value=window.location.origin+he(t.value==="root"?"/":t.value),L.value=((E=_.value)==null?void 0:E.buttonLabel)||L.value,b.value=((D=_.value)==null?void 0:D.placeholder)||b.value;var I=new q(_.value);I.import("reg",u.value.reg),I.import("cfg",u.value.cfg),I.import("map",u.value.map),I.import("ctx",u.value.ctx),m.value=I,s.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const j=U=>{var se;U.key==="k"&&(U.ctrlKey||U.metaKey)&&(U.preventDefault(),R()),U.key==="Escape"&&((se=a.value)==null?void 0:se.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",j)});const X=S(()=>F(O.value,B=>B.link.split("/").slice(0,-1).join("-"))),ne=S(()=>Object.values(X.value).flat().map(B=>B.id));function De(){o.value=!1,a.value=""}const at=B=>{var I,j;if(document.getElementsByClassName("search-group")[0]){if(B.key=="ArrowUp"||B.key=="ArrowDown"){const E=ne.value.indexOf($.value);if(B.key=="ArrowUp"){const D=E==0?ne.value.length-1:E-1;$.value=ne.value[D]}if(B.key=="ArrowDown"){const D=E>ne.value.length-2?0:E+1;$.value=ne.value[D]}if(E<5){const D=N.value.getElementsByClassName("VPPluginSearch-search-group")[0];D==null||D.scrollIntoView(!0)}else(I=document.getElementById(ne.value[$.value]))==null||I.scrollIntoView(!0);Ie()}B.key=="Enter"&&w.go(e.site.value.base+((j=N.value.getElementsByClassName("link-focused")[0].getAttribute("href"))==null?void 0:j.replace(r.value,"")))}};return(B,I)=>{const j=Z("ClientOnly");return i(),h("div",la,[y(j,null,{default:f(()=>[(i(),P(gt,{to:"body"},[Fe(d("div",{class:"VPPluginSearch-modal-back",onClick:I[2]||(I[2]=E=>o.value=!1),onKeydown:at},[d("div",{class:"VPPluginSearch-modal",onClick:I[1]||(I[1]=Xe(()=>{},["stop"])),ref_key:"modal",ref:N},[d("form",ca,[I[4]||(I[4]=d("label",{class:"DocSearch-MagnifierLabel",for:"docsearch-input",id:"docsearch-label"},[d("svg",{width:"20",height:"20",class:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})])],-1)),Fe(d("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":I[0]||(I[0]=E=>a.value=E),placeholder:b.value,maxlength:"64",type:"search",ref_key:"input",ref:l},null,8,ua),[[_t,a.value]])]),d("div",da,[(i(!0),h(H,null,z(X.value,(E,D)=>(i(),h("div",{class:"search-group",key:D},[d("span",pa,C(D?D.toString()[0].toUpperCase()+D.toString().slice(1):"Home"),1),(i(!0),h(H,null,z(E,(U,se)=>(i(),h("a",{href:r.value+U.link,key:U.id,onClick:De,onMouseenter:re=>$.value=U.id,class:A({"link-focused":$.value==U.id}),id:se.toString()},[d("div",fa,[d("span",va,C(U.link.includes("#")?"#":"▤"),1),d("div",ma,[d("h3",null,C(U.title),1),d("p",null,[d("div",{innerHTML:U.preview},null,8,_a)])]),I[5]||(I[5]=d("span",{class:"VPPluginSearch-search-item-icon"},"↪",-1))])],42,ha))),128))]))),128))]),I[6]||(I[6]=d("img",{class:"VPPluginSearch-flex-logo",src:zo,alt:"flex logo"},null,-1))],512)],544),[[mt,o.value]])]))]),_:1}),d("div",{id:"docsearch",onClick:I[3]||(I[3]=E=>R())},[d("button",ga,[d("span",ka,[I[7]||(I[7]=d("svg",{width:"20",height:"20",class:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1)),d("span",ba,C(L.value),1)]),d("span",$a,[d("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:s},"Meta",512),I[8]||(I[8]=d("span",{class:"DocSearch-Button-Key"},"K",-1))])])])])}}}),Pa=k({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=M();return(t,s)=>c(e).socialLinks?(i(),P(Oe,{key:0,class:"VPNavBarSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),La=V(Pa,[["__scopeId","data-v-08b35e6f"]]),Va=["href","rel","target"],Sa=["innerHTML"],Ta={key:2},wa=k({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=M(),{hasSidebar:s}=x(),{currentLang:o}=ae(),a=S(()=>{var u;return typeof t.value.logoLink=="string"?t.value.logoLink:(u=t.value.logoLink)==null?void 0:u.link}),r=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.rel}),l=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.target});return(u,v)=>(i(),h("div",{class:A(["VPNavBarTitle",{"has-sidebar":c(s)}])},[d("a",{class:"title",href:a.value??c(Ce)(c(o).link),rel:r.value,target:l.value},[p(u.$slots,"nav-bar-title-before",{},void 0,!0),c(t).logo?(i(),P(ue,{key:0,class:"logo",image:c(t).logo},null,8,["image"])):g("",!0),c(t).siteTitle?(i(),h("span",{key:1,innerHTML:c(t).siteTitle},null,8,Sa)):c(t).siteTitle===void 0?(i(),h("span",Ta,C(c(e).title),1)):g("",!0),p(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,Va)],2))}}),Ma=V(wa,[["__scopeId","data-v-5622a072"]]),Na={class:"items"},Ia={class:"title"},Ca=k({__name:"VPNavBarTranslations",setup(n){const{theme:e}=M(),{localeLinks:t,currentLang:s}=ae({correspondingLink:!0});return(o,a)=>c(t).length&&c(s).label?(i(),P(Ee,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:c(e).langMenuLabel||"Change language"},{default:f(()=>[d("div",Na,[d("p",Ia,C(c(s).label),1),(i(!0),h(H,null,z(c(t),r=>(i(),P(ke,{key:r.link,item:r},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}}),Aa=V(Ca,[["__scopeId","data-v-dac637f3"]]),Ha={class:"wrapper"},Ba={class:"container"},Ea={class:"title"},Oa={class:"content"},Da={class:"content-body"},Fa=k({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=xe(),{hasSidebar:s}=x(),{frontmatter:o}=M(),a=T({});return Ne(()=>{a.value={"has-sidebar":s.value,home:o.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(r,l)=>(i(),h("div",{class:A(["VPNavBar",a.value])},[d("div",Ha,[d("div",Ba,[d("div",Ea,[y(Ma,null,{"nav-bar-title-before":f(()=>[p(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Oa,[d("div",Da,[p(r.$slots,"nav-bar-content-before",{},void 0,!0),y(ya,{class:"search"}),y(Fo,{class:"menu"}),y(Aa,{class:"translations"}),y(Ks,{class:"appearance"}),y(La,{class:"social-links"}),y(Mo,{class:"extra"}),p(r.$slots,"nav-bar-content-after",{},void 0,!0),y(Co,{class:"hamburger",active:r.isScreenOpen,onClick:l[0]||(l[0]=u=>r.$emit("toggle-screen"))},null,8,["active"])])])])]),l[1]||(l[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),za=V(Fa,[["__scopeId","data-v-bb7529ee"]]),ja={key:0,class:"VPNavScreenAppearance"},Ua={class:"text"},qa=k({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=M();return(s,o)=>c(e).appearance&&c(e).appearance!=="force-dark"&&c(e).appearance!=="force-auto"?(i(),h("div",ja,[d("p",Ua,C(c(t).darkModeSwitchLabel||"Appearance"),1),y(He)])):g("",!0)}}),Ga=V(qa,[["__scopeId","data-v-774971f8"]]),Ra=["innerHTML"],Wa=k({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=_e("close-screen");return(t,s)=>(i(),P(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:c(e)},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ra)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ka=V(Wa,[["__scopeId","data-v-29871565"]]),Ja=["innerHTML"],xa=k({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=_e("close-screen");return(t,s)=>(i(),P(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:c(e)},{default:f(()=>[d("span",{innerHTML:t.item.text},null,8,Ja)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),ot=V(xa,[["__scopeId","data-v-581896e9"]]),Xa={class:"VPNavScreenMenuGroupSection"},Ya={key:0,class:"title"},Qa=k({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(i(),h("div",Xa,[e.text?(i(),h("p",Ya,C(e.text),1)):g("",!0),(i(!0),h(H,null,z(e.items,s=>(i(),P(ot,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Za=V(Qa,[["__scopeId","data-v-836cddb8"]]),er=["aria-controls","aria-expanded"],tr=["innerHTML"],nr=["id"],sr={key:0,class:"item"},or={key:1,class:"item"},ar={key:2,class:"group"},rr=k({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=T(!1),s=S(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(a,r)=>(i(),h("div",{class:A(["VPNavScreenMenuGroup",{open:t.value}])},[d("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[d("span",{class:"button-text",innerHTML:a.text},null,8,tr),r[0]||(r[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,er),d("div",{id:s.value,class:"items"},[(i(!0),h(H,null,z(a.items,l=>(i(),h(H,{key:JSON.stringify(l)},["link"in l?(i(),h("div",sr,[y(ot,{item:l},null,8,["item"])])):"component"in l?(i(),h("div",or,[(i(),P(W(l.component),Y({ref_for:!0},l.props,{"screen-menu":""}),null,16))])):(i(),h("div",ar,[y(Za,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,nr)],2))}}),ir=V(rr,[["__scopeId","data-v-a8d3502a"]]),lr={key:0,class:"VPNavScreenMenu"},cr=k({__name:"VPNavScreenMenu",setup(n){const{theme:e}=M();return(t,s)=>c(e).nav?(i(),h("nav",lr,[(i(!0),h(H,null,z(c(e).nav,o=>(i(),h(H,{key:JSON.stringify(o)},["link"in o?(i(),P(Ka,{key:0,item:o},null,8,["item"])):"component"in o?(i(),P(W(o.component),Y({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(i(),P(ir,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),ur=k({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=M();return(t,s)=>c(e).socialLinks?(i(),P(Oe,{key:0,class:"VPNavScreenSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),dr={class:"list"},pr=k({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=ae({correspondingLink:!0}),s=T(!1);function o(){s.value=!s.value}return(a,r)=>c(e).length&&c(t).label?(i(),h("div",{key:0,class:A(["VPNavScreenTranslations",{open:s.value}])},[d("button",{class:"title",onClick:o},[r[0]||(r[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),ee(" "+C(c(t).label)+" ",1),r[1]||(r[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",dr,[(i(!0),h(H,null,z(c(e),l=>(i(),h("li",{key:l.link,class:"item"},[y(K,{class:"link",href:l.link},{default:f(()=>[ee(C(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}}),hr=V(pr,[["__scopeId","data-v-0d43316b"]]),fr={class:"container"},vr=k({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=T(null),t=Ye(ge?document.body:null);return(s,o)=>(i(),P(we,{name:"fade",onEnter:o[0]||(o[0]=a=>t.value=!0),onAfterLeave:o[1]||(o[1]=a=>t.value=!1)},{default:f(()=>[s.open?(i(),h("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[d("div",fr,[p(s.$slots,"nav-screen-content-before",{},void 0,!0),y(cr,{class:"menu"}),y(hr,{class:"translations"}),y(Ga,{class:"appearance"}),y(ur,{class:"social-links"}),p(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}}),mr=V(vr,[["__scopeId","data-v-34fa79a7"]]),_r={key:0,class:"VPNav"},gr=k({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=Os(),{frontmatter:o}=M(),a=S(()=>o.value.navbar!==!1);return Qe("close-screen",t),fe(()=>{ge&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(r,l)=>a.value?(i(),h("header",_r,[y(za,{"is-screen-open":c(e),onToggleScreen:c(s)},{"nav-bar-title-before":f(()=>[p(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(r.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[p(r.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[p(r.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),y(mr,{open:c(e)},{"nav-screen-content-before":f(()=>[p(r.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[p(r.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}}),kr=V(gr,[["__scopeId","data-v-a46e73f0"]]),br=["role","tabindex"],$r={key:1,class:"items"},yr=k({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:a,hasActiveLink:r,hasChildren:l,toggle:u}=zt(S(()=>e.item)),v=S(()=>l.value?"section":"div"),_=S(()=>o.value?"a":"div"),m=S(()=>l.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),L=S(()=>o.value?void 0:"button"),b=S(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":a.value},{"has-active":r.value}]);function $(w){"key"in w&&w.key!=="Enter"||!e.item.link&&u()}function N(){e.item.link&&u()}return(w,O)=>{const F=Z("VPSidebarItem",!0);return i(),P(W(v.value),{class:A(["VPSidebarItem",b.value])},{default:f(()=>[w.item.text?(i(),h("div",Y({key:0,class:"item",role:L.value},kt(w.item.items?{click:$,keydown:$}:{},!0),{tabindex:w.item.items&&0}),[O[1]||(O[1]=d("div",{class:"indicator"},null,-1)),w.item.link?(i(),P(K,{key:0,tag:_.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:f(()=>[(i(),P(W(m.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(i(),P(W(m.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null&&w.item.items&&w.item.items.length?(i(),h("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:bt(N,["enter"]),tabindex:"0"},O[0]||(O[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):g("",!0)],16,br)):g("",!0),w.item.items&&w.item.items.length?(i(),h("div",$r,[w.depth<5?(i(!0),h(H,{key:0},z(w.item.items,R=>(i(),P(F,{key:R.text,item:R,depth:w.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}}),Pr=V(yr,[["__scopeId","data-v-2e0476bc"]]),Lr=k({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=T(!0);let t=null;return Q(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),$t(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,o)=>(i(!0),h(H,null,z(s.items,a=>(i(),h("div",{key:a.text,class:A(["group",{"no-transition":e.value}])},[y(Pr,{item:a,depth:0},null,8,["item"])],2))),128))}}),Vr=V(Lr,[["__scopeId","data-v-ec086cd5"]]),Sr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Tr=k({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=x(),s=n,o=T(null),a=Ye(ge?document.body:null);J([s,o],()=>{var l;s.open?(a.value=!0,(l=o.value)==null||l.focus()):a.value=!1},{immediate:!0,flush:"post"});const r=T(0);return J(e,()=>{r.value+=1},{deep:!0}),(l,u)=>c(t)?(i(),h("aside",{key:0,class:A(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:o,onClick:u[0]||(u[0]=Xe(()=>{},["stop"]))},[u[2]||(u[2]=d("div",{class:"curtain"},null,-1)),d("nav",Sr,[u[1]||(u[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),p(l.$slots,"sidebar-nav-before",{},void 0,!0),(i(),P(Vr,{items:c(e),key:r.value},null,8,["items"])),p(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}}),wr=V(Tr,[["__scopeId","data-v-12a40e3d"]]),Mr=k({__name:"VPSkipLink",setup(n){const{theme:e}=M(),t=me(),s=T();J(()=>t.path,()=>s.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const l=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",l)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",l),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(i(),h(H,null,[d("span",{ref_key:"backToTop",ref:s,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},C(c(e).skipToContentLabel||"Skip to content"),1)],64))}}),Nr=V(Mr,[["__scopeId","data-v-17ad389b"]]),Ir=k({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=x(),o=me();J(()=>o.path,s),Ft(e,s);const{frontmatter:a}=M(),r=yt(),l=S(()=>!!r["home-hero-image"]);return Qe("hero-image-slot-exists",l),(u,v)=>{const _=Z("Content");return c(a).layout!==!1?(i(),h("div",{key:0,class:A(["Layout",c(a).pageClass])},[p(u.$slots,"layout-top",{},void 0,!0),y(Nr),y(St,{class:"backdrop",show:c(e),onClick:c(s)},null,8,["show","onClick"]),y(kr,null,{"nav-bar-title-before":f(()=>[p(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[p(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[p(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[p(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[p(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[p(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),y(Es,{open:c(e),onOpenMenu:c(t)},null,8,["open","onOpenMenu"]),y(wr,{open:c(e)},{"sidebar-nav-before":f(()=>[p(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[p(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),y(bs,null,{"page-top":f(()=>[p(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[p(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[p(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[p(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[p(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[p(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[p(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[p(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[p(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[p(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[p(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[p(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[p(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[p(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[p(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[p(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[p(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[p(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[p(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[p(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[p(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[p(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[p(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),y(Vs),p(u.$slots,"layout-bottom",{},void 0,!0)],2)):(i(),P(_,{key:1}))}}}),Cr=V(Ir,[["__scopeId","data-v-c4daae71"]]),Hr={Layout:Cr,enhanceApp:({app:n})=>{n.component("Badge",Pt)}};export{Hr as t};
diff --git a/docs/document/assets/chunks/virtual_search-data.BYUjhbX8.js b/docs/document/assets/chunks/virtual_search-data.BYUjhbX8.js
new file mode 100644
index 000000000..420464582
--- /dev/null
+++ b/docs/document/assets/chunks/virtual_search-data.BYUjhbX8.js
@@ -0,0 +1,1403 @@
+const e={map:'[{"高级属性":["0.0"],"option":["0.1","1.12","10.1","11.12","20.9","23.9","24.17"],"template":["0.2","10.2"],"events":["0.3","10.3"],"storage":["0.4","10.4"],"icons":["0.5","10.5","22.39","26.39"],"i18n":["0.6","10.6","22.43","26.43"],"notice":["0.7","3.4","10.7","13.4"],"layers":["0.8","10.8","22.29","26.29"],"controls":["0.9","10.9","17.0","22.32","26.32"],"contextmenu":["0.10","2.37","3.3","10.10","12.37","13.3","22.31","26.31"],"subtitle":["0.11","2.36","10.11","12.36","22.37","26.37"],"info":["0.12","2.32","3.22","10.12","12.32","13.22"],"loading":["0.13","2.34","10.13","12.34"],"hotkey":["0.14","2.5","10.14","12.5","22.19","26.19"],"mask":["0.15","2.35","10.15","12.35"],"setting":["0.16","2.39","3.5","3.6","3.7","10.16","12.39","13.5","13.6","13.7","22.18","26.18"],"plugins":["0.17","10.17","22.35","26.35"],"静态属性":["1.0"],"instances":["1.1","11.1"],"version":["1.2","11.2"],"env":["1.3","11.3"],"build":["1.4","11.4"],"config":["1.5","11.5","24.13"],"utils":["1.6","11.6"],"scheme":["1.7","11.7"],"emitter":["1.8","11.8"],"validator":["1.9","11.9"],"kindof":["1.10","11.10"],"html":["1.11","11.11"],"实例事件":["2.0"],"ready":["2.1","12.1"],"restart":["2.2","12.2"],"pause":["2.3","5.2","12.3","15.2"],"play":["2.4","5.1","12.4","15.1"],"destroy":["2.6","5.4","12.6","15.4"],"focus":["2.7","12.7"],"blur":["2.8","12.8"],"dblclick":["2.9","12.9"],"click":["2.10","12.10"],"error":["2.11","12.11"],"hover":["2.12","12.12"],"mousemove":["2.13","12.13"],"resize":["2.14","3.8","12.14","13.8"],"view":["2.15","12.15"],"lock":["2.16","12.16","22.44","26.44"],"aspectratio":["2.17","5.32","12.17","15.32","22.16","26.16"],"autoheight":["2.18","5.33","12.18","15.33"],"autosize":["2.19","5.27","12.19","15.27","22.11","26.11"],"flip":["2.20","3.30","5.30","12.20","13.30","15.30","22.14","26.14"],"fullscreen":["2.21","3.31","5.20","12.21","13.31","15.20","22.23","26.23"],"fullscreenerror":["2.22","12.22"],"fullscreenweb":["2.23","5.21","12.23","15.21","22.24","26.24"],"mini":["2.24","5.24","12.24","15.24"],"pip":["2.25","5.22","12.25","15.22","22.20","26.20"],"screenshot":["2.26","5.17","12.26","15.17","22.17","26.17"],"seek":["2.27","3.27","5.6","12.27","13.27","15.6"],"subtitleoffset":["2.28","5.47","12.28","15.47","22.25","26.25"],"subtitlebeforeupdate":["2.29","12.29"],"subtitleafterupdate":["2.30","12.30"],"subtitleload":["2.31","12.31"],"layer":["2.33","12.33","18.0"],"control":["2.38","3.16","12.38","13.16"],"muted":["2.40","5.14","12.40","15.14","22.9","26.9"],"keydown":["2.41","12.41"],"video":["2.42","2.43","2.44","2.45","2.46","2.47","2.48","2.49","2.50","2.51","2.52","2.53","2.54","2.55","2.56","2.57","2.58","2.59","2.60","2.61","2.62","5.43","12.42","12.43","12.44","12.45","12.46","12.47","12.48","12.49","12.50","12.51","12.52","12.53","12.54","12.55","12.56","12.57","12.58","12.59","12.60","12.61","12.62","15.43"],"全局属性":["3.0"],"debug":["3.1","13.1"],"style":["3.2","13.2"],"scroll":["3.9","3.10","13.9","13.10"],"auto":["3.11","3.12","3.13","3.21","13.11","13.12","13.13","13.21"],"reconnect":["3.14","3.15","13.14","13.15"],"dbclick":["3.17","3.18","13.17","13.18"],"mobile":["3.19","3.20","13.19","13.20"],"fast":["3.23","3.24","13.23","13.24"],"touch":["3.25","13.25"],"volume":["3.26","5.9","13.26","15.9","22.7","26.7"],"playback":["3.28","13.28"],"aspect":["3.29","13.29"],"log":["3.32","13.32"],"use":["3.33","13.33"],"remove":["3.34","13.34","19.8"],"编写插件":["4.0"],"实例属性":["5.0"],"toggle":["5.3","15.3"],"reset":["5.5","15.5","24.15"],"forward":["5.7","15.7"],"backward":["5.8","15.8"],"url":["5.10","15.10","22.2","26.2"],"switch":["5.11","15.11"],"switchurl":["5.12","15.12"],"switchquality":["5.13","15.13"],"currenttime":["5.15","15.15"],"duration":["5.16","15.16"],"getdataurl":["5.18","15.18"],"getbloburl":["5.19","15.19"],"poster":["5.23","15.23","22.5","26.5"],"playing":["5.25","15.25"],"state":["5.26","15.26"],"rect":["5.28","15.28"],"bottom":["5.29","15.29"],"playbackrate":["5.31","15.31","22.15","26.15"],"attr":["5.34","15.34"],"type":["5.35","15.35","22.40","26.40"],"theme":["5.36","15.36","22.6","26.6"],"airplay":["5.37","15.37","22.49","26.49"],"loaded":["5.38","15.38"],"loadedtime":["5.39","15.39"],"played":["5.40","15.40"],"proxy":["5.41","15.41","22.51","26.51"],"query":["5.42","15.42"],"cssvar":["5.44","15.44","22.50","26.50"],"quality":["5.45","15.45","22.33","26.33"],"thumbnails":["5.46","15.46","22.36","26.36"],"右键菜单":["6.0"],"配置":["6.1","7.1","8.1"],"创建":["6.2","7.2","8.2","9.2","9.3","9.4","9.5","9.6"],"添加":["6.3","7.3","8.3","9.7"],"删除":["6.4","7.4","8.4","9.8"],"更新":["6.5","7.5","8.5","9.9"],"控制器":["7.0"],"业务层":["8.0"],"设置面板":["9.0"],"内置":["9.1"],"advanced":["10.0"],"static":["11.0"],"instance":["12.0","15.0"],"global":["13.0"],"writing":["14.0"],"context":["16.0"],"configuration":["16.1","17.1","18.1"],"creation":["16.2","17.2","18.2"],"addition":["16.3","18.3"],"removal":["16.4","17.4","18.4"],"update":["16.5","18.5","19.9"],"adding":["17.3","21.3"],"updating":["17.5"],"settings":["19.0","22.30","26.30"],"built":["19.1"],"creating":["19.2","19.3","19.4"],"create":["19.5","19.6"],"add":["19.7"],"installation":["20.0","20.1"],"cdn":["20.2","23.2","24.3"],"usage":["20.3"],"vue":["20.4","20.7","23.4","23.7"],"react":["20.5","20.8","23.5","23.8"],"typescript":["20.6","23.6"],"javascript":["20.10","23.10"],"legacy":["20.11"],"ecmascript":["20.12","23.12"],"custom":["20.13"],"language":["21.0"],"default":["21.1"],"importing":["21.2"],"modifying":["21.4"],"basic":["22.0"],"container":["22.1","26.1"],"id":["22.3","26.3"],"onready":["22.4","26.4"],"islive":["22.8","26.8"],"autoplay":["22.10","26.10"],"automini":["22.12","26.12"],"loop":["22.13","26.13"],"mutex":["22.21","26.21"],"backdrop":["22.22","26.22"],"miniprogressbar":["22.26","26.26"],"usessr":["22.27","26.27"],"playsinline":["22.28","26.28"],"highlight":["22.34","26.34"],"morevideoattr":["22.38","26.38"],"customtype":["22.41","26.41"],"lang":["22.42","26.42"],"gesture":["22.45","26.45"],"fastforward":["22.46","26.46"],"autoplayback":["22.47","26.47"],"autoorientation":["22.48","26.48"],"安装使用":["23.0"],"安装":["23.1","24.2"],"使用":["23.3"],"古老的浏览器":["23.11"],"自定义":["23.13"],"弹幕库":["24.0"],"演示":["24.1"],"弹幕结构":["24.4"],"全部选项":["24.5"],"生命周期":["24.6"],"使用弹幕数组":["24.7"],"使用弹幕":["24.8"],"使用异步返回":["24.9"],"hide":["24.10"],"ishide":["24.11"],"emit":["24.12"],"load":["24.14"],"mount":["24.16"],"事件":["24.18"],"语言设置":["25.0"],"默认语言":["25.1"],"导入语言":["25.2"],"新增语言":["25.3"],"修改语言":["25.4"],"基础选项":["26.0"]},{"0":["3.28","5.38","5.40","22.7","26.7"],"1":["23.11","24.5"],"3":["3.29","23.9"],"4":["3.29","25.3"],"5":["3.28","8.2","18.2","24.5"],"7":["8.3","18.3","22.7"],"9":["25.3"],"10":["24.5"],"15":["4.0"],"21":["8.5","9.9","18.5","19.9"],"26":["7.5","17.5"],"27":["9.9","19.9"],"75":["3.28"],"250":["3.5"],"这里的":["0.0","1.0","3.0","5.0"],"播放器的选项":["0.1"],"div":["0.1","0.2","0.4","0.5","0.7","0.14","0.17","1.1","1.6","2.0","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.3","4.0","5.1","5.2","5.3","5.16","5.28","5.33","5.37","5.45","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","10.1","10.2","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.29","22.30","24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.29","26.30","26.31","26.32"],"classname":["0.1","0.2","0.17","2.0","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","4.0","5.45","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","10.2","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.29","22.30","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.29","26.30"],"run":["0.1","0.2","2.0","2.2","2.6","2.11","2.12","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","2.39","4.0","5.45","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.29","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.29","26.30"],"管理播放器所有的":["0.2","0.3","0.5"],"dom":["0.2","0.3","5.41","5.42","9.2","9.3","9.5","9.6","10.2","10.3","15.41","15.42","19.2","19.3","19.5","19.6","22.1","26.1"],"元素":["0.2","9.5","9.6"],"事件":["0.3","4.0"],"实质上是代理了":["0.3"],"addeventlistener":["0.3","5.41","10.3","15.41"],"和":["0.3","4.0","5.13","24.8","24.10","26.4"],"removeeventlistener":["0.3","10.3"],"当使用以下方法来处理事件":["0.3"],"播放器销毁时也会自动销毁该事件":["0.3"],"管理播放器的本地存储":["0.4"],"name":["0.4","4.0","10.4"],"属性用于设置缓存的":["0.4"],"key":["0.4","10.4"],"set":["0.4","10.4","15.9","15.11","15.12","22.36","22.37"],"方法用于设置缓存":["0.4"],"get":["0.4","0.6","10.6"],"方法用于获取缓存":["0.4"],"del":["0.4"],"方法用于删除缓存":["0.4"],"clear":["0.4"],"方法用于清空缓存":["0.4"],"svg":["0.5","10.5"],"图标":["0.5"],"管理播放器的":["0.6"],"方法用于获取":["0.6"],"的值":["0.6"],"update":["0.6","0.8","0.9","0.10","0.16"],"管理播放器的提示语":["0.7"],"只有一个":["0.7"],"show":["0.7","0.13","0.15","10.13","10.15","24.10"],"属性用于显示提示语":["0.7"],"管理播放器的层":["0.8"],"add":["0.8","0.9","0.10","0.14","0.16","0.17","10.8","10.9","10.10","10.14","10.16"],"方法用于动态添加层":["0.8"],"remove":["0.8","0.9","0.10","0.14","0.16"],"方法用于动态删除层":["0.8"],"管理播放器的控制器":["0.9"],"方法用于动态添加控制器":["0.9"],"方法用于动态删除控制器":["0.9"],"管理播放器的右键菜单":["0.10"],"方法用于动态添加菜单":["0.10"],"方法用于动态删除菜单":["0.10"],"方法用于动态更新菜单":["0.10"],"管理播放器的字幕功能":["0.11"],"url":["0.11","5.12","10.11","12.2","15.12","15.18","15.19"],"属性设置和返回当前字幕地址":["0.11"],"style":["0.11"],"方法设置当前字幕的样式":["0.11"],"switch":["0.11"],"管理播放器的信息面板":["0.12"],"常用于查看当前播放器和视频的运行状态":["0.12"],"例如版本号":["0.12"],"分辨率":["0.12"],"时长等":["0.12"],"管理播放器的加载层":["0.13"],"属性用于设置是否显示加载层":["0.13"],"toggle":["0.13","0.15","19.5"],"管理播放器的快捷键功能":["0.14"],"方法用于添加快捷键":["0.14"],"方法用于删除快捷键":["0.14"],"管理播放器的遮罩层":["0.15"],"属性用于设置是否显示遮罩层":["0.15"],"管理播放器的设置面板":["0.16"],"方法用于动态添加设置项":["0.16"],"方法用于动态删除设置项":["0.16"],"方法用于动态更新设置项":["0.16"],"管理播放器的插件功能":["0.17"],"只有一个方法":["0.17"],"用于动态添加插件":["0.17"],"返回全部播放器实例的数组":["1.1"],"假如你想同时管理多个播放器的时候":["1.1"],"可以用到该属性":["1.1"],"返回播放器的版本信息":["1.2"],"返回播放器的环境变量":["1.3"],"返回播放器的打包时间":["1.4"],"返回视频的默认配置":["1.5"],"返回播放器的工具函数集合":["1.6"],"返回播放器选项的校验方案":["1.7"],"返回事件分发器的构造函数":["1.8"],"返回选项的校验函数":["1.9"],"返回类型检测的函数工具":["1.10"],"返回播放器所需的":["1.11"],"返回播放器的默认选项":["1.12"],"播放器的事件分为两种":["2.0"],"一种视频的":["2.0"],"原生事件":["2.0"],"前缀":["2.0"],"video":["2.0","12.0","13.29","13.30","13.34","15.3","15.5","15.11","15.12","15.13","15.16","22.2","22.5","22.37","22.40","22.41"],"另外一种是":["2.0"],"自定义事件":["2.0"],"监听事件":["2.0"],"code":["2.0","2.2","2.28","4.0","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","20.1","20.2","20.3","20.4","20.5","22.2","22.29","23.1","23.2","23.3","23.4","23.5","24.2","24.3","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.29"],"js":["2.0","4.0","6.5","7.2","7.3","7.5","8.2","8.3","8.5","9.4","9.8","9.9","14.0","16.5","17.2","17.3","17.5","18.2","18.3","18.5","19.4","19.8","19.9","20.4","20.5","20.7","20.8","20.10","20.11","21.2","21.4","23.4","23.5","23.7","23.8","23.10","23.11","24.5","24.18","25.2","25.3","25.4"],"当播放器首次可以播放器时触发":["2.1"],"当播放器切换地址后并可以播放时触发":["2.2"],"当播放器暂停时触发":["2.3"],"当播放器播放时触发":["2.4"],"当播放器热键被按下时触发":["2.5"],"当播放器销毁时触发":["2.6"],"当播放器获得焦点时触发":["2.7"],"当播放器失去焦点时触发":["2.8"],"当播放器被双击时触发":["2.9"],"当播放器被单击时触发":["2.10"],"当播放器加载视频发生错误时触发":["2.11"],"当播放器被鼠标移出或者移入时触发":["2.12"],"当播放器被鼠标经过时触发":["2.13"],"当播放器尺寸变化时触发":["2.14"],"当播放器出现在视口时触发":["2.15"],"在移动端":["2.16","3.19","3.20","3.21","3.23","3.24","3.25"],"当锁定的状态发生变化时触发":["2.16"],"当播放器长宽比变化时触发":["2.17"],"当播放器自动设置高度时触发":["2.18"],"当播放器自动设置尺寸时触发":["2.19"],"当播放器发生翻转时触发":["2.20"],"当播放器发生窗口全屏时触发":["2.21"],"当播放器发生窗口全屏错误时触发":["2.22"],"当播放器发生网页全屏时触发":["2.23"],"当播放器进入迷你模式时触发":["2.24"],"当播放器进入画中画时触发":["2.25"],"当播放器被截图时触发":["2.26"],"当播放器发生时间跳转时触发":["2.27"],"当播放器发生字幕偏移时触发":["2.28"],"当字幕更新前触发":["2.29"],"当字幕更新后触发":["2.30"],"当字幕加载时触发":["2.31"],"当信息面板显示或隐藏时触发":["2.32"],"当自定义层显示或隐藏时触发":["2.33"],"当加载器显示或隐藏时触发":["2.34"],"当遮罩层显示或隐藏时触发":["2.35"],"当字幕层显示或隐藏时触发":["2.36"],"当右键菜单显示或隐藏时触发":["2.37"],"当控制器显示或隐藏时触发":["2.38"],"当设置面板显示或隐藏时触发":["2.39"],"当静音的状态变化时触发":["2.40"],"监听来自":["2.41"],"document":["2.41"],"的":["2.41"],"canplay":["2.42","12.42"],"canplaythrough":["2.43","12.43"],"complete":["2.44","12.44"],"durationchange":["2.45","12.45"],"emptied":["2.46","12.46"],"ended":["2.47","12.47"],"error":["2.48","12.48"],"loadeddata":["2.49","12.49"],"loadedmetadata":["2.50","12.50"],"pause":["2.51","12.51"],"play":["2.52","3.19","3.20","12.52","13.19","13.20"],"playing":["2.53","12.53"],"progress":["2.54","12.54","22.36"],"ratechange":["2.55","12.55"],"seeked":["2.56","12.56"],"seeking":["2.57","12.57","13.27"],"stalled":["2.58","12.58"],"suspend":["2.59","12.59"],"timeupdate":["2.60","12.60"],"volumechange":["2.61","12.61"],"waiting":["2.62","12.62"],"是否开始":["3.1"],"模式":["3.1"],"返回播放器样式文本":["3.2"],"是否开启右键菜单":["3.3"],"默认开启":["3.3"],"time":["3.4","3.8","3.9","3.14","3.15","3.16","3.17","3.21","3.22","3.24","13.4","13.8","13.9","13.14","13.15","13.16","13.17","13.21","13.22","13.24"],"提示信息的显示时长":["3.4"],"单位为毫秒":["3.4","3.8","3.9","3.13","3.16","3.17","3.22"],"width":["3.5","3.6","5.29","9.3","13.5","13.6","15.29","15.33"],"设置面板的默认宽度":["3.5"],"单位为像素":["3.5","3.6","3.7","3.10"],"默认为":["3.5","3.6","3.7","3.11","3.17","3.26","3.28","3.29","3.30","3.32","3.33"],"item":["3.6","3.7","13.6","13.7","19.6"],"设置面板的设置项的默认宽度":["3.6"],"height":["3.7","5.29","13.7","15.29"],"设置面板的设置项的默认高度":["3.7"],"事件的节流时间":["3.8","3.9"],"gap":["3.10","13.10"],"view":["3.10","10.12"],"事件的边界容差距离":["3.10"],"playback":["3.11","3.12","3.13","12.53","13.11","13.12","13.13","15.3","22.47"],"max":["3.11","3.14","13.11","13.14"],"自动回放功能的最大记录数":["3.11"],"min":["3.12","13.12"],"自动回放功能的最小记录时长":["3.12"],"单位为秒":["3.12","3.27","5.39"],"timeout":["3.13","13.13"],"自动回放功能的隐藏延迟时长":["3.13"],"发生连接错误时":["3.14","3.15"],"自动连接的最大次数":["3.14"],"sleep":["3.15","13.15"],"自动连接的延迟时间":["3.15"],"hide":["3.16","13.13","13.16"],"底部控制栏的自动隐藏的延迟时间":["3.16"],"双击事件的延迟事件":["3.17"],"fullscreen":["3.18","12.22","13.18"],"在桌面端":["3.18"],"是否双击切换全屏":["3.18"],"dbclick":["3.19","13.19"],"是否双击切换播放暂停":["3.19"],"click":["3.20","13.20"],"是否单击切换播放暂停":["3.20"],"orientation":["3.21","13.21"],"自动旋屏的延迟时间":["3.21"],"loop":["3.22","13.22"],"信息面板的刷新时间":["3.22"],"forward":["3.23","3.24","13.23","13.24"],"value":["3.23","13.23"],"长按加速的速率倍数":["3.23"],"长按加速的延迟时间":["3.24"],"move":["3.25","13.25"],"ratio":["3.25","3.29","13.25","13.29"],"左右滑动进度的速率倍数":["3.25"],"step":["3.26","3.27","13.26","13.27"],"快捷键调节音量的幅度比例":["3.26"],"快捷键调节播放进度的幅度":["3.27"],"rate":["3.28","13.28"],"内置播放速率的列表":["3.28"],"内置视频长宽比的列表":["3.29"],"default":["3.29","13.5","13.6","13.7","22.1","22.2","22.3","22.4","22.5","22.6","22.7","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.28","22.29","22.30","22.31","22.32","22.33","22.34","22.35","22.36","22.37","22.38","22.39","22.40","22.41","22.42","22.43","22.44","22.45","22.46","22.47","22.48","22.49","22.50","22.51","26.1","26.2","26.3","26.4","26.5","26.6","26.7","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.28","26.29","26.30","26.31","26.32","26.33","26.34","26.35","26.36","26.37","26.38","26.39","26.40","26.41","26.42","26.43","26.44","26.45","26.46","26.47","26.48","26.49","26.50","26.51"],"内置视频翻转的列表":["3.30"],"normal":["3.30"],"horizontal":["3.30"],"vertical":["3.30"],"web":["3.31","13.31"],"in":["3.31","12.28","13.17","13.28","13.29","13.30","13.31","19.1","20.10"],"body":["3.31","13.31"],"网页全屏时":["3.31"],"version":["3.32","13.32"],"设置是否打印播放器版本":["3.32"],"raf":["3.33","13.33"],"设置是否使用":["3.33"],"requestanimationframe":["3.33"],"src":["3.34","5.5","13.34","21.2","25.2"],"when":["3.34","10.3","12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","13.34","15.33"],"destroy":["3.34","13.34"],"在销毁播放器时":["3.34"],"是否同时移除视频的":["3.34"],"但你已经知道播放器的":["4.0"],"属性":["4.0","6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.33","26.34","26.36","26.37"],"方法":["4.0"],"后":["4.0"],"再编写插件是非常简单的事":["4.0"],"可以在实例化的时候加载插件的函数":["4.0"],"function":["4.0","5.1","5.2","5.3","5.4","5.5","5.12","5.13","5.17","5.18","5.19","5.27","5.33","5.34","5.37","5.41","5.42","5.44","9.3","15.1","15.2","15.3","15.4","15.5","15.12","15.13","15.17","15.18","15.19","15.27","15.33","15.34","15.37","15.41","15.42","15.44","19.3","22.4","22.51","26.4","26.51"],"myplugin":["4.0"],"art":["4.0","5.12","7.2","15.12","17.2"],"console":["4.0"],"info":["4.0"],"return":["4.0"],"something":["4.0"],"type":["5.1","5.2","5.3","5.4","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.26","5.27","5.28","5.30","5.31","5.32","5.33","5.34","5.36","5.37","5.38","5.39","5.40","5.41","5.42","5.43","5.44","5.45","5.46","5.47","15.1","15.2","15.3","15.4","15.5","15.6","15.7","15.8","15.9","15.10","15.11","15.12","15.13","15.14","15.15","15.16","15.17","15.18","15.19","15.20","15.21","15.22","15.23","15.24","15.25","15.26","15.27","15.28","15.29","15.30","15.31","15.32","15.33","15.34","15.36","15.37","15.38","15.39","15.40","15.41","15.42","15.43","15.44","15.45","15.46","15.47","16.1","17.1","18.1","19.2","19.3","19.5","19.6","20.10","22.1","22.2","22.3","22.4","22.5","22.6","22.7","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.28","22.29","22.30","22.31","22.32","22.33","22.34","22.35","22.36","22.37","22.38","22.39","22.41","22.42","22.43","22.44","22.45","22.46","22.47","22.48","22.49","22.50","22.51","26.1","26.2","26.3","26.4","26.5","26.6","26.7","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.28","26.29","26.30","26.31","26.32","26.33","26.34","26.35","26.36","26.37","26.38","26.39","26.41","26.42","26.43","26.44","26.45","26.46","26.47","26.48","26.49","26.50","26.51"],"播放视频":["5.1"],"暂停视频":["5.2"],"切换视频的播放和暂停":["5.3"],"parameter":["5.4","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.15","5.20","5.21","5.22","5.23","5.24","5.25","5.26","5.30","5.31","5.32","5.34","5.35","5.36","5.45","5.46","5.47","15.4","15.6","15.7","15.8","15.9","15.10","15.11","15.12","15.13","15.14","15.15","15.20","15.21","15.22","15.23","15.24","15.25","15.26","15.30","15.31","15.32","15.34","15.35","15.36","15.45","15.46","15.47","22.4"],"boolean":["5.4","5.14","5.20","5.21","5.22","5.25","7.1","15.4","15.14","15.20","15.21","15.22","15.24","15.25","16.1","17.1","18.1","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.28","22.44","22.45","22.46","22.47","22.48","22.49","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.28","26.44","26.45","26.46","26.47","26.48","26.49"],"重置播放器的视频元素":["5.5"],"会移除当前":["5.5"],"并调用一次":["5.5"],"setter":["5.6","5.7","5.8","5.9","5.10","5.11","5.14","5.15","5.20","5.21","5.22","5.23","5.24","5.26","5.30","5.31","5.32","5.35","5.36","5.45","5.46","5.47","15.6","15.7","15.8","15.9","15.10","15.11","15.14","15.15","15.20","15.21","15.22","15.23","15.24","15.26","15.30","15.31","15.32","15.35","15.36","15.45","15.46","15.47"],"number":["5.6","5.7","5.8","5.9","5.15","5.31","13.14","15.6","15.7","15.8","15.9","15.15","15.31","15.47","21.0","22.7","26.7"],"getter":["5.9","5.10","5.14","5.15","5.16","5.20","5.21","5.22","5.23","5.24","5.25","5.26","5.28","5.30","5.31","5.32","5.35","5.36","5.38","5.39","5.40","5.46","5.47","15.9","15.10","15.14","15.15","15.16","15.20","15.21","15.22","15.23","15.24","15.25","15.26","15.28","15.29","15.30","15.31","15.32","15.35","15.36","15.38","15.39","15.40","15.46","15.47"],"string":["5.11","5.12","5.13","5.23","5.26","5.30","5.32","5.34","5.35","5.36","9.2","9.3","9.5","9.6","15.10","15.11","15.12","15.13","15.23","15.26","15.30","15.32","15.34","15.35","15.36","19.2","19.3","19.5","19.6","22.1","22.2","22.3","22.5","22.6","22.40","22.42","26.1","26.2","26.3","26.5","26.6","26.40","26.42"],"设置视频地址":["5.11","5.12"],"设置时和":["5.11","5.12"],"设置视频画质地址":["5.13"],"获取视频时长":["5.16"],"下载当前视频帧的截图":["5.17"],"可选参数为截图名字":["5.17"],"获取当前视频帧的截图的":["5.18","5.19"],"base64":["5.18","15.18"],"地址":["5.18","5.19"],"blob":["5.19","15.19"],"设置和获取视频海报":["5.23"],"获取或设置播放器当前状态":["5.26"],"设置视频是否自适应尺寸":["5.27"],"获取播放器的尺寸和坐标信息":["5.28"],"top":["5.29","15.29"],"left":["5.29","15.29"],"right":["5.29","15.29"],"x":["5.29","15.29"],"y":["5.29","15.29"],"当容器只有宽度":["5.33"],"该属性可以自动计算出并设置视频的高度":["5.33"],"动态获取和设置":["5.34"],"开启隔空播放":["5.37"],"视频缓存的比例":["5.38"],"范围是":["5.38","5.40"],"已缓存的媒体时长":["5.39"],"视频播放的比例":["5.40"],"事件的代理函数":["5.41"],"实质上代理了":["5.41"],"的查询函数":["5.42"],"element":["5.43","9.2","9.3","9.5","9.6","15.5","15.43","19.2","19.3","19.5","19.6","22.1","26.1"],"快捷返回播放器的":["5.43"],"动态获取或设置":["5.44"],"css":["5.44"],"变量":["5.44","23.10"],"array":["5.45","9.3","11.1","15.45","19.3","22.29","22.30","22.31","22.32","22.33","22.34","22.35","26.29","26.30","26.31","26.32","26.33","26.34","26.35"],"动态设置画质列表":["5.45"],"object":["5.46","15.46","22.36","22.37","22.38","22.39","22.41","22.43","22.50","26.36","26.37","26.38","26.39","26.41","26.43","26.50"],"类型":["6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.34","26.36","26.37"],"描述":["6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.36"],"disable":["6.1","7.1","8.1","16.1","17.1","18.1"],"var":["7.2","9.4","17.2"],"new":["7.2","17.2","21.3"],"artplayer":["7.2","17.2","20.4","20.5","20.6","20.11","20.12","21.2","22.1","23.5","23.11","23.12","24.18","25.2","25.4","26.1"],"container":["7.2","15.33","17.2"],"须先打开设置面板":["9.1"],"然后自带四个内置项":["9.1"],"flip":["9.1"],"playbackrate":["9.1"],"按钮":["9.2"],"html":["9.2","9.3","9.5","9.6","19.2","19.3","19.5","19.6","20.3","23.3","26.39"],"元素的":["9.2","9.3","9.5","9.6"],"选择列表":["9.3"],"icon":["9.3","9.5","9.6","19.3","19.6"],"元素的图标":["9.3"],"selector":["9.3","19.3"],"元素列表":["9.3"],"onselect":["9.3","19.3"],"元素点击事件":["9.3"],"列表嵌套":["9.4"],"切换按钮":["9.5"],"范围滑块":["9.6"],"properties":["10.0","11.0","13.0","14.0","15.0"],"the":["10.0","10.1","10.2","10.3","10.4","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","10.17","11.2","11.3","11.4","11.5","11.6","11.7","11.8","11.9","11.10","11.11","11.12","12.1","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.23","12.24","12.25","12.26","12.27","12.32","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.42","12.43","12.46","12.58","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.14","13.15","13.16","13.17","13.22","13.24","13.26","13.27","13.28","13.29","13.30","13.34","14.0","15.1","15.2","15.4","15.5","15.11","15.12","15.13","15.16","15.18","15.19","15.20","15.22","15.28","15.33","15.38","15.39","15.40","15.45","17.1","19.5","19.6","20.9","20.11","20.13","21.0","21.1","22.1","22.2","22.3","22.4","22.5","22.6","22.7","22.11","22.22","22.33","22.34","22.36","22.37","22.40","22.41","22.47","22.51"],"player":["10.1","10.2","10.3","10.4","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","10.17","11.1","12.0","12.1","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.14","12.15","12.17","12.18","12.19","12.20","12.21","12.23","12.24","12.25","12.26","12.27","14.0","15.5","15.28"],"s":["10.1","10.4","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","10.17","12.17","13.34","14.0","15.5","15.28"],"options":["10.1","22.0"],"manages":["10.2","10.3","10.4","10.5","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","10.17"],"all":["10.2","10.3","10.5","11.1"],"elements":["10.2"],"of":["10.2","11.1","11.6","13.5","13.6","13.7","13.28","13.29","13.30","15.16","15.38","15.39","15.40","15.45","19.5","19.6","21.0"],"for":["10.3","10.5","12.41","13.8","13.9","15.41","20.13"],"it":["10.3","10.7","22.40"],"essentially":["10.3","15.41"],"proxies":["10.3"],"and":["10.3","10.11","12.0","13.34","14.0","15.15","15.20","15.22","15.23"],"using":["10.3"],"local":["10.4"],"property":["10.4","10.11","16.1","17.1","18.1","19.2","19.3","19.5","19.6"],"is":["10.4","10.6","10.8","10.9","10.10","10.14","10.16","12.20","20.13"],"used":["10.4","10.6","10.8","10.9","10.10","10.12","10.16","22.39","22.40","22.50"],"to":["10.4","10.6","10.8","10.9","10.10","10.12","10.16","12.0","13.1","13.3","13.31","13.32","13.33","13.34","15.12","17.1","19.1","21.0","22.10","22.17","22.19","22.22","22.27","22.33","22.39","22.40","22.47","22.50"],"cache":["10.4"],"method":["10.4","10.6","10.8","10.9","10.10","10.14","10.16"],"notifications":["10.7"],"only":["10.7","15.33","20.11"],"dynamically":["10.8","10.9","10.10","10.16","15.34","15.35","15.36","15.44","15.45"],"context":["10.10","12.37","22.31"],"menu":["10.10","16.0"],"functionality":["10.11","10.14","10.17"],"sets":["10.11","13.32","13.33","15.13","15.14","15.15","15.20","15.21","15.22","15.23","15.26","15.27","15.30","15.31","15.32","15.44","15.45"],"information":["10.12","22.34"],"panel":["10.12","10.16","12.39","19.0","22.30"],"commonly":["10.12"],"layer":["10.13","10.15"],"settings":["10.16","12.39","21.0"],"plugin":["10.17","14.0","24.18"],"with":["10.17","12.0","14.0"],"here":["11.0","15.0"],"returns":["11.1","11.2","11.3","11.4","11.5","11.6","11.7","11.8","11.9","11.10","11.11","11.12","13.2","15.43"],"an":["11.1","12.0","12.11","12.48"],"collection":["11.6"],"events":["12.0","12.41","14.0","15.41"],"are":["12.0","12.29","12.30","12.31","14.0","21.2"],"divided":["12.0"],"into":["12.0"],"two":["12.0"],"types":["12.0"],"native":["12.0"],"prefixed":["12.0"],"custom":["12.0","12.33","22.29","22.30","22.31","22.32","22.35","22.43"],"listen":["12.0"],"event":["12.0"],"triggered":["12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40"],"switches":["12.2"],"a":["12.5","12.22","15.17","15.33","15.41","15.42","20.13","21.3","22.4"],"occurs":["12.11"],"mouse":["12.12","12.13"],"enters":["12.12","12.21","12.23","12.24","12.25"],"state":["12.16"],"automatically":["12.18","22.12"],"window":["12.22"],"subtitle":["12.28","22.25"],"offset":["12.28"],"changes":["12.28"],"before":["12.29","21.2"],"subtitles":["12.29","12.30","12.31"],"updated":["12.29","12.30"],"after":["12.30"],"loaded":["12.31"],"layers":["12.33"],"loader":["12.34"],"controls":["12.38","22.38","26.38"],"mute":["12.40"],"listens":["12.41"],"browser":["12.42"],"media":["12.46","15.39"],"has":["12.46","15.33"],"these":["13.0"],"whether":["13.1","13.3","13.18","13.31","13.32","13.33","13.34","15.27","16.1","17.1","18.1","20.13","22.10","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.22","22.23","22.24","22.27","22.33","22.44","22.45","22.46","22.47","22.48","22.49"],"enable":["13.1","13.3","22.8","22.19","22.22"],"mode":["13.1"],"display":["13.4","22.17","22.33","22.34"],"duration":["13.4"],"throttle":["13.8","13.9"],"boundary":["13.10"],"tolerance":["13.10"],"distance":["13.10"],"maximum":["13.11","13.14"],"record":["13.11","13.12"],"minimum":["13.12"],"delay":["13.13","13.15","13.16","13.17"],"on":["13.18","13.19","13.20","13.21","13.23","13.24","13.25","22.34","22.36","22.41"],"desktop":["13.18"],"devices":["13.19","13.20","13.21","13.23","13.24","13.25"],"mobile":["13.21","13.23","13.24","13.25","20.13"],"refresh":["13.22"],"interval":["13.22"],"adjustment":["13.26"],"built":["13.28","13.29","13.30"],"list":["13.28","13.29","13.30","15.45","19.3"],"determines":["13.31","13.34"],"attribute":["13.34"],"plugins":["14.0"],"once":["14.0"],"you":["14.0","19.1","20.9"],"familiar":["14.0"],"methods":["14.0"],"becomes":["14.0"],"very":["14.0"],"straightforward":["14.0"],"can":["14.0","20.9"],"load":["14.0"],"functions":["14.0"],"during":["14.0"],"instantiation":["14.0"],"removes":["15.5"],"rewind":["15.8"],"similar":["15.12"],"gets":["15.15","15.16","15.18","15.19","15.20","15.22","15.23","15.25","15.26","15.28","15.34","15.44"],"downloads":["15.17"],"or":["15.26","15.44"],"defined":["15.33"],"this":["15.33","22.43"],"initiates":["15.37"],"proportion":["15.38","15.40"],"amount":["15.39"],"proxying":["15.41"],"quickly":["15.43"],"description":["16.1","17.1","18.1","19.2","19.3","19.5","19.6"],"control":["17.1","22.32"],"first":["19.1"],"need":["19.1"],"open":["19.1"],"buttons":["19.2"],"selection":["19.3","22.33"],"lists":["19.3","19.4"],"nested":["19.4"],"button":["19.5"],"range":["19.6"],"slider":["19.6"],"usage":["20.0"],"group":["20.1","20.2","20.3","20.4","20.5","23.1","23.2","23.3","23.4","23.5","24.2","24.3"],"bash":["20.2","23.2","24.2","24.3"],"index":["20.3","23.3","24.18"],"head":["20.3"],"jsx":["20.5","20.8","23.5","23.8"],"import":["20.5","21.4","23.5","23.9","25.4"],"from":["20.5","21.4","23.5","25.4"],"useeffect":["20.5","23.5"],"useref":["20.5"],"also":["20.9"],"use":["20.9","22.27","22.47"],"sometimes":["20.10"],"your":["20.10"],"files":["20.10","21.2"],"may":["20.10"],"lose":["20.10"],"typescript":["20.10","23.10"],"hints":["20.10"],"browsers":["20.11"],"production":["20.11"],"build":["20.11"],"supports":["20.11"],"latest":["20.11"],"major":["20.11"],"module":["20.12","23.12"],"tip":["20.12","23.12"],"esm":["20.12","23.12"],"demo":["20.12","23.12"],"https":["20.12","23.12"],"org":["20.12","23.12"],"useragent":["20.13","23.13"],"currently":["20.13"],"detection":["20.13"],"device":["20.13"],"danger":["21.0","25.0"],"due":["21.0"],"increasing":["21.0"],"languages":["21.1","21.2","21.4"],"language":["21.2","21.3","22.42","26.42"],"bundling":["21.2"],"located":["21.2"],"at":["21.2"],"i18n":["21.2","25.2"],"zhtw":["21.4","25.4"],"where":["22.1"],"source":["22.2"],"unique":["22.3"],"undefined":["22.4","22.51","26.4","26.51"],"constructor":["22.4"],"accepts":["22.4"],"as":["22.4"],"second":["22.4"],"which":["22.4"],"f00":["22.6","26.6"],"false":["22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.20","22.23","22.24","22.25","22.26","22.27","22.38","22.44","22.46","22.47","22.48","22.49","26.10","26.11","26.12","26.14","26.15","26.16","26.17","26.25","26.27","26.38","26.44","26.47","26.49"],"by":["22.11"],"true":["22.19","22.21","22.22","22.28","22.45","26.19","26.22"],"hotkeys":["22.19"],"if":["22.21"],"blur":["22.22"],"timing":["22.25"],"mini":["22.26"],"ssr":["22.27","26.27"],"initialize":["22.29","22.30","22.31","22.32","22.35"],"bottom":["22.32"],"preview":["22.36"],"bar":["22.36"],"supported":["22.37"],"formats":["22.37"],"vtt":["22.37","26.37"],"srt":["22.37","26.37"],"preload":["22.38"],"metadata":["22.38"],"replace":["22.39"],"specify":["22.40"],"format":["22.40"],"needs":["22.40"],"be":["22.40","22.43"],"matches":["22.41"],"based":["22.41"],"navigator":["22.42","26.42"],"configuration":["22.43"],"will":["22.43"],"deeply":["22.43"],"merged":["22.43"],"automatic":["22.47"],"导入":["23.6"],"你也可以使用选项的类型":["23.9"],"ts":["23.9"],"有时你的":["23.10"],"文件会丢失":["23.10"],"的类型提示":["23.10"],"这时候你可以手动导入类型":["23.10"],"生产构建的":["23.11"],"只兼容最新一个主版本的":["23.11"],"chrome":["23.11"],"last":["23.11"],"目前对于是否移动设备的判断并不准确":["23.13"],"有时候希望通过改变":["23.13"],"来调整播放器的ui":["23.13"],"查看完整演示":["24.1"],"jsdelivr":["24.3"],"每一个弹幕是一个对象":["24.4"],"多个弹幕组成的数组就是弹幕库":["24.4"],"通常只需要":["24.4"],"text":["24.4"],"只有":["24.5"],"danmuku":["24.5","24.18"],"是必须的参数":["24.5"],"其余都是非必填":["24.5"],"弹幕数据":["24.5"],"speed":["24.5"],"弹幕持续时间":["24.5"],"范围在":["24.5"],"margin":["24.5"],"来自用户输入的弹幕":["24.6"],"beforeemit":["24.6"],"filter":["24.6"],"beforevisible":["24.6"],"artplayerplugindanmuku":["24.6"],"visible":["24.6"],"来自服务器的弹幕":["24.6"],"xml":["24.8"],"弹幕":["24.8"],"文件":["24.8"],"data":["24.9","24.11","24.12","24.13","24.14","24.18"],"通过方法":["24.10","24.12","24.13"],"进行隐藏或者显示弹幕":["24.10"],"通过属性":["24.11"],"判断当前弹幕是隐藏或者显示":["24.11"],"发送一条实时弹幕":["24.12"],"libs":["24.12","24.13","24.14","24.18"],"实时改变弹幕配置":["24.13"],"uncompiled":["24.13","24.14","24.18"],"通过":["24.14"],"方法可以重载弹幕库":["24.14"],"或者切换新弹幕库":["24.14"],"或者追加新的弹幕库":["24.14"],"用于清空当前显示的弹幕":["24.15"],"在初始化弹幕插件的时候":["24.16"],"是可以指定弹幕发射器的挂载位置的":["24.16"],"默认是挂载在控制栏的中部":["24.16"],"你也可以把它挂载在播放器以外的地方":["24.16"],"当播放器全屏的时候":["24.16"],"发射器会自动回到控制栏的中部":["24.16"],"假如你挂载的地方是亮色的话":["24.16"],"建议把":["24.16"],"用于获取当前弹幕配置":["24.17"],"鉴于捆绑的多国语言越来越多":["25.0"],"从":["25.0"],"默认语言有":["25.1"],"en":["25.1"],"zh":["25.1"],"打包前的语言文件存放于":["25.2"],"欢迎来添加你的语言":["25.2"],"打包后的语言文件存放于":["25.2"],"dist":["25.2"],"播放器挂载的":["26.1"],"视频源地址":["26.2"],"播放器的唯一标识":["26.3"],"构造函数接受一个函数作为第二个参数":["26.4"],"播放器初始化成功且视频可以播放时触发":["26.4"],"ready":["26.4"],"视频的海报":["26.5"],"是否自动播放":["26.10"],"是否使用快捷键":["26.19"],"是否开启播放器":["26.22"],"字幕时间偏移":["26.25"],"是否使用":["26.27"],"初始化自定义的":["26.29","26.30","26.31","26.35"],"层":["26.29"],"设置面板":["26.30"],"右键菜单":["26.31"],"初始化自定义的底部":["26.32"],"控制栏":["26.32"],"是否在底部控制栏里显示":["26.33"],"画质选择":["26.33"],"列表":["26.33"],"在进度条上显示":["26.34"],"高亮信息":["26.34"],"插件":["26.35"],"在进度条上设置":["26.36"],"预览图":["26.36"],"设置视频的字幕":["26.37"],"支持字幕格式":["26.37"],"ass":["26.37"],"用于替换默认图标":["26.39"],"支持":["26.39"],"用于指明视频的格式":["26.40"],"需要配合":["26.40"],"customtype":["26.40"],"通过视频的":["26.41"],"自定义":["26.43"],"配置":["26.43"],"该配置会和自带的":["26.43"],"进行深度合并":["26.43"],"新增你的语言":["26.43"],"是否使用自动":["26.47"],"回放功能":["26.47"],"用于改变内置的css变量":["26.50"]},{"0":["3.25","3.26","5.9","13.28","21.0","24.5","25.0"],"1":["3.26","3.28","5.9","5.38","5.40","13.28","20.11","21.0","23.10","25.0"],"2":["3.28","20.8","20.12","23.8","23.12","23.13"],"3":["3.23","13.29","20.9","22.2","23.10","26.2"],"4":["6.2","13.29","16.2","21.3","22.47","23.13","26.43"],"5":["3.12","3.14","3.25","3.27","13.28","20.12","21.0","22.29","22.30","23.12","23.13","25.0","26.29","26.30"],"6":["2.0","6.3","7.3","12.0","16.3","17.3","20.12","23.12"],"7":["26.7"],"9":["3.29","9.7","19.7","21.3","26.43"],"10":["2.2","3.11","7.2","17.2"],"11":["2.28"],"13":["6.2","6.3","16.2","16.3"],"14":["9.7","19.7"],"15":["14.0"],"16":["3.29","13.29"],"19":["5.45"],"21":["6.4","6.5","7.3","7.4","8.4","16.4","16.5","17.3","17.4","18.4"],"22":["8.2","8.3","9.8","18.2","18.3","19.8"],"23":["22.29","26.29"],"24":["6.5","16.5"],"25":["3.28","24.5"],"29":["5.45","8.5","18.5"],"34":["22.30","26.30"],"35":["3.7"],"40":["7.5","17.5"],"50":["3.10"],"75":["13.28"],"200":["3.6","3.8","3.9","3.21"],"300":["3.17"],"1000":["3.15","3.22","3.24"],"2000":["3.4"],"3000":["3.13","3.16"],"code":["0.1","0.2","0.4","0.5","0.6","0.7","0.13","0.14","0.15","0.16","0.17","1.1","1.6","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.3","3.5","3.6","3.7","3.17","3.29","3.30","5.1","5.2","5.3","5.12","5.14","5.16","5.17","5.20","5.21","5.22","5.23","5.25","5.27","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.44","5.45","5.46","9.3","10.1","10.2","10.5","12.0","12.20","12.28","12.29","12.30","12.31","15.2","15.12","15.16","15.20","15.22","15.37","15.44","15.45","19.3","22.1","22.10","22.19","22.30","22.31","22.32","22.35","22.43","22.47","24.10","24.16","25.2","26.1","26.4","26.10","26.19","26.30","26.31","26.32","26.35","26.39","26.43","26.47","26.50"],"js":["0.2","0.4","0.14","0.17","2.2","2.18","2.22","2.24","2.28","2.29","2.30","2.31","5.45","6.2","6.3","6.4","7.4","8.4","9.3","9.6","9.7","10.2","12.0","15.16","16.2","16.3","16.4","17.4","18.4","19.3","19.7","21.3","22.2","22.10","22.19","22.29","22.30","22.47","24.4","24.6","24.11","24.12","24.13","24.14","25.1","26.2","26.4","26.29","26.30","26.32","26.43"],"var":["0.2","0.4","2.0","4.0","5.45","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.3","9.7","9.8","9.9","10.2","12.0","14.0","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.3","19.4","19.7","19.8","19.9","21.3","21.4","22.2","22.29","22.30","24.13","24.14","24.18","25.3","25.4","26.2","26.29","26.30"],"proxy":["0.3"],"方法用于代理":["0.3"],"hover":["0.3"],"方法用于代理自定义的":["0.3"],"div":["0.3","0.6","0.8","0.9","0.10","0.13","0.15","0.16","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","2.41","3.1","3.2","3.4","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.17","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.29","3.30","3.32","3.33","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.15","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.27","5.30","5.31","5.32","5.34","5.35","5.36","5.39","5.41","5.43","5.44","5.46","5.47","9.1","9.3","10.5","12.0","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.16","12.17","12.18","12.19","12.20","12.22","12.24","12.26","12.27","12.28","12.29","12.30","12.31","12.33","12.34","12.38","12.39","12.40","12.41","15.1","15.2","15.3","15.12","15.16","15.20","15.22","15.28","15.33","15.37","15.44","15.45","15.46","15.47","19.3","20.4","22.1","22.7","22.10","22.19","22.31","22.32","22.35","22.39","22.43","22.47","23.4","24.8","24.16","26.1","26.3","26.4","26.5","26.7","26.8","26.9","26.10","26.13","26.17","26.19","26.21","26.26","26.35","26.39","26.43","26.45","26.46","26.47","26.50"],"classname":["0.4","0.5","0.6","0.7","0.8","0.9","0.10","0.13","0.14","0.15","0.16","1.1","1.2","1.3","1.4","1.5","1.6","1.7","1.8","1.9","1.10","1.12","2.41","3.1","3.2","3.3","3.4","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.16","3.17","3.18","3.19","3.20","3.22","3.23","3.26","3.27","3.29","3.30","3.32","3.33","5.1","5.2","5.3","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.27","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.43","5.44","5.46","5.47","9.1","9.3","10.1","10.5","12.0","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.17","12.18","12.20","12.22","12.24","12.26","12.28","12.29","12.30","12.31","12.40","12.41","15.1","15.2","15.3","15.12","15.16","15.20","15.22","15.28","15.33","15.37","15.44","15.45","15.46","19.3","22.1","22.7","22.10","22.19","22.31","22.32","22.35","22.43","22.47","24.8","24.10","24.16","26.1","26.3","26.4","26.5","26.7","26.9","26.10","26.13","26.17","26.19","26.31","26.32","26.35","26.39","26.43","26.45","26.46","26.47","26.50"],"run":["0.4","0.5","0.6","0.7","0.10","0.13","0.14","0.15","0.16","0.17","1.1","1.6","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.3","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.17","3.22","3.29","3.30","3.32","5.1","5.2","5.3","5.8","5.10","5.12","5.14","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.25","5.27","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.44","5.46","5.47","9.1","9.3","10.1","10.2","10.5","12.0","12.2","12.6","12.7","12.8","12.10","12.20","12.22","12.28","12.29","12.30","12.31","15.1","15.2","15.3","15.12","15.16","15.20","15.22","15.28","15.37","15.44","15.45","19.3","22.1","22.7","22.10","22.19","22.30","22.31","22.32","22.35","22.43","22.47","24.8","24.10","24.16","26.1","26.4","26.5","26.7","26.10","26.19","26.31","26.32","26.35","26.39","26.43","26.47","26.50"],"art":["0.4","0.12","2.0","5.11","5.13","5.45","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.2","8.3","8.5","9.3","9.4","9.7","9.8","9.9","10.2","12.0","14.0","15.11","15.13","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.2","18.3","18.5","19.3","19.4","19.7","19.8","19.9","22.2","23.10","24.14","24.18","25.3","25.4","26.2"],"new":["0.4","2.0","4.0","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.3","9.3","9.4","9.7","9.8","9.9","10.2","12.0","14.0","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.3","19.4","19.7","19.8","19.9","22.2","24.14","24.18","25.3","26.2"],"artplayer":["0.4","2.0","4.0","5.5","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.4","9.8","9.9","12.0","14.0","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.4","19.8","19.9","20.3","21.4","22.2","23.3","23.4","23.6","23.9","23.10","24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17","26.2"],"container":["0.4","2.0","4.0","6.4","6.5","7.3","7.5","9.3","9.4","9.8","9.9","12.0","14.0","16.4","16.5","17.3","17.5","19.4","19.8","19.9","20.4","20.5","22.2","22.11","23.5","24.18","26.11"],"方法用于更新":["0.6"],"对象":["0.6"],"方法用于动态更新层":["0.8"],"show":["0.8","0.9","0.10","0.12","0.16","10.7"],"属性用于设置是否显示全部层":["0.8"],"toggle":["0.8","0.9","0.10","0.16","22.18"],"方法用于切换是否显示全部层":["0.8"],"方法用于动态更新控制器":["0.9"],"属性用于设置是否显示全部控制器":["0.9"],"方法用于切换是否显示全部控制器":["0.9"],"属性用于设置是否显示全部菜单":["0.10"],"方法用于切换是否显示全部菜单":["0.10"],"方法设置当前字幕地址和选项":["0.11"],"texttrack":["0.11"],"获取当前字幕轨":["0.11"],"activecues":["0.11"],"获取当前活跃的字幕列表":["0.11"],"cues":["0.11"],"通过":["0.12"],"控制面板的显示与隐藏":["0.12"],"触发的事件名为":["0.12"],"属性用于切换是否显示加载层":["0.13"],"属性用于切换是否显示遮罩层":["0.15"],"属性用于设置是否显示全部设置项":["0.16"],"方法用于切换是否显示全部设置项":["0.16"],"字符串":["1.11"],"app":["2.0","4.0","7.2","7.5","9.3","9.4","9.8","9.9","12.0","14.0","17.2","17.5","19.4","19.8","19.9","22.2","24.18"],"url":["2.0","4.0","5.11","7.2","7.5","9.4","9.9","12.0","14.0","15.11","15.13","17.2","17.5","19.4","19.9","22.36","22.37","24.18","26.36","26.37"],"assets":["2.0","4.0","7.2","8.2","8.3","8.4","8.5","9.4","9.9","12.0","14.0","17.2","18.2","18.3","18.4","18.5","19.4","19.9","22.2","22.29","24.18","26.29"],"sample":["2.0","4.0","7.2","8.2","8.3","8.4","8.5","9.4","9.9","12.0","14.0","17.2","18.2","18.3","18.4","18.5","19.4","19.9","22.29","24.18","26.29"],"mp4":["2.0","4.0","7.2","12.0","14.0","17.2","24.18"],"on":["2.0","4.0","12.5","12.16","14.0","19.6","22.21","22.45"],"canplay":["2.0"],"事件":["2.41"],"浏览器可以播放媒体文件了":["2.42"],"浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束":["2.43"],"offlineaudiocontext":["2.44","12.44"],"duration":["2.45","13.12","13.13"],"媒体内容变为空":["2.46"],"例如":["2.46"],"视频停止播放":["2.47"],"获取媒体数据时出错":["2.48"],"media":["2.49","12.59","13.34"],"已加载元数据":["2.50"],"播放已暂停":["2.51"],"播放已开始":["2.52"],"由于缺乏数据而暂停或延迟后":["2.53"],"在浏览器加载资源时周期性触发":["2.54"],"播放速率发生变化":["2.55"],"跳帧":["2.56","2.57"],"用户代理":["2.58"],"媒体数据加载已暂停":["2.59"],"currenttime":["2.60"],"音量发生变化":["2.61"],"由于暂时缺少数据":["2.62"],"可以打印出视频全部的内置事件":["3.1"],"默认关闭":["3.1"],"默认为":["3.4","3.8","3.9","3.10","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.27","3.31","3.34","5.4"],"单位为毫秒":["3.15","3.21","3.24"],"true":["3.18","3.19","3.31","3.32","3.34","5.4","26.21","26.28","26.45"],"false":["3.20","3.33","13.33","26.8","26.9","26.13","26.18","26.20","26.23","26.24","26.26","26.46","26.48"],"是否把播放器挂在在":["3.31"],"元素下":["3.31"],"目前主要用于进度条的平滑效果":["3.33"],"属性并调用":["3.34"],"load":["3.34","5.5","13.34","15.5"],"以主动释放媒体资源":["3.34"],"开启后可以在单页应用或频繁创建":["3.34"],"销毁播放器的场景下":["3.34"],"dosomething":["4.0","14.0"],"video":["4.0","5.34","5.38","5.40","7.2","9.4","9.9","10.12","12.11","14.0","15.1","15.2","15.7","15.8","15.9","15.10","15.14","15.15","15.17","15.23","15.25","15.27","15.33","15.34","15.35","15.38","15.40","17.2","19.4","19.9","22.4","22.13","22.14","22.15","22.16","22.17","24.18","26.41"],"plugins":["4.0"],"ready":["4.0","12.53","14.0","22.4"],"可以在实例化之后再加载插件的函数":["4.0"],"销毁播放器":["5.4"],"接受一个参数表示是否销毁后同时移除播放器的":["5.4"],"html":["5.4","20.12","22.39","23.12","26.27","26.33"],"常用于在单页应用中手动释放媒体资源或重新初始化视频标签":["5.5"],"注意":["5.5"],"全局配置":["5.5"],"remove":["5.5","10.8","10.9","10.10","10.14","10.16"],"视频时间跳转":["5.6"],"单位秒":["5.6","5.7","5.8","26.34"],"视频时间快进":["5.7"],"视频时间快退":["5.8"],"设置和获取视频音量":["5.9"],"范围在":["5.9","26.25"],"string":["5.10","6.1","7.1","8.1","11.11","16.1","17.1","18.1","22.36","22.37","26.33","26.34","26.36","26.37"],"设置和获取视频地址":["5.10"],"类似":["5.11","5.12","5.13","5.15","5.42"],"但会执行一些优化操作":["5.11","5.12"],"switchurl":["5.13","15.13"],"但会带上之前的播放进度":["5.13"],"设置和获取视频是否静音":["5.14"],"设置和获取视频当前时间":["5.15"],"设置时间时和":["5.15"],"seek":["5.15"],"但它不会触发额外的事件":["5.15"],"返回的是一个":["5.18","5.19"],"promise":["5.18","5.19"],"设置和获取播放器窗口全屏":["5.20"],"设置和获取播放器网页全屏":["5.21"],"设置和获取播放器画中画模式":["5.22"],"只有在视频播放前才能看到海报效果":["5.23"],"boolean":["5.24","6.1","8.1","9.5","19.5","26.33"],"设置和获取播放器迷你模式":["5.24"],"获取视频是否正在播放中":["5.25"],"支持":["5.26","5.30"],"standard":["5.26","15.26"],"正常":["5.26"],"mini":["5.26","22.12"],"迷你窗":["5.26"],"pip":["5.26"],"type":["5.29","20.9","23.9","23.10"],"getter":["5.29"],"这些属性是对":["5.29"],"rect":["5.29","15.29"],"的快捷访问":["5.29"],"设置和获取播放器翻转":["5.30"],"normal":["5.30","13.30"],"horizontal":["5.30","13.30"],"vertical":["5.30"],"设置和获取播放器播放速度":["5.31"],"设置和获取播放器长宽比":["5.32"],"元素的属性":["5.34"],"动态获取和设置视频类型":["5.35"],"动态获取和设置播放器主题颜色":["5.36"],"常配合":["5.38","5.40"],"timeupdate":["5.38","5.40"],"事件使用":["5.38","5.40"],"通常与":["5.39"],"loaded":["5.39"],"一起使用":["5.39","26.40"],"用于展示缓冲进度细节":["5.39"],"和":["5.41","26.6","26.14","26.15","26.16"],"removeeventlistener":["5.41","15.41"],"当使用":["5.41"],"来处理事件":["5.41"],"播放器销毁时也会自动销毁该事件":["5.41"],"document":["5.42","12.41","15.42"],"queryselector":["5.42","15.42"],"但被查询的对象局限于当前播放器内":["5.42"],"可以避免同类名的错误":["5.42"],"元素":["5.43"],"动态设置缩略图":["5.46"],"number":["5.47","9.2","9.3","19.3","22.34","22.36","26.34","26.36"],"动态设置字幕偏移":["5.47"],"是否禁用组件":["6.1","7.1","8.1"],"name":["6.1","7.1","7.2","8.1","14.0","16.1","17.1","17.2","18.1","22.37","26.37"],"组件唯一名称":["7.1"],"用于标记类名":["7.1"],"index":["7.1","7.2","17.1","17.2","24.6","24.9","24.11","24.12","24.13","24.14"],"controls":["7.2","17.2"],"your":["7.2","17.2","21.2","22.43"],"button":["7.2","17.2","22.18","22.44","22.49"],"img":["8.2","8.3","8.4","8.5","18.2","18.3","18.4","18.5","22.29","26.29"],"layer":["8.2","8.3","8.4","8.5","10.8","12.35","12.36","18.2","18.3","18.4","18.5"],"png":["8.2","8.3","8.5","18.2","18.3","18.5"],"aspectratio":["9.1"],"subtitleoffset":["9.1"],"icon":["9.2","19.2","19.5"],"元素的图标":["9.2","9.5","9.6"],"onclick":["9.2","19.2"],"function":["9.2","9.5","9.6","11.8","11.9","11.10","14.0","19.2","19.6","20.5","23.5","24.6"],"元素点击事件":["9.2"],"width":["9.2","19.3"],"列表宽度":["9.3"],"tooltip":["9.3","9.5","9.6","19.3"],"提示文本":["9.3","9.6"],"switch":["9.5","19.5"],"按钮默认状态":["9.5"],"onswitch":["9.5"],"按钮切换事件":["9.5"],"range":["9.6","15.9","22.25"],"array":["9.6","19.6"],"默认状态数组":["9.6"],"onrange":["9.6","19.6"],"完成时触发的事件":["9.6"],"onchange":["9.6"],"变化时触发的事件":["9.6"],"here":["10.0"],"following":["10.3"],"methods":["10.3"],"to":["10.3","10.13","10.14","10.15","13.0","15.5","15.6","15.11","15.13","15.29","15.41","15.42","16.1","18.1","20.13","21.2","22.4","22.9","22.13","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.28","22.38","22.41","22.44","22.45","22.46","22.48","22.49"],"handle":["10.3","15.41"],"event":["10.3","13.8","13.9","13.10","15.41","19.2","19.3","19.6"],"will":["10.3"],"be":["10.3","11.1"],"automatically":["10.3","12.19","15.33","15.41","22.38"],"destroyed":["10.3","12.6"],"is":["10.3","10.13","10.15","12.1","12.3","12.5","12.6","12.9","12.10","12.32","12.34","12.35","12.36","12.37","12.39","12.53","13.3","13.5","13.28","13.29","13.30","15.14","15.23","15.25","15.41","22.1","22.4","22.40"],"a":["10.4","10.7","10.8","10.9","12.26","12.27","12.56","12.57","13.15","15.4","15.6","15.18","15.19","22.44","22.46","22.51"],"value":["10.4","10.6"],"get":["10.4","15.9","15.10"],"del":["10.4"],"the":["10.5","12.5","12.11","12.28","12.41","12.49","12.55","12.60","12.61","13.0","13.21","13.23","13.25","13.31","13.32","15.7","15.8","15.9","15.10","15.14","15.15","15.17","15.21","15.23","15.24","15.25","15.26","15.27","15.30","15.31","15.32","15.34","15.35","15.36","15.41","15.42","15.43","16.1","18.1","19.1","20.10","22.14","22.15","22.16","22.17","22.18","22.20","22.21","22.23","22.24","22.42","22.43","22.48","22.49"],"player":["10.5","11.6","12.5","12.12","12.13","12.28","13.2","13.31","13.32","13.34","15.4","15.20","15.21","15.22","15.24","15.26","15.30","15.31","15.32","15.36","15.43","20.5","22.1","22.3","22.4","22.6","22.7","22.11","22.12","22.22","22.23","22.24","22.48","23.5"],"an":["10.6","15.17"],"update":["10.6","10.10","10.16"],"has":["10.7","12.47","15.38","15.39","15.40"],"property":["10.7","10.13","10.15","11.1","15.33","22.33","22.34","22.36","22.37"],"for":["10.7","10.17","11.6","11.7","11.8","11.10","11.12","12.1","12.46","13.4","13.10","13.11","13.12","13.13","13.15","13.16","13.17","13.21","13.22","13.23","13.24","13.25","13.26","13.27","17.1","20.11","22.3","22.22"],"displaying":["10.7"],"control":["10.9","22.17","22.33"],"items":["10.10","10.16","13.6","13.7"],"returns":["10.11"],"current":["10.11","10.12","15.5","15.15","15.17","15.18","15.19","15.26"],"style":["10.11"],"method":["10.11","10.17"],"of":["10.11","10.12","11.2","11.3","11.4","13.14","15.15","15.17","15.18","15.19","15.34","20.11","22.7"],"status":["10.12"],"and":["10.12","12.2","15.3","15.5","15.9","15.10","15.14","15.21","15.24","15.28","15.30","15.31","15.32","15.33","15.34","15.35","15.36","15.41","20.12","22.4","22.39","22.41"],"such":["10.12","20.10","22.22"],"as":["10.12","22.22"],"used":["10.13","10.14","10.15","15.5"],"set":["10.13","10.15","15.10","15.33","15.46","15.47"],"whether":["10.13","10.15","13.19","13.20","15.4","15.14","15.25","22.9","22.13","22.28"],"display":["10.13","10.15","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.42","22.44","22.49"],"hotkeys":["10.14"],"only":["10.17","15.23","22.5","22.26"],"add":["10.17","21.2","22.43","22.46"],"dynamically":["10.17","15.46","15.47"],"adding":["10.17"],"refer":["11.0","13.0"],"this":["11.1"],"can":["11.1","12.42","13.1","15.33","20.10","20.11","22.51"],"useful":["11.1","22.27"],"information":["11.2","13.22","15.28"],"environment":["11.3"],"variables":["11.3","15.44","22.50"],"time":["11.4","12.27","12.60","15.6","15.7","15.8","15.15","22.34","26.34"],"default":["11.5","11.12","13.3","13.8","13.9","13.17","13.26","13.28","13.29","13.30","19.5","19.6","20.5","23.5"],"configuration":["11.5"],"utility":["11.6","11.10"],"functions":["11.6"],"validation":["11.7","11.9"],"schema":["11.7"],"constructor":["11.8"],"required":["11.11"],"options":["11.12"],"first":["12.1"],"becomes":["12.2"],"playable":["12.2"],"paused":["12.3"],"starts":["12.4"],"playing":["12.4","12.42"],"pressed":["12.5"],"gains":["12.7"],"loses":["12.8"],"focus":["12.8"],"double":["12.9","13.17","13.18","13.19"],"clicked":["12.9","12.10"],"while":["12.11"],"loading":["12.11"],"or":["12.12","12.15","12.21","12.23","12.24","12.25","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39"],"leaves":["12.12","12.15"],"moves":["12.13"],"over":["12.13"],"s":["12.14","15.20","15.21","15.22","15.26","15.31","15.32","15.36","15.43","22.6","22.11","22.41"],"dimensions":["12.14","15.28","22.11"],"change":["12.14"],"enters":["12.15","22.12"],"viewport":["12.15"],"changes":["12.16","12.17","12.40"],"mobile":["12.16"],"devices":["12.16"],"aspect":["12.17","15.32","22.16"],"ratio":["12.17","22.16"],"adjusts":["12.18","12.19","22.38"],"its":["12.18","12.19","15.27"],"height":["12.18","15.33"],"size":["12.19","15.27","22.11"],"flipped":["12.20"],"exits":["12.21","12.23","12.24","12.25"],"window":["12.21","15.20","22.23"],"mode":["12.21","12.23","12.24","13.18","15.22","22.8","22.12","22.27","22.28","24.5"],"error":["12.22"],"occurs":["12.22"],"web":["12.23","15.21"],"fullscreen":["12.23","22.48"],"picture":["12.25","15.22","22.20"],"in":["12.25","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.16","13.21","13.22","13.24","13.27","15.6","15.8","15.22","15.39","22.17","22.20","22.33","22.38","22.40","22.43","22.50"],"captures":["12.26"],"performs":["12.27","15.12"],"panel":["12.32","13.5","13.6","13.7","13.22","19.1"],"shown":["12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39"],"hidden":["12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39"],"are":["12.33","12.38","21.1"],"menu":["12.37","13.3","22.31"],"state":["12.40","15.20","15.30","19.5","19.6"],"from":["12.41","15.38","15.40","20.12","21.0","23.9","25.2"],"start":["12.42"],"browser":["12.43"],"estimates":["12.43"],"triggered":["12.45","19.6","22.4"],"become":["12.46"],"empty":["12.46"],"example":["12.46"],"playback":["12.47","12.51","12.52","12.62","15.15","15.31","22.15"],"occurred":["12.48"],"metadata":["12.50","26.38"],"periodically":["12.54"],"user":["12.58"],"agent":["12.58"],"top":["13.0"],"which":["13.1","22.5","22.8"],"print":["13.1","13.32"],"all":["13.1"],"built":["13.1","22.43","22.50"],"context":["13.3"],"notification":["13.4"],"messages":["13.4"],"milliseconds":["13.4","13.8","13.9","13.16","13.17","13.21","13.22","13.24"],"settings":["13.5","13.6","13.7","19.1"],"pixels":["13.5","13.10"],"view":["13.10"],"count":["13.11"],"feature":["13.12","13.13","22.47"],"automatic":["13.14","13.15"],"reconnection":["13.14","13.15"],"attempts":["13.14"],"when":["13.14","13.15","13.25","15.11","15.12","15.41","22.4","22.5","22.12","22.22"],"connection":["13.15"],"auto":["13.16","22.38"],"hiding":["13.16"],"click":["13.17","13.18","13.19","19.2","19.3"],"events":["13.17","22.45"],"toggles":["13.18","13.19","13.20"],"single":["13.20"],"delay":["13.21","13.24"],"speed":["13.23","13.25"],"multiplier":["13.23","13.25"],"activating":["13.24"],"seeking":["13.25"],"keyboard":["13.26","13.27"],"shortcuts":["13.26","13.27"],"seconds":["13.27","15.8","15.39"],"rates":["13.28"],"ratios":["13.29"],"modes":["13.30"],"mount":["13.31","22.27"],"under":["13.31"],"defaults":["13.32","13.33","13.34"],"requestanimationframe":["13.33"],"currently":["13.33","15.25","22.3","22.6","22.42"],"mainly":["13.33"],"call":["13.34"],"actively":["13.34"],"release":["13.34","15.5"],"resources":["13.34","21.0"],"destroying":["13.34"],"myplugin":["14.0"],"console":["14.0"],"info":["14.0"],"return":["14.0","22.51"],"something":["14.0"],"pause":["15.3"],"accepts":["15.4"],"indicating":["15.4"],"src":["15.5"],"calls":["15.5"],"once":["15.5"],"commonly":["15.5"],"manually":["15.5","20.10"],"specific":["15.6"],"fast":["15.7"],"similar":["15.11","15.13","15.42"],"setting":["15.11","15.12","15.15"],"but":["15.12","15.13","15.42"],"some":["15.12"],"optimization":["15.12"],"operations":["15.12"],"quality":["15.13"],"gets":["15.14","15.21","15.24","15.30","15.31","15.32","15.35","15.36"],"frame":["15.17"],"screenshot":["15.18","15.19"],"effect":["15.23","22.22"],"sets":["15.24","15.34","15.35","15.36"],"supported":["15.26","15.30"],"values":["15.26"],"adapts":["15.27"],"coordinate":["15.28"],"these":["15.29"],"properties":["15.29"],"provide":["15.29"],"shortcut":["15.29"],"access":["15.29"],"calculate":["15.33"],"attributes":["15.34"],"element":["15.34"],"that":["15.38","15.39","15.40","22.26"],"been":["15.38","15.39","15.40"],"buffered":["15.38","15.39"],"ranging":["15.38","15.40"],"using":["15.41"],"search":["15.42"],"css":["15.44","17.1","22.50"],"available":["15.45"],"levels":["15.45"],"subtitle":["15.47"],"offset":["15.47","22.25"],"component":["16.1","18.1"],"unique":["16.1","17.1","18.1"],"class":["17.1"],"identification":["17.1"],"it":["19.1","22.38"],"comes":["19.1"],"with":["19.1","22.40","22.43"],"four":["19.1"],"text":["19.3","26.34"],"item":["19.5"],"bash":["20.1","23.1"],"npm":["20.1","23.1","24.2"],"jsdelivr":["20.2","23.2"],"net":["20.2","23.2","24.3"],"https":["20.2","23.2","24.3"],"title":["20.3","23.3"],"demo":["20.3"],"meta":["20.3"],"charset":["20.3"],"utf":["20.3"],"template":["20.4","23.4"],"ref":["20.4"],"export":["20.5","23.5"],"option":["20.5","23.5"],"getinstance":["20.5","23.5"],"rest":["20.5","23.5"],"const":["20.5","23.5"],"d":["20.6"],"import":["20.8","20.9","20.10","23.8","23.10","25.2"],"ts":["20.9","26.40"],"cases":["20.10"],"you":["20.10","20.11","20.13","22.27"],"types":["20.10"],"variable":["20.10"],"version":["20.11","21.0","23.11"],"chrome":["20.11"],"last":["20.11"],"starting":["20.12","21.0"],"not":["20.13"],"entirely":["20.13"],"accurate":["20.13"],"sometimes":["20.13"],"may":["20.13"],"want":["20.13","22.27"],"adjust":["20.13"],"bundled":["21.0"],"multilingual":["21.0"],"en":["21.1","26.42"],"zh":["21.1","21.4","25.4","26.42"],"cn":["21.1","25.1"],"contributions":["21.2"],"welcome":["21.2"],"after":["21.2"],"i18n":["21.4","25.4"],"tw":["21.4","25.4"],"mounted":["22.1"],"identifier":["22.3"],"successfully":["22.4"],"initialized":["22.4"],"play":["22.4"],"image":["22.5","22.36"],"appears":["22.5","22.25","22.26"],"color":["22.6","24.5"],"live":["22.8"],"streaming":["22.8"],"hides":["22.8"],"mute":["22.9"],"by":["22.9","22.40"],"fill":["22.11"],"entire":["22.11"],"enable":["22.13","22.45"],"functionality":["22.14","22.17"],"rate":["22.15"],"bottom":["22.17","22.33"],"multiple":["22.21"],"players":["22.21"],"exist":["22.21"],"simultaneously":["22.21"],"ui":["22.22","26.22"],"enabled":["22.22"],"overlays":["22.22"],"webpage":["22.24"],"within":["22.25"],"5s":["22.25","26.25"],"progress":["22.26","22.34"],"bar":["22.26","22.32","22.33","22.34"],"if":["22.27"],"pre":["22.27"],"render":["22.27"],"use":["22.28"],"list":["22.33"],"description":["22.33","22.34","22.36","22.37"],"thumbnail":["22.36"],"ass":["22.37"],"safari":["22.38","26.38"],"supports":["22.39"],"both":["22.39"],"strings":["22.39"],"htmlelement":["22.39","26.39"],"conjunction":["22.40"],"customtype":["22.40"],"determined":["22.40"],"suffix":["22.40"],"delegates":["22.41"],"decoding":["22.41"],"third":["22.41","22.51"],"tolowercase":["22.42","26.42"],"language":["22.43"],"long":["22.46"],"press":["22.46"],"rotate":["22.48"],"during":["22.48"],"modify":["22.50"],"party":["22.51"],"htmlcanvaselement":["22.51","26.51"],"head":["23.3"],"useref":["23.5"],"let":["23.10"],"null":["23.10"],"参数":["23.10"],"对于古老的浏览器":["23.11"],"可以使用":["23.11"],"legacy":["23.11"],"文件":["23.11"],"从":["23.12"],"开始":["23.12"],"所以在":["23.13"],"开始新增了一个":["23.13"],"install":["24.2"],"就可以发送一个弹幕":["24.4"],"其余都是非必要参数":["24.4"],"弹幕文本":["24.4"],"弹幕上下边距":["24.5"],"支持像素数字和百分比":["24.5"],"opacity":["24.5"],"弹幕透明度":["24.5"],"ffffff":["24.5"],"默认弹幕颜色":["24.5"],"可以被单独弹幕项覆盖":["24.5"],"data":["24.6","24.7","24.10","24.15","24.17"],"libs":["24.6","24.7","24.9","24.10","24.11","24.15","24.17"],"uncompiled":["24.6","24.7","24.9","24.10","24.11","24.12","24.15","24.17"],"plugin":["24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17"],"danmuku":["24.6","24.9","24.11","24.12","24.13","24.14","24.15","24.17"],"保存到数据库":["24.6"],"savedanmu":["24.6"],"bilibili":["24.8"],"网站的弹幕格式一致":["24.8"],"theme":["24.16"],"设置成":["24.16"],"light":["24.16"],"否则会看不清":["24.16"],"无需手动导入":["25.1"],"group":["25.2"],"id":["25.2"],"容器":["26.1"],"目前只用于记忆播放":["26.3"],"autoplayback":["26.3"],"事件一样":["26.4"],"只会出现在播放器初始化且未播放的状态下":["26.5"],"播放器主题颜色":["26.6"],"目前用于":["26.6"],"进度条":["26.6"],"播放器的默认音量":["26.7"],"使用直播模式":["26.8"],"会隐藏进度条和播放时间":["26.8"],"是否默认静音":["26.9"],"播放器的尺寸默认会填充整个":["26.11"],"容器尺寸":["26.11"],"所以经常出现黑边":["26.11"],"该值能自动调整播放器尺寸以隐藏黑边":["26.11"],"当播放器滚动到浏览器视口以外时":["26.12"],"自动进入":["26.12"],"迷你播放":["26.12"],"模式":["26.12","26.28"],"是否循环播放":["26.13"],"是否显示视频翻转功能":["26.14"],"目前只出现在":["26.14"],"设置面板":["26.14","26.15","26.16","26.18","26.22","26.25"],"右键菜单":["26.14","26.15","26.16","26.22"],"是否显示视频播放速度功能":["26.15"],"会出现在":["26.15","26.16"],"是否显示视频长宽比功能":["26.16"],"是否在底部控制栏里显示":["26.17","26.18","26.20"],"视频截图":["26.17"],"功能":["26.17"],"的开关按钮":["26.18","26.20"],"画中画":["26.20"],"假如页面里同时存在多个播放器":["26.21"],"是否只能让一个播放器播放":["26.21"],"的背景虚化效果":["26.22"],"开启后":["26.22"],"是否在底部控制栏里显示播放器":["26.23","26.24"],"窗口全屏":["26.23"],"按钮":["26.23","26.24","26.49"],"网页全屏":["26.24"],"出现在":["26.25"],"迷你进度条":["26.26"],"只在播放器失去焦点后且正在播放时出现":["26.26"],"挂载模式":["26.27"],"假如你希望在播放器挂载前":["26.27"],"就提前渲染好播放器所需的":["26.27"],"时有用":["26.27"],"你可以通过":["26.27"],"在移动端是否使用":["26.28"],"类型":["26.33"],"描述":["26.33","26.34","26.37"],"默认画质":["26.33"],"画质名字":["26.33"],"高亮时间":["26.34"],"高亮文本":["26.34"],"预览图地址":["26.36"],"预览图数量":["26.36"],"column":["26.36"],"字幕名字":["26.37"],"字幕地址":["26.37"],"字幕类型":["26.37"],"可选":["26.37"],"preload":["26.38"],"中会自动调整为":["26.38"],"字符串和":["26.39"],"默认视频的格式就是视频地址的后缀":["26.40"],"如":["26.40"],"m3u8":["26.40"],"mkv":["26.40"],"但有时候视频地地址没有正确的后缀":["26.40"],"进行匹配":["26.41"],"把视频解码权交给第三方程序进行处理":["26.41"],"处理的函数能接收三个参数":["26.41"],"视频":["26.41"],"dom":["26.41"],"默认显示语言":["26.42"],"目前支持":["26.42"],"是否在移动端显示一个":["26.44"],"锁定按钮":["26.44"],"用于隐藏底部":["26.44"],"控制栏":["26.44"],"是否在移动端启用视频元素上的手势事件":["26.45"],"是否在移动端添加长按视频快进功能":["26.46"],"是否在移动端的网页全屏时":["26.48"],"根据视频尺寸和视口尺寸":["26.48"],"旋转播放器":["26.48"],"是否显示":["26.49"],"当前只有部分浏览器支持该功能":["26.49"],"函数可以返回一个第三方的":["26.51"],"或者":["26.51"],"htmlvideoelement":["26.51"],"例如可以代理一个已经存在的":["26.51"]},{"0":["9.6","13.26","15.9","15.38","15.40"],"1":["9.6","13.26","15.9","15.38","15.40","19.6","20.10"],"2":["13.28","22.1","24.5","26.1"],"3":["13.23","20.7","20.10","23.7"],"4":["22.7","22.10","22.19","22.31","22.32","22.39","22.43","25.1","26.10","26.19","26.31","26.32","26.39","26.47","26.50"],"5":["9.6","13.12","13.27","19.6","22.47","26.47"],"6":["2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40"],"7":["2.19","2.21","2.23","2.25","2.26","5.16","5.28","5.33","15.16","15.28","15.33","22.4","26.4","26.39"],"8":["2.17","2.20","5.1","5.14","5.21","5.31","5.32","5.34","5.35","5.36","5.44","12.20","15.44","20.3"],"9":["2.29","2.30","2.31","5.12","5.20","5.22","5.23","5.37","12.29","12.30","12.31","13.29","15.12","15.20","15.22","15.37","22.4","22.43","26.4"],"10":["2.6","2.18","2.24","7.5","9.6","12.2","13.11","17.5","24.4"],"11":["5.2","5.3","5.21","5.33","12.28","15.2","15.33","23.11"],"12":["22.31","26.31"],"15":["22.35","26.35"],"16":["22.32","26.32"],"17":["4.0","14.0"],"19":["15.45"],"25":["13.28"],"29":["15.45"],"35":["13.7"],"50":["13.10"],"200":["13.6","13.8","13.9","13.21"],"250":["9.3","13.5","19.3"],"300":["13.17"],"1000":["13.22","24.6"],"2000":["13.4"],"3000":["13.13"],"是指挂载在":["0.0","1.0","5.0"],"js":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.13","0.15","0.16","1.1","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.3","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","3.30","5.1","5.2","5.3","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.25","5.27","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.41","5.44","5.46","5.47","9.1","9.5","10.1","10.5","10.6","10.14","12.2","12.6","12.17","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","15.1","15.2","15.3","15.12","15.20","15.22","15.28","15.33","15.37","15.44","15.45","15.46","19.6","21.0","22.1","22.4","22.7","22.31","22.32","22.35","22.39","22.43","24.7","24.9","24.10","24.15","24.16","24.17","25.0","26.1","26.7","26.10","26.19","26.31","26.34","26.35","26.39","26.47","26.50"],"var":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.13","0.14","0.15","0.16","0.17","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","5.2","5.3","5.12","5.14","5.16","5.20","5.22","5.23","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.44","5.46","9.5","10.1","10.5","10.6","10.14","12.22","12.28","12.29","12.30","12.31","15.12","15.16","15.20","15.22","15.33","15.44","15.45","22.1","22.7","22.10","22.19","22.31","22.32","22.43","22.47","24.6","24.9","24.10","24.11","24.12","25.1","25.2","26.1","26.4","26.10","26.19","26.31","26.32","26.39","26.43","26.47"],"art":["0.1","0.2","0.5","0.6","0.7","0.10","0.14","0.16","0.17","2.2","2.6","2.11","2.12","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","2.39","5.16","5.20","5.22","5.23","5.28","5.33","5.44","8.4","9.5","10.1","10.5","12.31","15.16","15.20","15.22","15.33","15.44","15.45","18.4","20.5","20.10","21.3","21.4","22.1","22.7","22.10","22.19","22.29","22.30","22.31","22.32","22.43","22.47","23.5","24.6","24.11","24.12","24.13","25.1","25.2","26.1","26.4","26.19","26.29","26.30","26.31","26.32","26.35","26.39","26.41","26.43","26.47"],"new":["0.1","0.2","0.6","0.7","0.14","0.16","0.17","2.2","2.6","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.12","5.23","5.44","5.45","8.2","8.4","8.5","10.1","15.12","15.16","15.20","15.22","15.33","15.45","18.2","18.4","18.5","19.3","20.5","21.4","22.1","22.10","22.19","22.29","22.30","22.31","22.32","22.43","22.47","23.5","24.6","24.11","24.12","24.13","25.4","26.1","26.4","26.29","26.30","26.31","26.32","26.43"],"artplayer":["0.2","0.7","0.14","0.16","0.17","2.2","2.22","2.24","2.28","2.29","2.30","2.31","3.5","3.6","3.7","3.29","3.30","5.12","5.23","5.45","8.2","8.3","8.4","8.5","9.7","10.1","10.2","15.12","15.16","15.20","15.22","15.45","18.2","18.3","18.4","18.5","19.3","19.7","20.1","20.8","20.9","20.10","21.0","21.3","22.10","22.19","22.29","22.30","22.32","22.43","22.47","23.1","23.8","24.2","24.3","24.8","24.16","25.0","25.3","26.4","26.27","26.29","26.30","26.32","26.43"],"container":["0.2","0.3","0.14","0.17","2.2","2.28","5.12","5.45","6.2","6.3","7.4","8.2","8.3","8.4","8.5","9.7","10.2","15.12","15.16","15.20","15.45","16.2","16.3","17.4","18.2","18.3","18.4","18.5","19.3","19.7","21.4","22.10","22.19","22.29","22.30","22.43","22.47","23.4","23.9","24.6","24.11","24.12","24.13","24.14","25.3","25.4","26.2","26.4","26.29","26.30","26.32","26.43"],"app":["0.2","0.4","0.14","5.45","6.2","6.3","6.4","6.5","7.3","7.4","8.2","8.3","8.4","8.5","9.7","10.2","15.12","15.16","15.45","16.2","16.3","16.4","16.5","17.3","17.4","18.2","18.3","18.4","18.5","19.3","19.7","20.3","20.4","21.4","22.1","22.19","22.29","22.30","22.47","23.4","24.11","24.12","24.13","24.14","25.4","26.2","26.4","26.29","26.30","26.43"],"url":["0.2","0.4","5.45","6.2","6.3","6.4","6.5","7.3","7.4","8.2","8.3","8.5","9.3","9.7","9.8","10.2","15.16","16.2","16.3","16.4","16.5","17.3","17.4","18.2","18.3","18.5","19.3","19.7","19.8","22.29","22.30","22.33","22.40","22.47","24.12","24.13","24.14","26.29","26.30","26.33","26.41","26.43"],"classname":["0.3","0.11","0.12","1.11","3.15","3.21","3.24","3.25","3.28","3.31","5.4","5.15","5.26","5.30","5.38","5.39","5.40","5.41","5.42","9.2","9.5","10.4","10.6","10.7","10.14","10.17","11.6","12.1","12.5","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.17","13.18","13.22","13.26","13.27","13.28","13.29","13.30","13.32","15.6","15.7","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.23","15.24","15.25","15.27","15.30","15.31","15.32","15.34","15.35","15.36","15.41","15.43","15.47","19.2","19.5","22.4","22.9","22.13","22.17","22.25","22.34","22.39","22.42","22.50","26.6","26.8","26.12","26.14","26.15","26.16","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.27","26.28","26.33","26.34","26.38","26.40","26.42","26.44","26.48","26.49","26.51"],"run":["0.3","0.8","0.9","0.11","0.12","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.1","3.2","3.4","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.33","5.4","5.6","5.7","5.9","5.11","5.13","5.15","5.24","5.30","5.38","5.39","5.40","5.41","5.42","5.43","9.2","9.5","10.4","10.6","10.7","10.14","10.17","11.6","12.1","12.3","12.4","12.5","12.9","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.23","12.24","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.3","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.28","13.29","13.30","15.7","15.8","15.9","15.10","15.14","15.21","15.23","15.25","15.27","15.30","15.31","15.32","15.33","15.34","15.35","15.36","15.41","15.43","15.46","15.47","22.4","22.9","22.13","22.17","22.34","22.39","22.50","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.28","26.33","26.34","26.40","26.42","26.44","26.45","26.46","26.48","26.49","26.51"],"code":["0.3","0.8","0.9","0.10","0.11","0.12","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","2.41","3.1","3.2","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","5.4","5.6","5.7","5.8","5.9","5.10","5.11","5.13","5.15","5.18","5.19","5.24","5.30","5.38","5.39","5.40","5.41","5.42","5.43","5.47","9.1","9.2","9.5","10.4","10.6","10.7","10.14","10.17","11.6","12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.29","13.30","15.1","15.3","15.8","15.9","15.10","15.14","15.21","15.23","15.25","15.27","15.28","15.31","15.32","15.33","15.34","15.35","15.36","15.41","15.43","15.46","15.47","21.0","21.2","22.4","22.7","22.17","22.39","22.50","24.8","26.3","26.5","26.7","26.8","26.9","26.12","26.13","26.17","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.28","26.33","26.34","26.40","26.42","26.44","26.45","26.46","26.48","26.49"],"document":["0.3","22.1"],"assets":["0.4","5.45","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.7","9.8","10.2","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.3","19.7","19.8","22.30","22.47","24.12","24.13","24.14","26.2","26.30","26.43"],"sample":["0.4","5.45","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.8","10.2","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.3","19.8","22.2","22.30","24.13","24.14","26.2","26.30","26.43"],"video":["0.4","3.34","5.45","6.2","6.3","6.4","6.5","7.3","7.5","8.2","8.3","8.5","9.3","9.8","10.2","13.1","15.6","15.18","15.19","16.2","16.3","16.4","16.5","17.3","17.5","18.2","18.3","18.5","19.3","19.8","22.38","22.45","22.46","24.13","24.14","26.2","26.51"],"mp4":["0.4","6.3","6.4","6.5","7.3","7.5","8.2","8.3","8.5","9.3","9.4","9.8","9.9","10.2","16.3","16.4","16.5","17.3","17.5","18.2","18.3","18.5","19.3","19.4","19.8","19.9","22.2","24.14","26.2"],"test":["0.4"],"foo":["0.4"],"bar":["0.4","13.16","13.33","22.6","22.8","22.17","22.22"],"const":["0.4","9.6","19.6","20.9","23.9"],"获取整体的字幕列表":["0.11"],"div":["0.11","0.12","3.31","5.4","5.26","5.38","5.40","5.42","9.2","9.5","10.4","10.6","10.7","10.14","10.17","11.5","11.6","11.9","12.1","12.5","12.15","12.21","12.23","12.25","12.32","12.35","12.36","12.37","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.17","13.18","13.19","13.20","13.22","13.26","13.27","13.28","13.29","13.30","13.32","15.6","15.7","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.23","15.24","15.25","15.27","15.30","15.31","15.32","15.34","15.35","15.36","15.41","15.43","19.2","19.5","20.3","22.4","22.9","22.13","22.17","22.25","22.28","22.34","22.42","22.50","26.6","26.12","26.14","26.15","26.16","26.18","26.20","26.23","26.24","26.25","26.27","26.28","26.33","26.34","26.38","26.40","26.41","26.42","26.44","26.48","26.49","26.51"],"详见事件文档":["0.12"],"console":["1.1","2.0","12.0","24.18"],"info":["2.0","12.0","24.18"],"只监听一次事件":["2.0"],"但估计没有足够的数据来支撑播放到结束":["2.42"],"渲染完成":["2.44"],"属性的值改变时触发":["2.45"],"当这个":["2.46"],"因为":["2.47"],"或者资源类型不是受支持的媒体格式":["2.48"],"中的首帧已经完成加载":["2.49"],"播放准备开始":["2.53"],"seek":["2.56","2.57","12.56","12.57","15.15"],"user":["2.58","23.13"],"属性指定的时间发生变化":["2.60"],"播放已停止":["2.62"],"也是指挂载在":["3.0"],"构造函数":["3.0"],"减少视频资源占用":["3.34"],"如果你希望保留":["3.34"],"元素的状态":["3.34"],"仅移除界面":["3.34"],"可将其设置为":["3.34"],"when":["5.5","11.1","12.45","22.26"],"destroy":["5.5"],"也会在调用":["5.5"],"时自动执行类似逻辑":["5.5"],"画中画":["5.26"],"fullscreen":["5.26","15.21","22.24"],"窗口全屏":["5.26"],"fullscreenweb":["5.26"],"网页全屏":["5.26"],"对应":["5.29"],"domrect":["5.29"],"的同名字段":["5.29"],"组件唯一名称":["6.1","8.1"],"用于标记类名":["6.1","8.1"],"index":["6.1","7.5","8.1","16.1","17.5","18.1","24.7","24.10","24.15","24.16","24.17"],"number":["6.1","7.1","8.1","10.12","16.1","17.1","18.1","19.2"],"contextmenu":["6.4","6.5","16.4","16.5"],"name":["6.5","7.5","9.9","16.5","17.5","19.9","22.33"],"组件索引":["7.1"],"用于显示的优先级":["7.1"],"html":["7.1","7.2","9.4","9.9","15.4","17.1","17.2","19.4","19.9","22.27","22.33"],"element":["7.1","13.31","17.1","22.45"],"position":["7.2","7.5","17.2","17.5"],"left":["7.2","13.25","17.2"],"tooltip":["7.2","9.2","9.9","17.2","19.2","19.5","19.6","19.9"],"style":["7.2","9.3","17.2","22.37","26.37"],"color":["7.2","15.36","17.2"],"red":["7.2","17.2"],"click":["7.2","17.2"],"function":["7.2","17.2","19.5","22.35","22.41","23.10","26.35"],"args":["7.2","17.2"],"controls":["7.3","7.5","17.3","17.5"],"add":["7.3","17.3"],"button1":["7.5","17.5"],"png":["8.4","18.4","22.29","26.29"],"列表宽度":["9.2"],"提示文本":["9.2","9.5"],"setting":["9.3","9.4","9.8","9.9","19.3","19.4","19.8","19.9"],"true":["9.3","9.4","9.8","9.9","13.18","13.19","13.32","13.34","19.3","19.4","19.8","19.9","24.6"],"settings":["9.3","9.4","9.9","19.3","19.4","19.9","22.14","22.15","22.16","22.18","22.22","22.25"],"subtitle":["9.3","19.3"],"01":["9.3","9.4","19.3"],"default":["9.3","13.1","13.4","13.10","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.27"],"span":["9.3"],"multi":["9.4","19.4"],"level":["9.4","13.0","19.4"],"selector":["9.4","19.4"],"value":["9.6"],"min":["9.6"],"flip":["9.8","19.1","19.8"],"slider":["9.9","19.9"],"5x":["9.9","19.9"],"icon":["9.9","19.9"],"refer":["10.0","15.0"],"to":["10.0","11.0","11.1","12.53","15.0","15.4","15.15","15.39","20.11"],"proxy":["10.3"],"method":["10.3"],"used":["10.3","13.33","15.38","15.39","15.40","22.3","22.6"],"hover":["10.3"],"delete":["10.4"],"clear":["10.4"],"all":["10.4","20.12"],"object":["10.6","26.11"],"update":["10.8","10.9"],"show":["10.8","10.9","10.10","10.16"],"property":["10.8","10.9","10.10","10.16"],"switch":["10.11"],"version":["10.12","20.12"],"resolution":["10.12"],"duration":["10.12"],"etc":["10.12"],"control":["10.12"],"visibility":["10.12"],"toggle":["10.13","10.15","22.20"],"set":["10.16"],"whether":["10.16","22.21"],"the":["11.0","12.45","13.1","15.0","15.6","15.29","22.8","22.12","22.25","22.26","22.27","22.44","22.45"],"top":["11.0"],"you":["11.1"],"need":["11.1"],"manage":["11.1"],"multiple":["11.1"],"player":["11.2","11.3","11.4","11.7","11.11","11.12","15.41","15.42","20.13","22.5","22.21","22.26","22.27"],"for":["11.5","11.9","13.33","16.1","18.1","22.6","22.18","22.38","22.51"],"videos":["11.5"],"options":["11.7","11.9","22.37"],"event":["11.8","12.46","19.5","22.4"],"type":["11.10"],"detection":["11.10"],"by":["11.11","20.13"],"on":["12.0","13.0","13.3","22.28","22.44","22.46","22.48","24.18"],"canplay":["12.0"],"only":["12.0","21.0","22.3","22.21","22.49"],"once":["12.0"],"time":["12.1","24.4"],"mode":["12.25","13.31","15.24","22.48"],"media":["12.42","12.48","15.5"],"but":["12.42","15.11","15.15"],"estimates":["12.42"],"there":["12.42"],"it":["12.43","15.15","22.51"],"can":["12.43","13.34"],"play":["12.43"],"rendering":["12.44"],"this":["12.46","13.34","22.11"],"is":["12.46","12.58","13.4","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.14","13.16","13.17","13.18","13.19","13.20","13.21","13.22","13.23","13.25","13.26","13.27","15.15","15.42","20.6","21.1","22.2","22.5","22.21"],"sent":["12.46"],"stopped":["12.47","12.62"],"because":["12.47"],"while":["12.48","12.54"],"fetching":["12.48"],"first":["12.49"],"frame":["12.49","15.18","15.19"],"has":["12.50","12.51","12.52","12.62"],"start":["12.53"],"after":["12.53","14.0","15.4"],"triggered":["12.54"],"playback":["12.55","15.13","15.23","22.3","22.8"],"trying":["12.58"],"data":["12.59","24.8","24.16"],"indicated":["12.60"],"volume":["12.61","22.22"],"mounted":["13.0"],"in":["13.1","13.12","13.13","13.15","13.34","15.5","15.7","15.26","22.2","22.11","22.14","22.15","22.16","22.18","22.23","22.24","22.25","22.34"],"events":["13.1"],"of":["13.1","15.29","22.12","22.36","22.40"],"text":["13.2","19.2","19.5","19.6","22.34"],"pixels":["13.6","13.7"],"feature":["13.11","22.46"],"seconds":["13.12","15.6","15.7","22.34"],"milliseconds":["13.13","13.15"],"a":["13.14","22.22"],"connection":["13.14"],"error":["13.14","13.15"],"occurs":["13.14","13.15"],"bottom":["13.16","22.20","22.23","22.24"],"pause":["13.19","13.20"],"false":["13.20"],"automatic":["13.21"],"screen":["13.21"],"rotation":["13.21"],"during":["13.23","13.24","13.31"],"long":["13.23","13.24"],"press":["13.23","13.24"],"swiping":["13.25"],"right":["13.25"],"vertical":["13.30","15.30"],"defaults":["13.31"],"smooth":["13.33"],"progress":["13.33","15.13","22.6","22.8"],"enabled":["13.34"],"reduce":["13.34"],"resource":["13.34"],"usage":["13.34"],"single":["13.34","15.5"],"page":["13.34","15.5","15.21","22.21"],"applications":["13.34","15.5"],"also":["14.0","20.12"],"remove":["15.4"],"s":["15.4","15.24","20.13","22.27"],"resources":["15.5"],"or":["15.5","22.51"],"reinitialize":["15.5"],"tag":["15.5"],"performs":["15.11"],"some":["15.11","22.49"],"optimization":["15.11"],"operations":["15.11"],"retains":["15.13"],"previous":["15.13"],"similar":["15.15","22.4"],"optional":["15.17"],"parameter":["15.17","20.10"],"specifies":["15.17"],"filename":["15.17"],"returns":["15.18","15.19"],"promise":["15.18","15.19","24.6"],"state":["15.21"],"visible":["15.23","24.18"],"before":["15.23","22.27"],"starts":["15.23"],"normal":["15.26","15.30"],"mini":["15.26"],"window":["15.26"],"pip":["15.26"],"picture":["15.26"],"automatically":["15.27","22.11"],"correspond":["15.29"],"fields":["15.29"],"same":["15.29"],"values":["15.30"],"horizontal":["15.30"],"rate":["15.31"],"ratio":["15.32"],"often":["15.38","15.40","22.11"],"with":["15.38","15.40"],"typically":["15.39"],"alongside":["15.39"],"loaded":["15.39"],"display":["15.39","17.1"],"detailed":["15.39"],"removed":["15.41"],"destroyed":["15.41"],"scoped":["15.42"],"current":["15.42","20.5","23.5"],"instance":["15.42"],"css":["16.1","18.1","26.11"],"class":["16.1","18.1","20.3"],"priority":["17.1"],"items":["19.1"],"playbackrate":["19.1"],"aspectratio":["19.1"],"width":["19.2","22.36","26.36"],"list":["19.2"],"onswitch":["19.5"],"completion":["19.6"],"onchange":["19.6"],"change":["19.6"],"install":["20.1","23.1"],"body":["20.3"],"if":["20.5","23.5"],"typeof":["20.5","23.5"],"ts":["20.6","22.40"],"from":["20.8","20.9","20.13","21.2","23.8","23.11"],"let":["20.10"],"null":["20.10"],"use":["20.11"],"file":["20.11"],"which":["20.11"],"compatibility":["20.11"],"down":["20.11"],"ie":["20.11","23.11"],"plugins":["20.12","24.14","24.18"],"provide":["20.12"],"an":["20.12"],"mjs":["20.12","23.12"],"ui":["20.13"],"changing":["20.13"],"therefore":["20.13"],"starting":["20.13"],"core":["21.0"],"will":["21.0","22.22"],"include":["21.0"],"no":["21.1"],"manual":["21.1"],"import":["21.1","21.2","23.11"],"dist":["21.2","23.12"],"group":["21.2"],"id":["21.2"],"sometimes":["22.2","22.40"],"not":["22.2","22.5"],"known":["22.2"],"immediately":["22.2"],"such":["22.2"],"cases":["22.2"],"resumption":["22.3"],"autoplayback":["22.3"],"initialized":["22.5"],"and":["22.5","22.6","22.8","22.22","22.26"],"resulting":["22.11"],"black":["22.11"],"bars":["22.11"],"option":["22.11"],"scrolls":["22.12"],"out":["22.12"],"looping":["22.13"],"currently":["22.14","22.49"],"appears":["22.14","22.15","22.16"],"panel":["22.14","22.15","22.16","22.18","22.22","22.25"],"functionality":["22.15","22.16"],"button":["22.20","22.23","22.24"],"one":["22.21"],"context":["22.22"],"menu":["22.22"],"apply":["22.22"],"loses":["22.26"],"focus":["22.26"],"required":["22.27"],"mounting":["22.27"],"mobile":["22.28","22.44","22.45","22.48"],"devices":["22.28","22.44"],"layer":["22.29","26.29"],"boolean":["22.33"],"string":["22.33","22.34"],"myplugin":["22.35","26.35"],"column":["22.36"],"columns":["22.36"],"encoding":["22.37","26.37"],"better":["22.38"],"loading":["22.38"],"experience":["22.38"],"more":["22.38"],"attributes":["22.38"],"these":["22.38"],"e":["22.40"],"g":["22.40"],"m3u8":["22.40"],"mkv":["22.40"],"however":["22.40"],"lacks":["22.40"],"party":["22.41"],"programs":["22.41"],"handler":["22.41"],"receives":["22.41"],"three":["22.41"],"parameters":["22.41"],"supported":["22.42"],"en":["22.42"],"zh":["22.42","25.2"],"cn":["22.42","26.42"],"hide":["22.44"],"fast":["22.46"],"forward":["22.46"],"web":["22.48"],"based":["22.48"],"browsers":["22.49"],"support":["22.49"],"htmlvideoelement":["22.51"],"example":["22.51"],"demo":["23.3"],"meta":["23.3"],"charset":["23.3"],"utf":["23.3","26.37"],"ref":["23.4"],"时会自动导入的":["23.6"],"param":["23.10"],"getinstance":["23.10"],"可以兼容到":["23.11"],"和所有插件还会提供一个":["23.12"],"版本的":["23.12"],"如":["23.12"],"globalthis":["23.13"],"custom":["23.13"],"agent":["23.13"],"全局变量":["23.13"],"plugin":["24.2","24.3","24.8","24.16"],"danmuku":["24.2","24.7","24.10","24.16"],"npm":["24.3"],"弹幕时间":["24.4"],"默认为当前播放器时间":["24.4"],"默认弹幕模式":["24.5"],"滚动":["24.5"],"顶部":["24.5"],"底部":["24.5"],"modes":["24.5"],"弹幕可见的模式":["24.5"],"fontsize":["24.5"],"danmu":["24.6","24.18"],"return":["24.6"],"resolve":["24.6"],"settimeout":["24.6"],"libs":["24.8","24.16"],"uncompiled":["24.8","24.16"],"artplayerplugindanmuku":["24.14","24.18"],"xml":["24.18"],"显示弹幕":["24.18"],"版本开始":["25.0"],"核心代码除了包含":["25.0"],"zhtw":["25.2"],"tw":["25.2"],"高亮元素":["26.6"],"上":["26.6"],"类似":["26.11"],"的":["26.11"],"fit":["26.11"],"里":["26.14","26.15","26.16","26.25"],"音量条等浮层会应用":["26.22"],"filter":["26.22"],"毛玻璃效果":["26.22"],"看起来更通透":["26.22"],"访问到播放器所需的":["26.27"],"画质地址":["26.33"],"预览图列数":["26.36"],"预览图宽度":["26.36"],"height":["26.36"],"预览图高度":["26.36"],"scale":["26.36"],"字幕样式":["26.37"],"字幕编码":["26.37"],"默认":["26.37"],"auto":["26.38"],"以提升加载体验":["26.38"],"更多视频属性":["26.38"],"这些属性将直接写入视频元素里":["26.38"],"所以需要特别指明":["26.40"],"元素":["26.41"],"视频地址":["26.41"],"当前实例":["26.41"],"dom元素":["26.51"]},{"0":["13.25","19.6","24.4"],"1":["3.29","9.3","13.29","19.3"],"2":["3.29","9.6","19.6","20.13","26.3"],"3":["9.6"],"4":["9.1","20.13","21.1","22.17","22.34","22.50","23.10","26.5","26.7","26.8","26.9","26.13","26.17","26.21","26.25","26.26","26.33","26.34","26.40","26.42","26.45","26.46"],"5":["13.14","13.25","20.13"],"6":["2.41","5.42","5.43","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","23.10"],"7":["5.4","5.6","5.7","5.10","5.17","5.18","5.19","5.24","5.38","5.39","5.40","12.19","12.21","12.23","12.25","12.26","15.10","22.39"],"8":["5.9","5.15","5.25","5.27","5.30","5.41","12.17","15.1","15.9","15.14","15.21","15.25","15.30","15.31","15.32","15.34","15.35","15.36","15.41","22.37","23.3","26.37"],"9":["5.11","5.13","15.11","15.13","15.23"],"10":["5.8","5.41","7.3","7.4","12.6","12.18","12.24","15.8","15.12","15.41","17.3","17.4","19.6"],"11":["15.3","15.21","20.11"],"14":["26.33"],"22":["9.9","19.9"],"25":["22.34","26.34"],"40":["3.7"],"100":["3.10"],"150":["9.4","19.4"],"300":["3.5","3.6"],"500":["3.8","3.9","3.17"],"1000":["13.15","13.24"],"3000":["13.16"],"实例":["0.0","5.0"],"artplayer":["0.1","0.3","0.5","0.6","0.8","0.9","0.10","0.13","0.15","1.1","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.17","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","5.1","5.2","5.3","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.16","5.18","5.19","5.20","5.21","5.22","5.25","5.28","5.30","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.41","5.44","5.46","5.47","9.1","9.2","9.5","10.3","10.4","10.5","10.6","10.7","10.14","10.17","12.2","12.6","12.17","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","13.5","13.6","13.7","13.8","13.9","13.17","13.28","13.29","13.30","15.2","15.3","15.5","15.28","15.33","15.34","15.37","15.41","15.44","15.46","15.47","19.2","19.5","20.2","22.4","22.7","22.17","22.27","22.31","22.39","23.2","23.13","25.1","26.10","26.19","26.31","26.34","26.39","26.40","26.47","26.50"],"container":["0.1","0.5","0.6","0.7","0.8","0.9","0.10","0.13","0.15","0.16","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","5.2","5.3","5.9","5.11","5.13","5.14","5.16","5.20","5.21","5.22","5.23","5.28","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.41","5.44","5.46","5.47","9.2","9.5","10.1","10.3","10.4","10.5","10.6","10.7","10.14","10.17","12.2","12.20","12.22","12.28","12.29","12.30","12.31","15.2","15.22","15.28","15.41","15.44","15.46","19.5","20.9","21.3","22.4","22.7","22.17","22.31","22.32","22.39","24.9","24.10","24.15","24.17","25.1","25.2","26.10","26.19","26.31","26.34","26.39","26.47"],"app":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.16","0.17","2.2","2.6","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.12","5.16","5.20","5.22","5.23","5.28","5.33","5.34","5.44","9.5","10.1","10.4","10.5","10.6","10.14","12.28","12.31","15.20","15.22","15.28","15.33","15.41","15.44","19.5","20.5","20.9","21.3","22.4","22.7","22.10","22.31","22.32","22.43","23.9","24.6","24.10","25.2","25.3","26.1","26.19","26.31","26.32","26.39","26.47"],"assets":["0.2","0.6","0.7","0.10","0.14","0.16","0.17","2.2","2.22","2.28","2.31","5.12","5.23","5.44","9.5","10.1","10.4","10.6","10.14","15.12","15.16","15.20","15.22","15.33","15.45","21.4","22.1","22.4","22.7","22.10","22.19","22.31","22.32","22.43","23.9","24.6","24.10","24.11","25.2","25.3","25.4","26.1","26.4","26.31","26.32"],"sample":["0.2","0.6","0.14","0.16","0.17","2.2","2.28","5.12","5.23","9.5","9.7","10.1","10.4","10.6","10.14","15.12","15.16","15.20","15.22","15.33","15.45","19.7","21.4","22.1","22.4","22.10","22.19","22.31","22.32","22.43","22.47","23.9","24.6","24.11","24.12","25.2","25.4","26.4","26.32"],"video":["0.2","0.14","0.16","0.17","5.12","7.4","8.4","9.5","9.7","10.4","10.6","10.14","15.20","15.22","15.45","17.4","18.4","19.7","21.4","22.1","22.10","22.19","22.29","22.30","22.32","22.43","22.47","22.48","22.51","24.6","24.11","24.12","25.2","25.4","26.4","26.29","26.30","26.32","26.43"],"mp4":["0.2","0.14","0.17","5.12","5.45","6.2","7.4","8.4","9.5","9.7","10.4","10.6","10.14","15.12","15.16","15.20","15.22","15.33","15.45","16.2","17.4","18.4","19.7","21.4","22.1","22.4","22.10","22.19","22.29","22.30","22.32","22.43","22.47","24.6","24.11","24.12","24.13","25.2","25.4","26.4","26.29","26.30","26.43"],"console":["0.2","0.4","1.6","7.2","10.2","11.6","15.16","17.2","22.35","26.35"],"info":["0.2","0.4","1.1","7.2","10.2","11.6","17.2","22.35","26.35"],"queryselector":["0.3","5.41","10.3","15.41","22.1","24.16","26.1"],"art":["0.3","0.8","0.9","0.11","0.13","0.15","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.5","3.6","3.7","3.30","5.1","5.2","5.3","5.6","5.7","5.8","5.9","5.10","5.14","5.15","5.17","5.18","5.19","5.21","5.24","5.25","5.27","5.30","5.31","5.32","5.34","5.35","5.36","5.37","5.39","5.46","5.47","9.1","9.2","10.4","10.6","10.7","10.12","10.14","10.17","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.26","12.27","12.28","12.29","12.30","12.39","12.40","12.41","15.1","15.2","15.3","15.8","15.9","15.10","15.14","15.23","15.28","15.31","15.32","15.34","15.35","15.36","15.37","15.41","15.46","15.47","19.2","19.5","21.2","22.4","22.17","22.35","22.39","22.50","24.7","24.9","24.10","24.15","24.17","26.5","26.7","26.10","26.17","26.33","26.34","26.40","26.50"],"new":["0.3","0.5","0.8","0.9","0.10","0.11","0.13","0.15","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.30","5.1","5.2","5.3","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.25","5.27","5.28","5.30","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.46","5.47","9.1","9.2","9.5","10.4","10.5","10.6","10.7","10.14","10.17","12.2","12.6","12.7","12.8","12.10","12.17","12.18","12.20","12.22","12.24","12.26","12.28","12.29","12.30","12.31","15.1","15.2","15.3","15.23","15.28","15.32","15.34","15.35","15.37","15.44","15.46","15.47","19.2","19.5","20.13","22.4","22.7","22.17","22.39","24.9","24.10","24.15","24.17","25.1","25.2","26.7","26.10","26.19","26.34","26.39","26.40","26.47","26.50"],"url":["0.6","0.7","0.9","0.10","0.14","0.16","0.17","2.2","2.18","2.22","2.24","2.28","2.29","2.30","2.31","5.20","5.23","5.33","5.44","8.4","9.5","10.1","10.4","10.5","10.6","10.14","15.20","15.22","15.33","15.44","15.45","18.4","21.3","21.4","22.1","22.4","22.7","22.10","22.19","22.31","22.32","22.41","22.43","23.9","24.6","24.10","24.11","25.2","25.3","25.4","26.1","26.4","26.31","26.32","26.39","26.47"],"js":["0.11","0.12","1.6","3.1","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","5.4","5.6","5.7","5.15","5.24","5.26","5.30","5.38","5.39","5.40","5.42","5.43","9.2","10.3","10.4","10.7","10.17","11.6","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","13.30","15.7","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.23","15.25","15.27","15.30","15.31","15.32","15.34","15.35","15.36","15.41","15.43","15.47","19.2","19.5","21.1","22.17","22.25","22.34","22.42","22.50","24.8","26.3","26.5","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.27","26.28","26.33","26.40","26.42","26.44","26.45","26.46","26.48","26.49"],"var":["0.11","0.12","1.1","2.41","3.5","3.6","3.7","3.17","3.30","5.1","5.6","5.7","5.8","5.9","5.10","5.11","5.13","5.15","5.17","5.18","5.19","5.21","5.24","5.25","5.27","5.30","5.38","5.39","5.40","5.41","5.43","5.47","9.1","9.2","10.3","10.4","10.7","10.17","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.23","12.24","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","15.1","15.2","15.3","15.8","15.9","15.10","15.14","15.23","15.25","15.28","15.31","15.32","15.34","15.35","15.36","15.37","15.41","15.46","15.47","19.2","19.5","21.1","21.2","22.4","22.17","22.34","22.39","22.50","24.7","24.15","24.16","24.17","26.3","26.5","26.7","26.17","26.25","26.33","26.34","26.40","26.50"],"function":["0.14","6.5","16.5","17.1","20.10","26.37"],"构造函数":["1.0"],"code":["1.11","3.34","5.5","5.26","5.29","9.6","10.3","11.1","13.2","13.3","13.4","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.14","13.15","13.16","13.17","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.28","13.31","13.32","13.33","15.6","15.7","15.11","15.13","15.17","15.18","15.19","15.24","15.30","15.38","15.39","15.40","19.1","19.2","19.5","20.11","22.3","22.5","22.8","22.9","22.13","22.25","22.28","22.33","22.34","22.40","22.42","22.45","23.11","26.6","26.11","26.14","26.15","26.16","26.22","26.27","26.36","26.38","26.41","26.51"],"once":["2.0"],"不必停下来进一步缓冲内容":["2.42"],"media":["2.46","2.47","12.43"],"已经加载完成":["2.46"],"操作完成":["2.56"],"操作开始":["2.57"],"agent":["2.58"],"的":["3.0"],"false":["3.3","3.34","20.5","23.5","24.5","24.14"],"div":["3.34","5.5","5.29","9.6","10.3","10.13","10.15","11.1","11.2","11.3","11.4","11.7","11.8","11.10","11.11","11.12","13.1","13.12","13.13","13.14","13.15","13.16","13.21","13.23","13.24","13.25","13.31","13.33","15.4","15.15","15.17","15.26","15.38","15.39","15.40","15.42","19.1","20.5","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.33","22.40","22.44","22.45","22.46","22.49","22.51","23.3","23.5","26.11","26.22","26.36"],"classname":["3.34","5.5","5.29","9.6","10.3","11.1","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.1","13.12","13.13","13.14","13.15","13.16","13.19","13.20","13.21","13.23","13.24","13.25","13.31","13.33","15.4","15.15","15.17","15.26","15.38","15.39","15.40","19.1","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.28","22.33","22.40","22.44","22.45","22.46","22.49","26.11","26.22","26.36","26.41"],"run":["3.34","5.5","5.26","5.29","9.6","10.3","11.1","11.2","11.3","11.4","11.5","11.7","11.9","11.10","11.12","13.1","13.2","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.6","15.11","15.13","15.15","15.17","15.18","15.19","15.24","15.38","15.39","15.40","19.1","19.2","19.5","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.20","22.23","22.24","22.25","22.26","22.28","22.33","22.40","22.42","22.45","22.46","22.49","26.11","26.22","26.27","26.36","26.38","26.41"],"add":["4.0","6.3","8.3","14.0","16.3","18.3","24.2"],"例如我想写一个在视频暂停后":["4.0"],"显示一个图片广告的插件":["4.0"],"on":["5.12","15.12","15.16","15.33"],"播放器当前可见宽高":["5.29"],"document":["5.41","10.3","15.41","24.16","26.1"],"default":["5.45","7.5","15.45","17.5","19.3","23.10"],"true":["5.45","7.5","9.7","13.31","15.4","15.45","17.5","19.7","22.4","22.10","22.30","22.47","24.5","26.4","26.30","26.37"],"html":["5.45","6.1","6.2","6.3","6.4","6.5","7.3","7.5","8.1","8.2","8.3","8.5","9.8","15.45","16.1","16.2","16.3","16.4","16.5","17.3","17.5","18.1","18.2","18.3","18.5","19.8","22.29","22.30","22.37","23.13","24.14","26.29","26.30","26.37"],"sd":["5.45"],"480p":["5.45"],"组件索引":["6.1","8.1"],"用于显示的优先级":["6.1","8.1"],"contextmenu":["6.2","6.3","16.2","16.3"],"name":["6.2","6.3","6.4","7.3","7.4","8.2","8.3","8.4","8.5","9.8","15.29","16.2","16.3","16.4","17.3","17.4","18.2","18.3","18.4","18.5","19.8","22.29","22.35","26.29","26.35"],"your":["6.2","6.3","6.4","6.5","7.3","16.2","16.3","16.4","16.5","17.3","22.47","26.43"],"menu":["6.2","6.3","6.4","6.5","16.2","16.3","16.4","16.5","22.14","22.15","22.16"],"click":["6.4","6.5","16.4","16.5","17.1","24.14"],"args":["6.5","16.5"],"组件的":["7.1"],"dom":["7.1","17.1","22.41","22.51"],"元素":["7.1"],"style":["7.1","8.2","8.3","8.5","17.1","18.2","18.3","18.5","19.3","20.4","22.29"],"object":["7.1","17.1"],"mounted":["7.2","17.2"],"subtitle":["7.2","7.5","17.2","17.5"],"button1":["7.3","7.4","17.3","17.4"],"index":["7.3","7.4","17.3","17.4","24.8"],"position":["7.3","15.20","15.22","17.3","24.13","24.14"],"left":["7.3","17.3"],"controls":["7.4","15.20","15.22","17.4","24.13","24.14"],"right":["7.5","17.5","24.14"],"selector":["7.5","17.5","22.30","26.30"],"01":["7.5","17.5","19.4"],"layers":["8.2","8.3","8.4","8.5","18.2","18.3","18.4","18.5"],"potser":["8.2","8.3","8.5","18.2","18.3","18.5","22.29","26.29"],"width":["8.2","8.3","8.5","9.4","9.9","18.2","18.3","18.5","19.4","19.9","22.29"],"100px":["8.2","8.3","8.5","18.2","18.3","18.5"],"src":["8.2","8.5","9.9","18.2","18.5","19.9"],"color":["9.3","19.3"],"red":["9.3","19.3"],"srt":["9.3","19.3"],"id":["9.3","19.3","22.47"],"yellow":["9.3"],"02":["9.3"],"setting":["9.5","9.7","19.7","22.30","26.30"],"max":["9.6","19.6"],"step":["9.6"],"settings":["9.8","19.8"],"slider":["9.8","19.8"],"tooltip":["9.8","19.8"],"5x":["9.8","19.8"],"icon":["9.8","19.8"],"img":["9.9","19.9"],"height":["9.9","19.9","22.36"],"state":["9.9","19.9"],"svg":["9.9","19.9"],"secondary":["10.0"],"custom":["10.3"],"test":["10.4"],"foo":["10.4"],"bar":["10.4","22.18","22.20","22.23","22.24","22.44"],"set":["10.8","10.9","10.10","22.2"],"whether":["10.8","10.9","10.10","22.37"],"all":["10.8","10.9","10.10","10.16"],"are":["10.8","13.34","21.0"],"visible":["10.8"],"toggle":["10.8","10.9","10.10","10.16"],"display":["10.9","10.10","10.16","16.1","18.1"],"options":["10.11"],"texttrack":["10.11"],"gets":["10.11"],"text":["10.11"],"track":["10.11"],"activecues":["10.11"],"list":["10.11"],"via":["10.12","22.27"],"show":["10.12"],"triggered":["10.12"],"event":["10.12","15.38","15.40"],"is":["10.12","12.44","13.1","13.15","13.24","22.26"],"named":["10.12"],"of":["10.13","10.15","12.49"],"level":["11.0","15.0"],"simultaneously":["11.1"],"isn":["12.42"],"t":["12.42"],"enough":["12.42"],"value":["12.45","19.6"],"when":["12.46","15.5"],"the":["12.47","12.54","20.3","22.38"],"data":["12.48","23.10"],"or":["12.48","13.34"],"been":["12.50","12.51","12.53"],"begun":["12.52"],"having":["12.53"],"rate":["12.55"],"operation":["12.56","12.57"],"to":["12.58","22.11","22.21","22.37"],"fetch":["12.58"],"loading":["12.59"],"by":["12.60"],"has":["12.61"],"due":["12.62"],"constructor":["13.0"],"property":["13.0","20.10"],"names":["13.0","15.42"],"off":["13.1"],"effects":["13.33"],"scenarios":["13.34"],"where":["13.34"],"players":["13.34"],"frequently":["13.34"],"created":["13.34"],"destroyed":["13.34"],"if":["13.34"],"you":["13.34","22.1","22.2"],"wish":["13.34"],"preserve":["13.34"],"for":["14.0"],"example":["14.0"],"let":["14.0"],"say":["14.0"],"first":["15.0"],"destruction":["15.4"],"defaults":["15.4"],"note":["15.5","20.3"],"global":["15.5","20.13"],"configuration":["15.5"],"remove":["15.5"],"destroy":["15.5","20.5","23.5"],"will":["15.5","22.38"],"also":["15.5"],"ready":["15.12","15.16"],"seek":["15.12"],"settimeout":["15.12"],"does":["15.15"],"not":["15.15"],"trigger":["15.15"],"additional":["15.15"],"events":["15.15"],"fullscreen":["15.26"],"fullscreenweb":["15.26"],"webpage":["15.26"],"in":["15.29"],"domrect":["15.29"],"player":["15.29","20.3"],"s":["15.29","17.1","20.3"],"current":["15.29"],"timeupdate":["15.38","15.40"],"buffering":["15.39"],"progress":["15.39"],"preventing":["15.42"],"errors":["15.42"],"from":["15.42","20.11"],"duplicate":["15.42"],"class":["15.42","23.3"],"priority":["16.1","18.1"],"subtitleoffset":["19.1"],"span":["19.3"],"min":["19.6"],"yarn":["20.1","23.1","24.2"],"npm":["20.2","23.2"],"dist":["20.2","20.12","23.2","24.3"],"warning":["20.3","22.47"],"option":["20.4","23.4"],"return":["20.5","22.35","23.5","23.10","26.35"],"ref":["20.5","23.5"],"automatically":["20.6"],"const":["20.8","23.8"],"param":["20.10"],"getinstance":["20.10"],"import":["20.11"],"group":["20.11","23.11"],"bash":["20.11","23.11"],"jsdelivr":["20.11","23.11"],"net":["20.11","23.11"],"such":["20.12"],"as":["20.12"],"plugin":["20.12","23.12"],"variable":["20.13"],"globalthis":["20.13"],"user":["20.13"],"simplified":["21.0"],"chinese":["21.0"],"and":["21.0","22.14","22.15","22.16","22.48"],"english":["21.0"],"other":["21.0"],"languages":["21.0"],"no":["21.0"],"longer":["21.0"],"required":["21.1"],"zhtw":["21.2"],"zh":["21.2"],"tw":["21.2"],"may":["22.1"],"can":["22.2","22.27"],"asynchronously":["22.2"],"muted":["22.4","26.4"],"yet":["22.5"],"playing":["22.5","22.26"],"highlighted":["22.6"],"elements":["22.6"],"time":["22.8","22.21"],"adjusts":["22.11"],"hide":["22.11"],"browser":["22.12"],"viewport":["22.12","22.48"],"context":["22.14","22.15","22.16"],"bottom":["22.18","22.44"],"control":["22.18","22.20","22.23","22.24","22.44"],"allowed":["22.21"],"play":["22.21","26.43"],"at":["22.21"],"a":["22.21"],"filter":["22.22"],"frosted":["22.22"],"glass":["22.22"],"more":["22.22"],"transparent":["22.22"],"appearance":["22.22"],"however":["22.22"],"access":["22.27"],"setting01":["22.30","26.30"],"scale":["22.36"],"utf":["22.37"],"escape":["22.37","26.37"],"boolean":["22.37","26.37"],"tags":["22.37"],"be":["22.38"],"directly":["22.38"],"written":["22.38"],"into":["22.38"],"correct":["22.40"],"so":["22.40"],"explicit":["22.40"],"specification":["22.40"],"necessary":["22.40"],"element":["22.41","22.51"],"lang":["22.43","26.43"],"devices":["22.45","22.46"],"mobile":["22.46"],"dimensions":["22.48"],"size":["22.48"],"this":["22.49"],"feature":["22.49"],"an":["22.51"],"existing":["22.51"],"body":["23.3"],"属性":["23.10"],"export":["23.10"],"https":["23.11"],"danmuku":["23.12","24.3","24.8"],"head":["23.13"],"title":["23.13"],"mode":["24.4"],"弹幕模式":["24.4"],"滚动":["24.4"],"弹幕字体大小":["24.5"],"antioverlap":["24.5"],"弹幕是否防重叠":["24.5"],"synchronousplayback":["24.5"],"是否同步播放速度":["24.5"],"mount":["24.5"],"undefined":["24.5"],"弹幕发射器挂载点":["24.5"],"默认为播放器控制栏中部":["24.5"],"heatmap":["24.5"],"plugins":["24.6","24.11","24.12","24.13"],"xml":["24.6","24.13","24.14"],"这是用户在输入框输入弹幕文本":["24.6"],"然后点击发送按钮后触发的函数":["24.6"],"artplayerplugindanmuku":["24.11","24.12","24.13"],"emitter":["24.14"],"重载":["24.14"],"danmu":["24.16"],"loaded":["24.18"],"danmus":["24.18"],"加载弹幕":["24.18"],"length":["24.18"],"简体中文":["25.0"],"和":["25.0"],"英文":["25.0"],"有时候":["26.2"],"地址没那么快知道":["26.2"],"这时候你可以异步设置":["26.2"],"cover":["26.11"],"但在部分低性能设备或老旧浏览器上可能会有性能或兼容性问题":["26.22"],"预览图缩放":["26.36"],"是否转义":["26.37"],"标签":["26.37"],"默认为":["26.37"],"onvttload":["26.37"],"用于修改":["26.37"]},{"0":["15.12","23.9"],"1":["3.25","9.9","19.9","24.4"],"2":["3.26","9.3","13.29","19.3","22.3","24.4"],"3":["3.28","13.28","19.6","26.1"],"4":["3.28","13.28","19.1","20.10","22.5","22.8","22.9","22.13","22.14","22.15","22.16","22.23","22.24","22.25","22.28","22.33","22.36","22.40","22.42","22.45","22.46","22.49","26.6","26.11","26.12","26.14","26.15","26.16","26.18","26.20","26.22","26.23","26.24","26.28","26.36","26.37","26.38","26.41","26.44","26.48","26.49","26.51"],"5":["3.23","3.29","9.9","13.29","19.9","22.7"],"6":["3.29","13.29","15.43","20.10","22.2","26.2"],"7":["5.29","15.6","15.7","15.17","15.18","15.19","15.24","15.38","15.39","15.40","26.27","26.38"],"8":["5.26","15.15","15.26","15.27","22.36","23.13","26.36","26.41"],"9":["5.5"],"10":["3.12","3.14","3.27","5.12","9.9","19.9"],"12":["24.13"],"14":["22.33"],"20":["3.11"],"22":["9.5"],"40":["13.7"],"50":["24.13"],"100":["13.10"],"300":["13.5","13.6"],"500":["3.21","13.8","13.9","13.17"],"512":["24.5"],"2000":["3.22","3.24","13.22"],"3000":["3.15","15.12"],"5000":["3.4","3.13","3.16"],"的":["0.0","0.4","1.0","5.0"],"url":["0.1","0.3","0.5","0.8","0.12","0.13","0.15","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.30","5.1","5.2","5.3","5.8","5.9","5.13","5.14","5.15","5.16","5.17","5.18","5.19","5.21","5.22","5.25","5.28","5.30","5.31","5.32","5.34","5.35","5.36","5.37","5.46","5.47","9.1","9.2","9.6","10.3","10.7","10.17","12.6","12.7","12.8","12.10","12.12","12.16","12.17","12.18","12.20","12.22","12.24","12.26","12.28","12.29","12.30","12.31","15.2","15.3","15.8","15.9","15.14","15.23","15.28","15.31","15.32","15.34","15.35","15.36","15.37","15.41","15.46","15.47","19.2","19.5","20.5","20.9","21.2","22.17","22.34","22.39","24.9","24.15","24.17","25.1","26.7","26.10","26.19","26.34","26.40","26.50"],"assets":["0.1","0.3","0.5","0.8","0.9","0.11","0.13","0.15","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.30","5.2","5.3","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.16","5.18","5.19","5.20","5.21","5.22","5.25","5.28","5.30","5.31","5.32","5.33","5.34","5.35","5.36","5.37","5.46","5.47","9.1","9.2","9.6","10.3","10.5","10.7","10.17","12.2","12.6","12.17","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","15.2","15.3","15.9","15.14","15.23","15.28","15.31","15.32","15.34","15.35","15.37","15.41","15.44","15.46","15.47","19.2","19.5","20.9","21.2","21.3","22.17","22.34","22.39","22.40","24.9","24.15","24.17","25.1","26.10","26.19","26.33","26.34","26.39","26.40","26.47","26.50"],"sample":["0.1","0.3","0.5","0.7","0.8","0.9","0.10","0.11","0.13","0.15","2.6","2.11","2.12","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.29","2.30","2.31","2.39","5.2","5.3","5.9","5.11","5.13","5.14","5.15","5.16","5.18","5.19","5.20","5.21","5.22","5.28","5.30","5.31","5.32","5.33","5.34","5.35","5.36","5.44","5.46","5.47","9.2","9.6","10.3","10.5","10.7","10.17","12.2","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","15.2","15.23","15.28","15.34","15.41","15.44","15.46","19.2","19.5","20.9","21.2","21.3","22.7","22.17","22.34","22.39","22.40","24.9","24.10","24.15","24.17","25.3","26.1","26.10","26.19","26.31","26.33","26.34","26.39","26.40","26.47"],"video":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.13","0.15","2.2","2.6","2.12","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","5.2","5.3","5.9","5.11","5.13","5.14","5.16","5.20","5.22","5.23","5.28","5.31","5.32","5.33","5.35","5.36","5.44","5.46","9.2","9.6","10.1","10.3","10.5","10.7","10.17","12.2","12.22","12.28","12.29","12.30","12.31","15.28","15.41","15.44","15.46","19.2","19.5","20.9","21.2","21.3","22.7","22.31","22.39","23.9","24.9","24.10","24.15","24.17","25.3","26.1","26.10","26.19","26.31","26.34","26.39","26.40","26.47"],"mp4":["0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.16","2.2","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.16","5.20","5.22","5.23","5.28","5.32","5.33","5.34","5.44","5.46","9.2","10.1","10.3","10.5","10.7","10.17","12.2","12.28","12.29","12.30","12.31","15.23","15.28","15.41","15.44","19.2","19.5","20.9","21.2","21.3","22.7","22.17","22.31","22.39","23.9","24.9","24.10","24.17","25.3","26.1","26.10","26.19","26.31","26.32","26.34","26.39","26.47"],"warning":["0.4","10.2","10.4","11.6","15.12","15.16","15.22","15.33","20.4","22.7","22.10","25.0"],"提示":["0.4"],"默认所有播放器实例都是共享同一个":["0.4"],"localstorage":["0.4"],"而且默认的":["0.4"],"是":["0.4"],"settings":["0.4","9.2","9.5","19.5"],"如果你想不同的播放器使用不同的":["0.4"],"console":["0.6","0.14","0.17","6.2","6.3","6.4","6.5","9.3","9.4","10.1","10.4","10.5","10.6","10.14","11.1","16.2","16.3","16.4","16.5","19.3","19.4","22.30"],"info":["0.6","0.14","0.17","1.6","6.2","6.3","6.4","6.5","9.3","9.4","10.1","10.4","10.5","10.6","10.14","11.1","15.16","16.2","16.3","16.4","16.5","19.3","19.4","22.30"],"play":["0.6","10.6","12.42","22.43","26.4"],"on":["0.7","0.8","0.9","0.10","2.2","2.22","5.33","5.44","7.5","8.5","9.9","10.7","10.14","11.0","15.0","15.28","15.44","17.5","18.5","19.9","20.3","22.22"],"ready":["0.9","0.10","2.2","5.12","5.44","7.5","10.14","15.33","17.5"],"artplayer":["0.11","0.12","1.6","2.41","3.34","5.4","5.6","5.7","5.17","5.24","5.26","5.27","5.29","5.38","5.39","5.40","5.42","5.43","9.6","11.6","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.3","13.4","13.10","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.1","15.7","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.23","15.24","15.25","15.27","15.30","15.31","15.32","15.35","15.36","15.43","19.1","19.6","20.13","21.1","22.25","22.33","22.34","22.40","22.42","22.50","26.3","26.5","26.7","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.25","26.26","26.33","26.36","26.42","26.45","26.46"],"container":["0.11","0.12","1.1","2.1","2.3","2.4","2.14","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.29","3.30","5.1","5.4","5.6","5.7","5.8","5.10","5.15","5.17","5.18","5.19","5.24","5.25","5.26","5.27","5.30","5.38","5.39","5.40","5.42","5.43","9.1","9.6","12.1","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.23","12.24","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.30","15.1","15.3","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.23","15.25","15.30","15.31","15.32","15.34","15.35","15.36","15.37","15.47","19.2","19.6","21.1","21.2","22.25","22.33","22.34","22.40","22.42","22.50","24.7","24.16","26.5","26.7","26.17","26.25","26.27","26.33","26.40","26.42","26.50"],"app":["0.11","0.12","0.13","0.15","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.30","5.1","5.2","5.3","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.17","5.18","5.19","5.21","5.25","5.27","5.30","5.31","5.32","5.35","5.36","5.37","5.39","5.41","5.46","5.47","9.1","9.2","9.6","10.3","10.7","10.17","12.2","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.29","12.30","12.39","12.40","12.41","15.1","15.2","15.3","15.8","15.9","15.10","15.11","15.13","15.14","15.21","15.23","15.30","15.31","15.32","15.34","15.35","15.36","15.37","15.46","15.47","19.2","21.2","22.17","22.34","22.39","22.40","22.50","23.3","23.5","24.7","24.9","24.15","24.16","24.17","25.1","26.7","26.10","26.17","26.25","26.27","26.33","26.34","26.40","26.50"],"new":["0.12","1.1","3.3","3.6","3.7","3.8","3.9","3.10","3.11","3.17","3.22","3.28","3.29","3.33","5.4","5.5","5.6","5.7","5.24","5.26","5.29","5.38","5.39","5.40","5.41","5.42","5.43","9.6","10.3","10.16","12.1","12.3","12.4","12.5","12.9","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.8","13.9","13.17","13.30","15.6","15.7","15.8","15.9","15.10","15.11","15.13","15.14","15.15","15.17","15.18","15.19","15.21","15.24","15.25","15.27","15.30","15.31","15.36","15.41","15.43","19.1","19.6","21.1","21.2","22.9","22.13","22.25","22.33","22.34","22.40","22.42","22.50","24.7","24.8","24.16","26.3","26.5","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.28","26.33","26.36","26.38","26.42","26.44","26.45","26.46","26.48","26.49","26.51"],"hotkeyevent":["0.14","10.14"],"event":["0.14","9.3","9.4","10.14","17.1","19.4"],"click":["0.14","6.2","6.3","7.1","7.3","10.14","15.20","15.22","16.2","16.3","17.3","22.31","24.12"],"true":["0.16","2.28","3.1","3.20","3.33","7.2","9.2","9.5","17.2","19.2","19.5","22.17","22.37"],"flip":["0.16"],"playbackrate":["0.16"],"aspectratio":["0.16"],"function":["0.17","6.2","6.3","6.4","7.1","7.3","9.4","10.14","10.17","15.20","15.22","16.2","16.3","16.4","17.3","19.4","22.30","22.37","24.12","24.14","26.30"],"myplugin":["0.17","10.17"],"art":["1.1","3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.18","3.21","3.22","3.23","3.24","3.27","3.28","3.29","3.32","3.33","5.4","5.5","5.26","5.29","5.38","5.40","5.41","5.42","5.43","9.6","10.3","10.16","12.1","12.5","12.14","12.15","12.25","12.32","12.33","12.34","12.35","12.36","12.37","12.38","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.29","13.30","15.6","15.7","15.15","15.17","15.18","15.19","15.21","15.24","15.25","15.27","15.30","15.38","15.39","15.40","15.43","19.1","19.6","20.8","21.1","22.9","22.13","22.25","22.28","22.33","22.34","22.40","22.41","22.42","23.8","24.8","24.16","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.23","26.24","26.25","26.26","26.28","26.36","26.38","26.42","26.44","26.45","26.46","26.48","26.49","26.51"],"js":["1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","3.2","3.34","5.5","5.29","10.8","10.9","10.10","10.13","10.15","10.16","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.6","15.15","15.17","15.24","15.26","15.38","15.39","15.40","15.42","19.1","20.2","22.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.27","22.28","22.33","22.36","22.40","22.44","22.45","22.46","22.49","23.2","24.3","26.6","26.11","26.22","26.36","26.37","26.38","26.41","26.51"],"手动触发事件":["2.0"],"subtitle":["2.28","2.29","2.30","2.31","12.31"],"或者部分加载完成":["2.46"],"则发送此事件":["2.46"],"已经到达结束点":["2.47"],"正在尝试获取媒体数据":["2.58"],"一级属性":["3.0"],"var":["3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.29","3.31","3.32","3.33","5.4","5.5","5.26","5.29","5.42","9.6","10.13","10.15","10.16","12.1","13.3","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","13.30","15.6","15.7","15.11","15.13","15.15","15.17","15.18","15.19","15.21","15.24","15.26","15.27","15.30","15.38","15.39","15.40","15.43","19.1","19.6","22.3","22.5","22.9","22.13","22.25","22.28","22.33","22.40","22.42","24.8","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.26","26.27","26.28","26.36","26.38","26.41","26.42","26.44","26.45","26.46","26.48","26.49","26.51"],"false":["3.18","3.19","3.31","3.32","6.5","13.3","13.32","16.5"],"adsplugin":["4.0","14.0"],"option":["4.0","14.0","24.18"],"layers":["4.0","14.0"],"ads":["4.0","14.0"],"html":["4.0","7.4","8.4","9.7","15.20","15.22","17.4","18.4","19.7","20.13","22.31","22.32","24.11","24.12","24.13","26.31","26.32"],"img":["4.0","9.5","9.8","19.8","26.39"],"style":["4.0","6.1","7.3","8.1","8.4","16.1","17.3","18.1","18.4","23.4","26.29"],"width":["4.0","8.4","9.5","9.8","18.4","19.8","24.5","26.29"],"100px":["4.0","8.4","18.4","22.29","26.29"],"src":["4.0","8.3","8.4","9.8","18.3","18.4","19.8","22.29","26.29"],"display":["4.0"],"none":["4.0"],"position":["4.0","5.20","7.4","8.2","8.3","8.5","17.4","18.2","18.3","18.5","22.29","22.32","24.11","24.12","26.29","26.32"],"absolute":["4.0","8.2","8.3","8.5","18.2","18.3","18.5","22.29","26.29"],"top":["4.0","8.2","8.3","8.5","18.2","18.3","18.5","22.29","26.29"],"20px":["4.0","22.29","26.29"],"right":["4.0","7.2","7.4","8.2","8.5","15.20","15.22","17.2","17.4","18.2","18.5","22.29","24.11","24.12","24.13"],"seek":["5.12","22.19"],"settimeout":["5.12","7.5","17.5","22.2"],"controls":["5.20","5.22","24.11","24.12"],"jpg":["5.23"],"hd":["5.45","15.45"],"720p":["5.45","15.45"],"element":["6.1","8.1","13.34","16.1","18.1","22.38"],"组件的":["6.1","8.1"],"dom":["6.1","8.1","9.4","16.1","18.1","19.4"],"元素":["6.1","8.1"],"args":["6.2","6.3","6.4","16.2","16.3","16.4","22.30","26.30"],"show":["6.5","9.7","9.9","16.5","19.7","19.9"],"组件样式对象":["7.1"],"组件点击事件":["7.1"],"mounted":["7.1","11.0","15.0","17.1"],"selector":["7.2","17.2"],"default":["7.2","10.4","17.2","20.10","21.0","21.4","25.4"],"span":["7.2","17.2"],"01":["7.2","17.2","22.30","26.30"],"button":["7.3","7.4","17.3","17.4"],"tooltip":["7.3","7.4","8.2","8.3","17.3","17.4","18.2","18.3","22.32"],"color":["7.3","17.3"],"red":["7.3","17.3"],"your":["7.4","17.4","22.31","22.32","26.31","26.32","26.47"],"02":["7.5","9.4","17.5","19.3","19.4","22.30","26.30"],"update":["7.5","17.5"],"the":["7.5","12.48","17.5","21.4","22.10","25.4"],"tip":["8.2","8.3","18.2","18.3"],"50px":["8.2","8.3","8.5","18.2","18.3","18.5"],"potser":["8.4","18.4"],"setting":["9.2","19.2","19.5"],"item":["9.3","9.4","19.3","19.4"],"onselect":["9.4","19.4","22.30","26.30"],"pip":["9.5","19.5"],"mode":["9.5","19.5"],"close":["9.5","19.5"],"height":["9.5","9.8","19.8"],"add":["9.7","20.1","23.1"],"slider":["9.7","19.7"],"state":["9.8","13.34","19.8"],"range":["9.9","19.9","24.13"],"attached":["10.0"],"note":["10.2","10.4","15.12","15.16","15.33","22.7","22.10","22.47"],"to":["10.2","12.42","12.43","12.62","14.0","22.1"],"easily":["10.2"],"distinguish":["10.2"],"between":["10.2"],"and":["10.2","15.29"],"const":["10.4","24.6"],"by":["10.4","21.0","22.47"],"zh":["10.6"],"cn":["10.6"],"visibility":["10.8"],"of":["10.8","10.9","10.10","10.16","12.45","20.3","22.1"],"div":["10.8","10.9","10.10","10.11","10.12","10.16","15.5","15.29","19.6","22.21","22.27","22.36","22.37","22.38","22.41","22.48","26.37"],"classname":["10.8","10.9","10.10","10.12","10.13","10.15","10.16","15.5","15.29","15.42","19.6","22.21","22.27","22.36","22.37","22.38","22.41","22.48","22.51","26.37"],"run":["10.8","10.9","10.10","10.12","10.13","10.15","10.16","11.8","11.11","15.4","15.5","15.26","15.29","15.42","19.6","22.18","22.21","22.27","22.36","22.37","22.38","22.41","22.44","22.48","22.51","26.37"],"code":["10.8","10.9","10.10","10.12","10.13","10.15","10.16","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.1","15.4","15.15","15.26","15.29","15.42","19.6","22.6","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.23","22.24","22.26","22.27","22.36","22.37","22.38","22.41","22.44","22.46","22.48","22.49","22.51","26.37"],"currently":["10.11"],"active":["10.11"],"cues":["10.11"],"overall":["10.11"],"see":["10.12"],"documentation":["10.12"],"for":["10.12","22.1","22.37"],"details":["10.12"],"all":["11.6","13.0"],"manually":["12.0","21.0"],"trigger":["12.0"],"data":["12.42","12.58","20.10"],"through":["12.42","12.43"],"already":["12.46"],"been":["12.46","20.13"],"loaded":["12.46","12.50"],"or":["12.46","12.53","22.22"],"media":["12.47","12.49","12.58"],"resource":["12.48"],"type":["12.48","24.13"],"paused":["12.51","12.53","14.0"],"browser":["12.54"],"is":["12.54","14.0","15.5","17.1"],"has":["12.55","12.56","12.57","12.59","20.13"],"but":["12.58"],"currenttime":["12.60"],"attribute":["12.60"],"changed":["12.61"],"are":["13.0"],"in":["13.0"],"uppercase":["13.0"],"they":["13.0"],"only":["13.34"],"ui":["13.34"],"set":["13.34"],"i":["14.0","24.6"],"want":["14.0","22.10"],"write":["14.0"],"a":["14.0"],"that":["14.0"],"displays":["14.0"],"an":["14.0","22.43"],"image":["14.0"],"ad":["14.0"],"when":["14.0"],"automatically":["15.5"],"execute":["15.5"],"similar":["15.5","22.11"],"logic":["15.5"],"called":["15.5"],"t":["15.12"],"some":["15.16","22.22"],"videos":["15.16"],"may":["15.16","22.22"],"not":["15.16"],"switch":["15.20"],"visible":["15.29"],"resize":["15.33"],"sd":["15.45"],"480p":["15.45"],"object":["16.1","18.1","22.11"],"handler":["17.1"],"triggered":["17.1"],"after":["17.1"],"yellow":["19.3"],"step":["19.6","24.13"],"unpkg":["20.2","20.11","23.2","24.3"],"dimensions":["20.3"],"depend":["20.3"],"size":["20.3","22.1"],"its":["20.3"],"get":["20.4","23.4"],"instance":["20.4","22.41"],"getinstance":["20.4"],"imported":["20.6","21.0"],"useref":["20.8","23.8"],"export":["20.10"],"return":["20.10"],"https":["20.11"],"cdn":["20.11","23.11"],"npm":["20.11","23.11"],"dist":["20.11","23.11"],"danmuku":["20.12"],"doctype":["20.12","23.12"],"agent":["20.13"],"added":["20.13"],"head":["20.13"],"title":["20.13"],"demo":["20.13","23.13"],"must":["21.0"],"be":["21.0"],"as":["21.0","22.47"],"change":["21.4","25.4"],"language":["21.4","25.4"],"need":["22.1"],"initialize":["22.1"],"example":["22.1"],"this":["22.4","22.22","26.4"],"equivalent":["22.4"],"muted":["22.10"],"if":["22.10","24.6"],"you":["22.10"],"fit":["22.11"],"cover":["22.11"],"css":["22.11","26.1"],"description":["22.19"],"increase":["22.19"],"volume":["22.19","23.9"],"decrease":["22.19"],"forward":["22.19"],"backward":["22.19"],"cause":["22.22"],"performance":["22.22"],"compatibility":["22.22"],"issues":["22.22"],"low":["22.22"],"left":["22.32","26.32"],"something":["22.35","26.35"],"dosomething":["22.35","26.35"],"onvttload":["22.37"],"modifying":["22.37"],"text":["22.37","24.6","24.12"],"loading":["22.39","26.39"],"current":["22.41"],"modify":["22.43"],"existing":["22.43"],"player":["22.47"],"uses":["22.47"],"d":["23.6"],"选项":["23.10"],"lang":["23.12","25.2","25.3"],"meta":["23.13"],"charset":["23.13"],"utf":["23.13"],"com":["24.3"],"默认":["24.4"],"顶部":["24.4"],"底部":["24.4"],"是否开启热力图":["24.5"],"当播放器宽度小于此值时":["24.5"],"弹幕发射器置于播放器底部":["24.5"],"points":["24.5"],"热力图数据":["24.5"],"filter":["24.5"],"弹幕载入前的过滤器":["24.5"],"只支持返回布尔值":["24.5"],"beforeemit":["24.5"],"弹幕发送前的过滤器":["24.5"],"支持返回":["24.5"],"你可以对弹幕做合法校验":["24.6"],"或者做存库处理":["24.6"],"当返回true后才表示把弹幕加入到弹幕队列":["24.6"],"async":["24.6"],"isdirty":["24.6"],"fuck":["24.6"],"test":["24.6"],"plugins":["24.10"],"artplayerplugindanmuku":["24.10"],"xml":["24.11","24.12"],"隐藏弹幕":["24.11"],"发送弹幕":["24.12"],"弹幕大小":["24.13"],"input":["24.13"],"min":["24.13"],"max":["24.13"],"重新加载当前弹幕库":["24.14"],"切换":["24.14"],"error":["24.18"],"加载错误":["24.18"],"config":["24.18"],"配置变化":["24.18"],"外":["25.0"],"不再捆绑其它多国语言":["25.0"],"需要自行导入需要的语言":["25.0"],"您可能需要初始化容器元素的大小":["26.1"],"如":["26.1"],"等同于":["26.4"],"document":["26.27"],"queryselector":["26.27"],"menu":["26.31"],"control":["26.32"],"文本的函数":["26.37"],"修改现有的语言":["26.43"],"id":["26.47"]},{"0":["5.12","20.5","20.9"],"1":["9.8","13.25","19.8","24.13"],"2":["13.26"],"3":["22.1"],"4":["22.6","22.12","22.18","22.20","22.21","22.26","22.37","22.38","22.41","22.44","22.48","22.51"],"5":["9.8","13.23","19.8","20.9","23.9"],"6":["15.42"],"7":["15.4","15.29","22.27","22.38"],"8":["12.0","20.12","20.13","22.41","23.12"],"9":["15.5","22.29","26.29"],"10":["9.8","13.12","13.14","13.27","19.8"],"11":["22.43","26.43"],"12":["22.37","26.37"],"20":["13.11"],"22":["9.2","9.6","9.7","19.2","19.5","19.7"],"25":["24.13"],"32":["0.14","10.14"],"60":["22.34","26.34"],"120":["26.34"],"150":["9.3","19.3"],"200":["24.5"],"404":["2.11","12.11"],"500":["13.21"],"1000":["22.2"],"2000":["13.24"],"3000":["5.12","13.15"],"5000":["13.4","13.13","13.16"],"二级属性":["0.0"],"mp4":["0.1","0.11","0.12","0.13","0.15","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.29","3.30","5.1","5.2","5.3","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.17","5.18","5.19","5.21","5.25","5.26","5.30","5.31","5.35","5.36","5.37","5.39","5.41","5.47","9.1","9.6","10.8","10.9","10.10","10.16","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.39","12.41","13.30","15.1","15.2","15.3","15.8","15.9","15.10","15.11","15.13","15.14","15.18","15.19","15.21","15.25","15.30","15.31","15.32","15.34","15.35","15.36","15.37","15.46","15.47","19.6","20.5","22.33","22.34","22.50","23.5","24.15","24.16","25.1","26.7","26.25","26.33","26.36","26.50"],"console":["0.1","0.3","0.5","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.2","5.9","5.14","5.15","5.16","5.23","5.28","5.30","5.31","5.32","5.34","5.35","5.36","5.44","7.3","8.2","8.3","10.3","10.17","13.2","15.28","15.32","15.34","15.41","15.44","17.3","18.2","18.3","22.29","22.31","26.29","26.30","26.31"],"info":["0.1","0.3","0.5","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","5.9","5.14","5.16","5.23","5.28","5.31","5.32","5.34","5.35","5.36","7.3","8.2","8.3","10.3","10.17","15.28","15.34","15.41","17.3","18.2","18.3","22.29","22.31","26.29","26.30","26.31"],"warning":["0.2","1.6","5.12","10.1","10.5","10.6","15.20","15.41","21.0","22.2","22.4","22.17","22.19","22.40","23.3","23.4","26.10","26.40","26.47"],"提示":["0.2","5.12","23.3","26.47"],"为了方便区别":["0.2"],"元素和普通对象":["0.2"],"播放器里的所有":["0.2"],"click":["0.3","5.20","5.22","6.1","8.1","8.2","8.3","10.3","15.41","16.1","18.1","18.2","18.3","22.29","22.32","24.10","24.11","26.29","26.31","26.32"],"event":["0.3","24.11"],"你可以修改":["0.4"],"即可":["0.4"],"zh":["0.6"],"cn":["0.6","21.4","25.4"],"your":["0.6","10.6","15.33","20.3","21.3","21.4","22.3","25.3","25.4","26.3"],"ready":["0.7","0.8","0.11","0.13","0.14","0.15","0.16","2.6","2.18","2.22","2.24","5.9","5.11","5.13","5.14","5.15","5.16","5.18","5.19","5.23","5.28","5.30","5.31","5.32","5.33","5.34","5.35","5.36","5.45","5.46","6.5","8.5","9.9","10.7","12.2","12.18","12.22","12.24","15.9","15.11","15.13","15.14","15.23","15.28","15.31","15.32","15.34","15.35","15.36","15.44","15.45","15.46","16.5","18.5","19.9"],"html":["0.8","0.9","0.10","5.20","5.22","14.0","24.10"],"some":["0.8","0.9","0.10"],"text":["0.8","0.9","0.10","17.1"],"position":["0.9","5.22","5.37","7.1","8.4","14.0","17.1","18.4","24.10"],"video":["0.11","0.12","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.28","3.29","3.30","5.1","5.6","5.7","5.8","5.10","5.15","5.17","5.18","5.19","5.21","5.24","5.25","5.26","5.27","5.29","5.30","5.37","5.39","5.41","5.47","9.1","10.8","10.9","10.10","10.16","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.23","12.24","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","15.21","15.30","15.31","15.32","15.36","15.37","15.47","19.6","20.5","22.25","22.33","22.34","22.42","22.50","23.5","24.7","24.16","25.1","26.7","26.17","26.25","26.33","26.36","26.50"],"on":["0.11","0.12","0.13","0.14","0.15","0.16","2.6","2.11","2.12","2.18","2.24","5.8","5.9","5.10","5.11","5.13","5.14","5.15","5.16","5.18","5.19","5.21","5.23","5.28","5.30","5.31","5.32","5.34","5.35","5.36","5.45","5.46","6.4","6.5","7.4","10.9","10.10","12.2","12.6","12.18","12.22","12.24","15.9","15.11","15.13","15.14","15.23","15.30","15.31","15.32","15.34","15.35","15.36","15.45","15.46","16.4","16.5","17.4","22.4"],"assets":["0.12","1.1","2.1","2.3","2.4","2.14","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","5.1","5.4","5.5","5.6","5.7","5.17","5.24","5.26","5.27","5.29","5.38","5.39","5.40","5.41","5.42","5.43","10.8","10.9","10.10","10.13","10.15","10.16","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.28","13.29","13.30","15.1","15.6","15.7","15.8","15.10","15.11","15.13","15.15","15.17","15.18","15.19","15.21","15.24","15.25","15.26","15.27","15.30","15.36","19.1","19.6","21.1","22.25","22.33","22.36","22.42","22.50","24.7","24.8","24.16","26.5","26.7","26.17","26.25","26.36","26.37","26.42"],"sample":["0.12","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","3.30","5.1","5.6","5.7","5.8","5.10","5.17","5.24","5.25","5.26","5.27","5.29","5.37","5.38","5.39","5.40","5.41","5.42","9.1","10.8","10.9","10.10","10.13","10.15","10.16","12.1","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.29","13.30","15.1","15.3","15.8","15.9","15.10","15.11","15.13","15.14","15.15","15.18","15.19","15.21","15.25","15.30","15.31","15.32","15.35","15.36","15.37","15.47","19.1","19.6","21.1","22.25","22.33","22.36","22.42","22.50","24.7","24.16","25.1","26.5","26.7","26.17","26.25","26.36","26.37","26.42","26.50"],"subtitleoffset":["0.16"],"return":["0.17","9.3","9.4","10.17","19.3","19.4","24.9","24.12"],"name":["0.17","10.17"],"something":["0.17"],"dosomething":["0.17"],"一级属性":["1.0","5.0"],"app":["1.1","3.3","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.22","3.23","3.28","3.29","3.33","5.4","5.5","5.6","5.7","5.24","5.26","5.29","5.38","5.40","5.42","5.43","10.8","10.9","10.10","10.13","10.15","10.16","12.1","12.3","12.4","12.5","12.14","12.15","12.32","12.33","12.34","12.35","12.36","12.37","12.38","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.28","13.29","13.30","15.6","15.7","15.15","15.17","15.18","15.19","15.24","15.25","15.26","15.27","15.29","15.38","15.39","15.40","15.43","19.1","19.6","20.13","21.1","22.5","22.9","22.13","22.25","22.27","22.33","22.36","22.37","22.42","24.8","26.5","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.23","26.24","26.26","26.28","26.36","26.37","26.38","26.41","26.42","26.44","26.45","26.46","26.48","26.49","26.51"],"url":["1.1","3.6","3.7","3.8","3.9","3.10","3.17","3.22","3.28","3.29","5.4","5.5","5.6","5.7","5.24","5.26","5.27","5.29","5.38","5.39","5.40","5.41","5.42","5.43","10.8","10.9","10.10","10.13","10.15","10.16","12.1","12.3","12.4","12.5","12.9","12.11","12.13","12.14","12.15","12.19","12.21","12.23","12.25","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.28","13.29","13.30","15.1","15.6","15.7","15.15","15.17","15.21","15.24","15.25","15.26","15.27","15.30","15.38","15.39","15.40","15.43","19.1","19.6","21.1","22.3","22.25","22.42","22.50","23.5","24.7","24.8","24.16","26.3","26.5","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.25","26.26","26.38","26.42","26.45","26.46","26.51"],"全部工具函数请参考以下地址":["1.6"],"js":["1.11","10.11","10.12","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.2","13.34","15.5","15.29","22.11","22.21","22.37","22.38","22.41","22.48","22.51"],"emit":["2.0","12.0"],"focus":["2.0","12.0"],"移除事件":["2.0"],"true":["2.16","2.17","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.39","3.30","5.2","5.3","5.21","6.2","6.4","6.5","9.1","9.6","10.16","12.17","12.20","12.28","13.1","13.20","13.33","15.2","15.3","16.2","16.4","16.5","19.6","24.16","26.10","26.33","26.47"],"setting":["2.17","2.20","2.28","3.30","9.1","9.6","12.17","12.20","13.30","19.6"],"fullscreen":["2.22"],"srt":["2.28","2.29","2.30","2.31","12.31"],"并调用":["2.46"],"但数据意外未出现":["2.58"],"属性名字全部都是大写的形式":["3.0"],"未来容易发生变动":["3.0"],"new":["3.1","3.4","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.34","10.8","10.9","10.10","10.11","10.12","10.13","10.15","11.1","13.1","13.3","13.4","13.10","13.11","13.12","13.13","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.26","13.27","13.28","13.29","13.31","13.32","13.33","15.4","15.5","15.26","15.29","15.38","15.39","15.40","15.42","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.23","22.24","22.26","22.28","22.35","22.36","22.37","22.38","22.41","22.44","22.45","22.46","22.48","22.49","22.51","23.9","26.6","26.11","26.22","26.35","26.37","26.41"],"container":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","3.34","5.5","5.29","10.8","10.9","10.10","10.11","10.12","10.13","10.15","10.16","11.1","13.3","13.6","13.7","13.8","13.9","13.10","13.11","13.17","13.22","13.28","13.29","15.4","15.5","15.6","15.7","15.15","15.17","15.24","15.26","15.27","15.29","15.38","15.39","15.40","15.42","15.43","19.1","20.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.20","22.23","22.24","22.26","22.27","22.28","22.36","22.37","22.45","22.46","22.49","22.51","23.3","23.10","24.8","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.26","26.28","26.36","26.37","26.38","26.41","26.44","26.45","26.46","26.48","26.49","26.51"],"log":["3.2","5.44","15.44"],"art":["3.14","3.15","3.16","3.19","3.20","3.25","3.26","3.31","3.34","10.8","10.9","10.10","10.11","10.13","10.15","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.28","13.31","13.32","13.33","15.4","15.5","15.26","15.29","15.42","20.9","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.23","22.24","22.26","22.36","22.37","22.38","22.44","22.45","22.46","22.48","22.49","22.51","23.9","26.11","26.22","26.27","26.37"],"var":["3.34","10.8","10.9","10.10","10.11","10.12","11.1","13.1","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.5","15.29","15.42","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.23","22.24","22.26","22.27","22.35","22.36","22.37","22.38","22.41","22.44","22.45","22.46","22.48","22.49","22.51","26.11","26.35","26.37"],"show":["4.0","6.2","6.3","6.4","14.0","16.2","16.3","16.4"],"block":["4.0","14.0"],"hide":["4.0","14.0"],"controls":["4.0","5.37","15.37","24.10"],"tooltip":["4.0","7.1","9.7","17.1","19.7","26.32"],"muted":["5.2","5.3","5.25","15.2","15.3","26.10"],"seek":["5.11","5.13"],"t":["5.12"],"right":["5.20","5.22","8.3","8.4","14.0","17.1","18.3","18.4","24.10","26.29"],"switch":["5.20","15.12"],"function":["5.20","5.22","6.1","8.1","8.2","8.3","11.0","16.1","18.1","18.2","18.3","22.29","22.31","22.32","24.9","24.11","24.13","26.29","26.31"],"theme":["5.44","15.44"],"settimeout":["5.45","6.5","8.5","9.9","10.14","15.45","16.5","18.5","19.9","26.2"],"subtitle":["5.47","12.29","12.30"],"object":["6.1","8.1"],"组件样式对象":["6.1","8.1"],"false":["6.2","6.3","6.4","9.5","13.18","13.19","13.31","13.34","16.2","16.3","16.4","19.5","24.6"],"update":["6.5","8.5","9.9"],"组件挂载后触发":["7.1"],"组件的提示文本":["7.1"],"yellow":["7.2","17.2"],"02":["7.2","17.2"],"onselect":["7.2","17.2"],"item":["7.2","9.5","17.2"],"dom":["7.2","17.2"],"args":["7.3","8.2","8.3","17.3","18.2","18.3","22.29","22.31","22.32","26.29","26.31"],"mounted":["7.3","8.2","8.3","17.3","18.2","18.3","24.13"],"style":["7.4","14.0","17.4","20.5","22.32","23.5","24.13","26.32"],"color":["7.4","17.4","22.32","24.4","26.32"],"red":["7.4","17.4"],"control":["7.5","17.5"],"by":["7.5","8.5","9.9","17.5","18.5","19.9","22.2"],"absolute":["8.4","14.0","18.4"],"top":["8.4","14.0","18.4"],"50px":["8.4","18.4"],"the":["8.5","9.9","18.5","19.9"],"button":["9.2","19.2"],"img":["9.2","9.6","9.7","14.0","19.2","19.5","19.7","22.39"],"height":["9.2","9.6","19.2","19.5","20.5","22.1","23.5","26.1"],"src":["9.2","9.5","14.0","19.2","19.5","22.39","26.39"],"quality":["9.3","19.3"],"1080p":["9.3","19.3"],"state":["9.5","22.39","24.6","26.39"],"svg":["9.5","9.8","19.5","19.8"],"settings":["9.6","10.4","19.2","19.6"],"slider":["9.6"],"5x":["9.6","9.7","19.6","19.7"],"width":["9.6","9.7","14.0","19.5","19.7","20.5","22.1","23.5","26.1"],"icon":["9.7","19.7"],"range":["9.8","19.8"],"instance":["10.0","23.4"],"which":["10.0","11.0"],"note":["10.1","15.20","15.22","15.41","22.2","22.4","22.17","22.19"],"if":["10.1","10.4","15.41","20.11","22.47","24.11","24.12"],"you":["10.1","10.4","15.41"],"directly":["10.1","20.4"],"regular":["10.2"],"objects":["10.2"],"within":["10.2"],"are":["10.2"],"mouseenter":["10.3"],"instances":["10.4"],"share":["10.4"],"same":["10.4","15.12","22.47"],"localstorage":["10.4"],"and":["10.4","12.46","15.12"],"want":["10.4"],"different":["10.4"],"players":["10.4"],"use":["10.4"],"loading":["10.5","12.54"],"this":["10.5","22.40"],"is":["10.5","12.48","15.33","20.4"],"using":["10.6"],"can":["10.6","22.40"],"only":["10.6","22.40"],"to":["10.7","11.6","15.20","15.22","20.5","23.5"],"artplayer":["10.8","10.9","10.10","10.11","10.12","10.13","10.15","10.16","11.1","13.1","13.34","15.4","15.6","15.15","15.17","15.26","15.29","15.38","15.39","15.40","15.42","22.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.28","22.35","22.36","22.37","22.38","22.44","22.45","22.46","22.49","22.51","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.24","26.28","26.35","26.37","26.38","26.41","26.44","26.48","26.49","26.51"],"classname":["10.11","13.34","22.11","22.22"],"run":["10.11","13.34","22.11","22.22"],"code":["10.11","13.34","15.5","22.11","22.22"],"flip":["10.16"],"playbackrate":["10.16"],"constructor":["11.0"],"please":["11.6"],"refer":["11.6"],"remove":["12.0"],"listener":["12.0"],"end":["12.42","12.43"],"without":["12.42","12.43"],"duration":["12.45"],"partially":["12.46"],"reached":["12.47"],"its":["12.47"],"not":["12.48","20.4"],"has":["12.49","12.60"],"delayed":["12.53"],"due":["12.53","15.20","15.22","22.17"],"changed":["12.55"],"completed":["12.56"],"begun":["12.57"],"been":["12.59"],"temporary":["12.62"],"lack":["12.62"],"subject":["13.0"],"change":["13.0"],"div":["13.34","20.13","22.11","22.22","23.13"],"100px":["14.0"],"display":["14.0","24.13"],"none":["14.0"],"20px":["14.0"],"have":["15.12","15.16","20.3"],"functionality":["15.12"],"a":["15.16","21.0"],"such":["15.16"],"as":["15.16"],"live":["15.16"],"streams":["15.16"],"or":["15.16","17.1","22.1"],"browser":["15.20","15.22","22.17"],"security":["15.20","15.22","22.17"],"mechanisms":["15.20","15.22","22.17"],"page":["15.20","15.22","22.10"],"must":["15.22","20.3"],"jpg":["15.23"],"json":["15.28"],"stringify":["15.28"],"useful":["15.33"],"but":["15.33"],"need":["15.41"],"left":["17.1"],"pnpm":["20.1","23.1","24.2"],"com":["20.2","20.11","23.2","23.11"],"so":["20.3"],"defined":["20.3"],"reactive":["20.4"],"modifying":["20.4"],"path":["20.5","23.5"],"600px":["20.5","23.5"],"400px":["20.5","22.1","26.1"],"margin":["20.5"],"60px":["20.5"],"auto":["20.5"],"when":["20.6","21.0"],"importing":["20.6"],"null":["20.8","23.8"],"volume":["20.9"],"option":["20.10","23.10"],"tip":["20.11"],"lang":["20.12","21.2","21.3"],"en":["20.12","23.12"],"head":["20.12","23.12"],"meta":["20.12","20.13","23.12"],"charset":["20.12","20.13","23.12"],"utf":["20.12","20.13","23.12"],"body":["20.13","23.13"],"class":["20.13","23.13"],"needed":["21.0"],"cannot":["21.0"],"matched":["21.0"],"script":["21.2","25.2"],"play":["21.4","22.19","25.4"],"css":["22.1"],"300px":["22.1","26.1"],"three":["22.2"],"file":["22.2"],"formats":["22.2"],"caches":["22.7"],"last":["22.7"],"level":["22.7"],"immediately":["22.10"],"upon":["22.10"],"load":["22.10"],"space":["22.19"],"toggle":["22.19"],"pause":["22.19"],"these":["22.19"],"devices":["22.22"],"older":["22.22"],"browsers":["22.22"],"document":["22.27"],"queryselector":["22.27"],"opacity":["22.29","26.29"],"setting02":["22.30","26.30"],"green":["22.32","26.32"],"one":["22.34","26.34"],"more":["22.34","26.34"],"chance":["22.34","26.34"],"ploading":["22.39","26.39"],"gif":["22.39","26.39"],"recognition":["22.40"],"player":["22.40"],"parse":["22.40"],"suffixes":["22.40"],"like":["22.40"],"key":["22.47"],"cache":["22.47"],"progress":["22.47"],"however":["22.47"],"播放器的尺寸依赖于容器":["23.3"],"的尺寸":["23.3"],"getinstance":["23.4"],"ts":["23.6"],"types":["23.10"],"const":["23.10"],"unpkg":["23.11"],"title":["23.12"],"ffffff":["24.4"],"弹幕颜色":["24.4"],"默认为白色":["24.4"],"promise":["24.5"],"beforevisible":["24.5"],"弹幕显示前的过滤器":["24.5"],"visible":["24.5"],"弹幕层是否可见":["24.5"],"emitter":["24.5"],"是否开启弹幕发射器":["24.5"],"maxlength":["24.5"],"弹幕输入框最大长度":["24.5"],"await":["24.6"],"这里是所有弹幕的过滤器":["24.6"],"包含来自服务端的和来自用户输入的":["24.6"],"plugins":["24.9","24.15","24.16","24.17"],"artplayerplugindanmuku":["24.9","24.15","24.16","24.17"],"xml":["24.10"],"隐藏弹幕":["24.10"],"prompt":["24.12"],"请输入弹幕文本":["24.12"],"弹幕测试文本":["24.12"],"trim":["24.12"],"value":["24.13"],"flex":["24.13"],"alignitems":["24.13"],"center":["24.13"],"切换到新的弹幕库":["24.14"],"config":["24.14"],"v2":["24.14"],"fullscreenweb":["24.16"],"stop":["24.18"],"弹幕停止":["24.18"],"start":["24.18"],"弹幕开始":["24.18"],"当无法匹配到语言时":["25.0"],"会默认显示英文":["25.0"],"i18n":["25.0","25.3"],"或者使用":["26.1"],"aspect":["26.1"],"热键":["26.19"],"描述":["26.19"],"增加音量":["26.19"],"降低音量":["26.19"],"innerhtml":["26.27"],"sd":["26.33"],"后缀的识别":["26.40"],"播放器只能解析这种后缀":["26.40"],"因为播放器默认使用":["26.47"]},{"0":["23.5"],"2":["5.31"],"4":["22.11","22.22"],"5":["5.8","5.9","5.15","15.8","26.7"],"8":["2.0"],"9":["5.32","22.1"],"10":["5.11","5.13","15.11","15.13"],"16":["5.32","15.32","22.1","24.12","26.1"],"22":["19.6"],"60":["22.36","24.5","26.36"],"120":["22.34"],"180":["22.34","26.34"],"200":["24.6"],"240":["26.34"],"360":["9.3"],"720":["9.3","19.3"],"1000":["0.8","0.9","0.10","0.16","10.8","24.5","26.2"],"1080":["9.3","19.3"],"5000":["0.14","10.14"],"比较少用":["0.0"],"warning":["0.1","0.5","0.6","0.7","0.8","5.16","5.20","5.22","5.28","5.33","5.41","10.3","10.7","10.14","15.28","20.5","20.13","22.29","22.30","22.31","22.32","22.39","22.42","22.50","23.13","26.2","26.4","26.7","26.17","26.19","26.31","26.32","26.39","26.42","26.50"],"提示":["0.1","5.16","5.20","5.22","5.33","26.2","26.7","26.10","26.17"],"假如直接修改这个":["0.1"],"元素都是以":["0.2"],"开头命名的":["0.2"],"这是所有":["0.2"],"元素的定义":["0.2"],"mouseenter":["0.3"],"mouseleave":["0.3","10.3"],"loading":["0.5","12.49"],"这是所有图标的定义":["0.5"],"types":["0.5","1.6","11.6","25.0","26.50"],"使用":["0.6","24.9"],"只能更新实例化之后的":["0.6"],"to":["0.7","22.2"],"play":["0.7","4.0","5.2","10.7","15.2","21.3","22.2","25.3"],"如果想马上隐藏":["0.7"],"settimeout":["0.8","0.9","0.10","0.12","0.13","0.14","0.15","0.16","5.2","5.3","5.8","5.11","5.13","5.21","6.4","7.4","8.4","9.8","10.8","10.9","10.10","10.16","15.2","15.8","15.11","15.13","16.4","17.4","18.4","19.8"],"false":["0.8","0.9","0.10","0.15","0.16","10.8","22.29","22.31","24.4","26.29","26.31"],"left":["0.9","7.1","10.9"],"true":["0.10","0.12","0.13","2.19","3.5","3.6","3.7","3.28","3.29","5.1","5.14","5.25","5.34","6.3","10.10","12.16","12.19","12.21","12.22","12.23","12.24","12.25","12.26","12.39","13.5","13.6","13.7","13.28","13.29","13.30","15.1","15.21","15.25","15.34","16.3","19.1","22.25","22.33","26.17","26.25"],"srt":["0.11","5.47","12.28","12.29","12.30","15.47"],"ready":["0.12","5.2","5.3","5.5","5.6","5.7","5.8","5.10","5.17","5.21","5.24","5.25","5.26","5.27","5.29","6.4","7.4","8.4","9.8","10.8","10.9","10.10","10.11","10.12","10.13","10.15","10.16","12.0","12.6","15.2","15.3","15.5","15.8","15.10","15.15","15.17","15.18","15.19","15.21","15.25","15.26","15.29","15.30","16.4","17.4","18.4","19.8","24.17"],"on":["0.17","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.8","3.9","3.10","3.17","5.1","5.2","5.3","5.4","5.5","5.6","5.7","5.17","5.24","5.25","5.26","5.27","5.29","5.38","5.39","5.40","5.47","8.4","9.8","10.8","10.11","10.12","10.13","10.15","10.16","12.1","12.3","12.4","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.17","12.19","12.20","12.21","12.23","12.25","12.26","12.27","12.28","12.29","12.30","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.8","13.9","13.10","13.17","15.1","15.2","15.3","15.5","15.6","15.7","15.8","15.10","15.15","15.17","15.18","15.19","15.21","15.24","15.25","15.26","15.27","15.29","15.38","15.39","15.40","15.47","18.4","19.8","24.15","24.17","26.4"],"非常少使用":["1.0"],"sample":["1.1","3.1","3.3","3.4","3.11","3.12","3.13","3.18","3.21","3.22","3.23","3.24","3.27","3.31","3.32","3.33","3.34","5.4","5.5","5.43","10.11","10.12","11.1","13.8","13.9","13.10","13.11","13.12","13.13","13.17","13.21","13.22","13.23","13.28","13.33","13.34","15.4","15.5","15.6","15.7","15.17","15.24","15.26","15.27","15.29","15.38","15.39","15.40","15.42","15.43","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.28","22.35","22.37","22.38","22.41","22.44","22.45","22.46","22.49","22.51","23.10","24.8","26.6","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.26","26.28","26.35","26.38","26.41","26.44","26.45","26.46","26.48","26.49","26.51"],"video":["1.1","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.21","3.22","3.23","3.24","3.31","3.33","5.4","5.5","5.42","10.11","10.13","10.15","11.1","12.1","12.14","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","15.4","15.24","15.26","15.29","15.39","15.42","19.1","20.10","21.1","22.9","22.28","22.36","23.10","24.8","26.5","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.26","26.28","26.37","26.38","26.42","26.44","26.45","26.46","26.48","26.49"],"mp4":["1.1","3.8","3.9","3.10","3.17","3.22","3.28","3.34","5.4","5.5","5.6","5.7","5.24","5.27","5.29","5.38","5.40","5.42","5.43","10.11","10.12","10.13","10.15","12.1","12.3","12.4","12.5","12.14","12.15","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.40","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","15.4","15.5","15.6","15.7","15.15","15.17","15.24","15.26","15.27","15.29","15.38","15.39","15.40","15.42","15.43","19.1","20.10","21.1","22.5","22.14","22.15","22.16","22.25","22.36","22.37","22.38","22.42","23.10","24.7","24.8","26.5","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.26","26.37","26.38","26.42","26.45","26.46","26.51"],"artplayer":["1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.2","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.2","22.11","22.21","22.22","22.41","22.48"],"d":["1.6"],"info":["1.11","2.12","5.15","5.26","5.29","5.30","5.41","5.42","9.5","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","15.9","15.14","15.15","15.23","15.26","15.29","15.30","15.31","15.32","15.35","15.36","19.5","22.32","24.17","26.32"],"const":["2.0","5.18","5.19","9.5","12.0","15.18","15.19","19.5","20.10","24.13"],"onready":["2.0","12.0"],"console":["2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","5.25","5.26","5.29","5.39","5.41","5.42","5.43","9.5","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","12.7","12.8","12.9","12.10","12.12","12.13","12.27","12.31","12.41","15.9","15.14","15.15","15.23","15.26","15.29","15.30","15.31","15.35","15.36","15.42","15.43","19.5","20.5","22.32","23.5","24.17","26.32"],"event":["2.5","2.7","2.8","2.9","2.10","2.12","2.13","2.22","2.41","5.41","9.2","9.5","12.5","12.7","12.8","12.9","12.10","12.12","12.13","12.22","12.41","16.1","18.1"],"reconnecttime":["2.11","12.11"],"state":["2.12","2.15","2.16","2.21","2.23","2.24","2.25","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","9.2","9.6","9.7","12.12","12.15","12.21","12.23","12.24","12.25","12.32","12.33","12.34","12.35","12.36","12.37","12.38","19.2","19.7"],"height":["2.18","9.7","19.6","19.7"],"datauri":["2.26","12.26"],"currenttime":["2.27","12.27"],"offset":["2.28"],"cues":["2.29","2.30","2.31","12.29","12.30","12.31"],"option":["2.31","12.31"],"load":["2.46","12.46"],"方法重新加载它":["2.46"],"基本上用不到":["3.0"],"app":["3.1","3.4","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.24","3.25","3.26","3.27","3.31","3.32","3.34","10.11","10.12","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","13.34","15.4","15.5","15.42","20.10","22.3","22.6","22.8","22.11","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.24","22.26","22.28","22.35","22.38","22.41","22.44","22.45","22.46","22.48","22.49","22.51","23.10","23.13","26.3","26.11","26.22","26.35"],"url":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","3.34","10.12","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","13.34","15.4","15.5","15.29","15.42","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.24","22.26","22.28","22.35","22.38","22.44","22.45","22.46","22.48","22.49","22.51","23.10","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.24","26.27","26.28","26.35","26.44","26.48","26.49"],"assets":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","3.34","10.11","10.12","11.1","13.3","13.4","13.8","13.9","13.10","13.11","13.12","13.13","13.17","13.18","13.21","13.22","13.23","13.24","13.26","13.27","13.31","13.32","13.33","13.34","15.4","15.5","15.29","15.38","15.39","15.40","15.42","15.43","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.24","22.26","22.28","22.35","22.37","22.38","22.41","22.44","22.45","22.46","22.48","22.49","22.51","23.10","26.3","26.6","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.26","26.27","26.28","26.35","26.38","26.41","26.44","26.45","26.46","26.48","26.49","26.51"],"loop":["3.5","3.6","3.7","13.5","13.6","13.7"],"flip":["3.5","3.6","3.7","13.5","13.6","13.7"],"dblclick":["3.17"],"setting":["3.28","3.29","12.28","13.28","13.29","19.1","24.13"],"playbackrate":["3.28","13.28"],"contextmenu":["3.28","3.29","3.30","13.29","13.30"],"aspectratio":["3.29","10.16","13.29"],"show":["3.29","3.30","9.8","13.30","19.8","22.29","22.31","24.11","24.18","26.29","26.31"],"click":["4.0","5.37","5.41","14.0","15.37"],"marginright":["4.0","14.0"],"比较常用":["5.0"],"muted":["5.1","15.1","15.25"],"seek":["5.8","15.8","15.11","15.13"],"switch":["5.12"],"和":["5.12","7.1","24.5"],"的功能是一样的":["5.12"],"只是":["5.12"],"有的视频是没有时长的":["5.16"],"async":["5.18","5.19","15.18","15.19"],"await":["5.18","5.19","15.18","15.19"],"t":["5.23"],"json":["5.28"],"stringify":["5.28"],"resize":["5.33","24.15"],"当你的容器只有宽度":["5.33"],"playsinline":["5.34","15.34"],"m3u8":["5.35","22.2","26.41"],"000":["5.36"],"right":["5.37","7.1","15.37"],"html":["5.37","10.8","10.9","10.10","15.37","20.1","23.1"],"timeupdate":["5.39"],"green":["5.44","15.44"],"1080p":["5.45","15.45"],"png":["5.46","15.46","22.36","22.39","26.36","26.39"],"组件点击事件":["6.1","8.1"],"mounted":["6.1","8.1","16.1","18.1","22.29","26.29"],"组件挂载后触发":["6.1","8.1"],"get":["6.2","6.3","7.2","7.3","8.2","8.3","16.2","16.3","17.2","17.3","18.2","18.3"],"the":["6.2","6.3","6.4","6.5","7.2","7.3","7.4","8.2","8.3","8.4","9.8","16.2","16.3","16.4","16.5","17.2","17.3","17.4","18.2","18.3","18.4","19.8","22.19"],"element":["6.2","6.3","7.2","7.3","8.2","8.3","16.2","16.3","17.2","17.3","18.2","18.3"],"of":["6.2","6.3","7.2","7.3","8.2","8.3","10.5","12.53","12.62","15.41","16.2","16.3","17.1","17.2","17.3","18.2","18.3"],"by":["6.2","6.3","6.4","6.5","7.2","7.4","8.4","16.2","16.3","16.4","16.5","17.2","17.4","18.4"],"delete":["6.4","7.4","8.4","9.8","16.4","17.4","18.4","19.8"],"控制控制器出现的左右位置":["7.1"],"selector":["7.1","17.1"],"array":["7.1","17.1"],"return":["7.2","17.2"],"control":["7.2","7.3","7.4","17.2","17.3","17.4"],"200px":["8.5","18.5"],"svg":["9.2","9.6","9.7","19.2","19.6","19.7"],"item":["9.2","9.6","19.2"],"720p":["9.3","19.3"],"360p":["9.3","19.3"],"nextstate":["9.5","19.5"],"src":["9.6","9.7","19.6","19.7"],"pip":["9.9","19.9"],"mode":["9.9","19.9"],"close":["9.9","19.9"],"are":["10.0","11.0","15.0","22.2"],"less":["10.0"],"commonly":["10.0","15.0"],"modify":["10.1","10.4","20.11","20.13"],"this":["10.1","10.2"],"object":["10.1"],"named":["10.2"],"with":["10.2","20.12","23.12"],"a":["10.2","12.48","15.12"],"prefix":["10.2"],"is":["10.2","15.12","20.5"],"definition":["10.2","10.5"],"note":["10.3","10.14","15.28","20.13"],"if":["10.3","10.6","10.7","22.4","22.17"],"you":["10.3","10.6","10.7","15.33","22.47"],"need":["10.3","20.11","20.13","22.47"],"that":["10.3","15.16"],"only":["10.3","10.14","15.5","15.41","22.19"],"exist":["10.3","15.41"],"during":["10.3"],"can":["10.4"],"after":["10.6","10.14","16.1","18.1","22.19"],"instantiation":["10.6"],"want":["10.6","10.7"],"before":["10.6","20.13"],"hide":["10.7","24.18"],"some":["10.8","10.9","10.10"],"text":["10.8","10.9","10.10","24.7","24.9"],"position":["10.9","15.37"],"these":["10.14","15.16"],"take":["10.14","22.19"],"effect":["10.14","22.19"],"subtitleoffset":["10.16"],"something":["10.17"],"dosomething":["10.17"],"very":["11.0"],"rarely":["11.0"],"following":["11.6","20.11"],"address":["11.6"],"off":["12.0"],"having":["12.42"],"stop":["12.42"],"for":["12.42","21.0","22.10","22.30","22.31","22.32"],"stopping":["12.43"],"buffer":["12.43"],"property":["12.45"],"changes":["12.45"],"method":["12.46","15.12"],"called":["12.46"],"end":["12.47"],"point":["12.47"],"supported":["12.48","22.2"],"finished":["12.49"],"lack":["12.53"],"resource":["12.54"],"unexpectedly":["12.58"],"not":["12.58","20.5"],"suspended":["12.59"],"been":["12.60","15.16"],"updated":["12.60"],"future":["13.0"],"and":["13.0","20.11"],"container":["13.1","13.4","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","13.34","20.10","22.3","22.18","22.21","22.22","22.35","22.38","22.41","22.44","22.48","26.35"],"log":["13.2","20.5","23.5"],"new":["13.14","13.15","13.16","13.25","13.34","20.8","20.9","22.11","22.22","22.27","23.8","26.27"],"var":["13.34","22.11","22.22"],"art":["13.34","22.11","22.22","22.27"],"controls":["14.0","17.1"],"tooltip":["14.0"],"which":["15.0"],"returns":["15.12"],"promise":["15.12","24.9"],"it":["15.12","15.33","15.41","20.13"],"resolve":["15.12"],"s":["15.12","15.41","22.47"],"fully":["15.16"],"decoded":["15.16"],"in":["15.16","20.4"],"must":["15.20","22.10"],"have":["15.20","15.22"],"prior":["15.20","15.22"],"user":["15.20","15.22"],"interaction":["15.20","15.22"],"e":["15.20","15.22","22.7"],"g":["15.20","15.22","22.7"],"has":["15.20","15.22","22.47"],"clicked":["15.22"],"dimension":["15.28"],"an":["15.33","22.4"],"unknown":["15.33"],"calculates":["15.33"],"duration":["15.41"],"lifecycle":["15.41"],"triggered":["16.1","18.1"],"mount":["16.1","18.1"],"list":["17.1"],"objects":["17.1"],"img":["19.6"],"width":["19.6"],"tip":["20.3","20.9","23.3","23.9","23.11"],"see":["20.3"],"more":["20.3","22.10","22.42"],"examples":["20.3"],"at":["20.3"],"will":["20.4"],"current":["20.8","23.8"],"full":["20.9"],"typescript":["20.9","23.9"],"support":["20.11"],"even":["20.11"],"older":["20.11"],"configuration":["20.11","22.31","22.32"],"title":["20.12"],"import":["20.12","23.12"],"map":["20.12","23.12"],"displayed":["21.0"],"i18n":["21.0","21.3"],"implementation":["21.0"],"lang":["21.1","25.1"],"window":["21.2","25.2"],"imported":["21.4","25.4"],"use":["22.1"],"aspect":["22.1"],"ratio":["22.1","26.1"],"ogg":["22.2","26.2"],"webm":["22.2","26.2"],"other":["22.2"],"like":["22.2"],"or":["22.2"],"flv":["22.2"],"inside":["22.4"],"callback":["22.4"],"refers":["22.4"],"instance":["22.4"],"however":["22.4"],"arrow":["22.4"],"upon":["22.7"],"next":["22.7"],"initialization":["22.7"],"page":["22.7"],"refresh":["22.7"],"be":["22.10"],"set":["22.10"],"capture":["22.17"],"may":["22.17"],"fail":["22.17"],"source":["22.17"],"player":["22.19"],"gains":["22.19"],"focus":["22.19"],"js":["22.22"],"innerhtml":["22.27"],"component":["22.31","22.32"],"sd":["22.33"],"480p":["22.33","26.33"],"谁でもいいはずなのに":["22.34","26.34"],"夏の想い出がまわる":["22.34","26.34"],"all":["22.39"],"icon":["22.39"],"but":["22.40"],"cannot":["22.40"],"zh":["22.43","26.43"],"cn":["22.43","26.43"],"different":["22.47"],"variable":["22.50"],"reference":["22.50"],"所以你的容器":["23.3"],"必须是有尺寸的":["23.3"],"以下链接可以看到更多的使用例子":["23.3"],"非响应式":["23.4"],"在":["23.4"],"400px":["23.5"],"margin":["23.5"],"60px":["23.5"],"auto":["23.5"],"全部":["23.9"],"定义":["23.9"],"volume":["23.10"],"假如你要兼容更古老的浏览器时":["23.11"],"请修改以下配置然后自行构建":["23.11"],"body":["23.12"],"border":["24.4"],"弹幕是否有描边":["24.4"],"默认为":["24.4"],"locktime":["24.5"],"输入框锁定时间":["24.5"],"theme":["24.5"],"dark":["24.5","24.16"],"弹幕主题":["24.5"],"支持":["24.5"],"length":["24.6"],"这是弹幕即将显示的时触发的函数":["24.6"],"当返回true后才表示可以马上发送到播放器里":["24.6"],"弹幕已经出现在播放器里":["24.6"],"你可以访问到弹幕的dom元素里":["24.6"],"plugins":["24.7","24.8"],"artplayerplugindanmuku":["24.7","24.8"],"resovle":["24.9"],"function":["24.10","26.32"],"target":["24.11"],"innertext":["24.11"],"else":["24.11"],"color":["24.12"],"math":["24.12"],"floor":["24.12"],"random":["24.12"],"0xffffff":["24.12"],"tostring":["24.12"],"queryselector":["24.13"],"addeventlistener":["24.13"],"追加":["24.14"],"追加新的弹幕库":["24.14"],"参数类型和option":["24.14"],"danmuku相同":["24.14"],"xml":["24.15","24.17"],"弹幕隐藏":["24.18"],"弹幕显示":["24.18"],"写法参考":["25.0","26.50"],"默认支持三种视频文件格式":["26.2"],"播放器会缓存最后一次音量的大小":["26.7"],"假如希望默认进入页面就能自动播放视频":["26.10"],"必需为":["26.10"],"视频快进":["26.19"],"视频快退":["26.19"],"space":["26.19"],"切换播放":["26.19"],"暂停":["26.19"],"subtitle":["26.25"],"args":["26.32"],"hd":["26.33"],"webkit":["26.38"],"全部图标的定义":["26.39"],"但无法解析这种后缀":["26.40"],"作为":["26.47"],"key":["26.47"],"来缓存播放进度的":["26.47"],"但假如你的同一个视频的":["26.47"]},{"0":["5.10","5.11","5.13","5.16","5.23","15.10","15.11","15.13","15.16","15.23","20.10","23.10"],"1":["5.47","9.7","15.47","19.7","24.7","24.9"],"2":["5.8","15.8","15.31"],"5":["5.6","5.7","9.7","15.6","15.7","15.9","15.15","19.7","20.10","23.10"],"9":["15.32","26.1"],"10":["5.46","9.7","15.46","19.7","22.36","26.36"],"60":["5.46","15.46"],"240":["22.34"],"300":["22.34","26.34"],"360":["19.3"],"404":["3.14","3.15","13.14","13.15"],"1000":["0.13","0.15","10.9","10.10","10.13","10.15","10.16"],"3000":["0.12","5.2","5.3","5.8","5.11","5.13","5.21","5.45","6.4","6.5","7.4","7.5","8.4","8.5","9.8","9.9","10.12","15.2","15.3","15.8","15.11","15.13","15.21","15.45","16.4","16.5","17.4","17.5","18.4","18.5","19.8","19.9"],"对象":["0.1"],"播放器不会马上做出响应":["0.1"],"types":["0.2","2.0","10.2","10.5","20.9","21.0","22.39","22.50","23.9","26.39"],"d":["0.2","0.5","2.0","10.2","10.5","11.6","12.0","21.0","22.39","22.50","25.0","26.39","26.50"],"ts":["0.2","0.5","1.6","2.0","10.2","10.5","11.6","12.0","21.0","22.39","22.50","25.0","26.39","26.50"],"warning":["0.3","0.9","0.10","0.14","0.16","2.0","10.8","10.9","10.10","10.16","12.0","22.1","22.36","22.43","23.5","26.1","26.29","26.30","26.36","26.43"],"提示":["0.3","0.14","5.28","5.41","23.13","26.1","26.4","26.19"],"假如你需要一些":["0.3","5.41"],"事件只存在于播放器的生命周期上时":["0.3","5.41"],"强烈建议使用这些函数":["0.3"],"以避免造成内存泄漏":["0.3","5.41"],"your":["0.4","5.17","10.4","15.17"],"假如想在实例化之前更新":["0.6"],"请使用基础选项的":["0.6"],"来更新":["0.6"],"的显示":["0.7"],"组件配置":["0.8","0.9","0.10","26.29","26.31","26.32"],"请参考以下地址":["0.8","0.9","0.10","0.16","26.29","26.30","26.31","26.32"],"component":["0.8","0.9","0.10","0.16","10.8","10.9","10.10","10.16","22.29","22.30","26.29","26.30","26.31","26.32"],"color":["0.11","10.11","22.37","26.37"],"red":["0.11","10.11"],"false":["0.12","0.13","5.21","9.9","10.9","10.10","10.12","10.13","10.15","10.16","15.21","19.9","22.22","22.45","26.22","26.45"],"只在播放器获得焦点后":["0.14","26.19"],"如点击了播放器后":["0.14","26.19"],"这些快捷键才会生效":["0.14","26.19"],"true":["0.15","3.11","3.12","3.13","3.21","3.22","3.23","3.24","5.24","10.12","10.13","10.15","13.11","13.12","13.13","13.21","13.22","13.23","13.24","15.14","15.24","22.8","22.9","22.11","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.23","22.24","22.26","22.27","22.38","22.44","22.46","22.48","22.49","24.12","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.23","26.24","26.26","26.27","26.38","26.44","26.46","26.48","26.49"],"设置面板":["0.16"],"html":["0.16","10.16","22.42","22.43","24.2","26.42","26.43"],"ready":["0.17","2.0","5.1","5.4","5.47","10.17","15.1","15.4","15.6","15.7","15.24","15.27","15.47"],"off":["2.0"],"全部事件请参考以下地址":["2.0"],"events":["2.0"],"info":["2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","5.18","5.19","5.25","5.38","5.39","5.40","5.43","9.2","9.6","12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.31","15.18","15.19","15.25","15.38","15.39","15.40","15.42","15.43","19.2","19.6"],"console":["2.2","2.6","2.19","2.28","2.39","3.8","3.9","3.10","3.17","5.18","5.19","5.38","5.40","9.2","9.6","12.1","12.2","12.3","12.4","12.5","12.6","12.11","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.28","12.29","12.30","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","13.8","13.9","13.10","13.17","15.18","15.19","15.25","15.38","15.39","15.40","19.2","19.6"],"log":["2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.8","3.9","3.10","3.17","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.8","13.9","13.10","13.17"],"video":["3.1","3.3","3.4","3.16","3.18","3.19","3.20","3.25","3.26","3.27","3.32","13.3","13.4","13.11","13.12","13.13","13.16","13.18","13.19","13.20","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","22.3","22.6","22.8","22.11","22.12","22.18","22.20","22.21","22.22","22.23","22.24","22.26","22.27","22.35","22.44","22.49","26.3","26.11","26.27","26.35"],"mp4":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.20","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","13.34","22.3","22.6","22.8","22.9","22.11","22.12","22.13","22.18","22.20","22.21","22.22","22.23","22.24","22.26","22.27","22.28","22.35","22.44","22.45","22.46","22.48","22.49","22.51","26.3","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.24","26.27","26.28","26.35","26.44","26.48","26.49"],"playbackrate":["3.5","3.6","3.7","13.5","13.6","13.7"],"aspectratio":["3.5","3.6","3.7","13.5","13.6","13.7"],"autoplayback":["3.11","3.12","3.13","13.11","13.12","13.13"],"sample":["3.14","3.15","3.16","3.19","3.20","3.25","3.26","13.1","13.3","13.4","13.14","13.15","13.16","13.18","13.19","13.20","13.24","13.25","13.26","13.27","13.31","13.32","22.3","22.11","22.21","22.22","22.27","22.48","26.3","26.27"],"autoorientation":["3.21","13.21"],"show":["3.22","3.28","13.22","13.28","13.29"],"fastforward":["3.23","3.24","13.23","13.24"],"fullscreenweb":["3.31","13.31"],"miniprogressbar":["3.33","13.33"],"只销毁界面":["3.34"],"不主动清空":["3.34"],"pause":["4.0","14.0"],"layer":["4.0","14.0"],"png":["4.0","14.0"],"仅重置":["5.5"],"不移除界面":["5.5"],"t":["5.10","5.11","5.13","15.10","15.11","15.13","15.23"],"方法会返回":["5.12"],"promise":["5.12"],"当":["5.12"],"resolve":["5.12"],"时表示新地址是可以播放":["5.12"],"reject":["5.12","15.12"],"时表示新地址加载错误":["5.12"],"例如直播中的视频或者没被解码完成的视频":["5.16"],"这个时候获取的时长会是":["5.16"],"name":["5.17","15.17"],"由于浏览器安全机制":["5.20","5.22","26.17"],"触发窗口全屏前":["5.20"],"页面必须先存在交互":["5.20","5.22"],"例如用户点击过页面":["5.20","5.22"],"触发画中画前":["5.22"],"默认":["5.26"],"尺寸和坐标信息是通过":["5.28"],"getboundingclientrect":["5.28","15.28"],"获取的":["5.28"],"但不知道具体高度时":["5.33"],"这个属性很有用":["5.33"],"它能自动计算出视频的高度":["5.33"],"但你需要确定设置这个属性的时机":["5.33"],"强烈建议使用该函数":["5.41"],"4k":["5.45","15.45"],"number":["5.46","15.46","24.13"],"column":["5.46","15.46"],"tooltip":["6.1","8.1","16.1","18.1"],"组件的提示文本":["6.1","8.1"],"remove":["6.4","7.4","8.4","9.8","16.4","17.4","18.4"],"选择列表的对象数组":["7.1"],"onselect":["7.1","17.1"],"选择列表的元素被点击时触发的函数":["7.1"],"by":["7.3","8.2","8.3","9.8","17.3","18.2","18.3","19.8","22.19"],"left":["8.5","18.5","22.2"],"return":["9.2","9.5","9.6","19.2","19.5","19.6"],"switchquality":["9.3","19.3"],"open":["9.5","19.5"],"event":["9.6"],"x":["9.6","19.6"],"range":["9.7","19.7"],"switch":["9.9","19.9"],"used":["10.0","11.0","13.0","15.0","22.4"],"will":["10.1","15.16","20.5","22.4","22.7"],"not":["10.1","13.0","13.34","15.5","22.4"],"respond":["10.1"],"immediately":["10.1","10.7"],"s":["10.3"],"lifecycle":["10.3"],"strongly":["10.3","15.41"],"recommended":["10.3","15.41"],"use":["10.3","10.6","15.41","22.40"],"these":["10.3"],"functions":["10.3"],"avoid":["10.3","15.41"],"memory":["10.3","15.41"],"leaks":["10.3","15.41"],"please":["10.6","10.9","10.10","10.16","12.0","22.2","22.10","22.29","22.30","22.31","22.32"],"option":["10.6"],"in":["10.6","20.5"],"basic":["10.6"],"options":["10.6","22.1"],"refer":["10.8","10.9","10.10","10.16","12.0","22.2","22.29","22.30","22.31","22.32"],"following":["10.8","20.3"],"address":["10.8"],"for":["10.8","10.9","10.10","10.16","12.0","22.4","22.29","22.47"],"configuration":["10.8","10.9","10.10","22.29"],"srt":["10.11","22.25","26.25"],"settimeout":["10.12","10.13","10.15","15.3","15.21"],"gains":["10.14"],"focus":["10.14"],"e":["10.14","22.19"],"g":["10.14","22.19"],"clicking":["10.14","22.19"],"on":["10.17","15.4","15.20","15.22","22.2","22.19","24.6"],"a":["12.0"],"complete":["12.0"],"list":["12.0"],"of":["12.0"],"state":["12.39"],"further":["12.42"],"buffering":["12.42"],"content":["12.43"],"to":["12.46","15.33","22.29","22.30","22.31","22.32"],"reload":["12.46"],"it":["12.46","20.11"],"format":["12.48"],"data":["12.53","12.62"],"forthcoming":["12.58"],"generally":["13.0"],"assets":["13.1","13.14","13.15","13.16","13.19","13.20","13.25","22.3","22.11","22.27"],"dblclick":["13.17"],"contextmenu":["13.28"],"destroys":["13.34"],"does":["13.34"],"clear":["13.34"],"play":["14.0"],"do":["15.5"],"interface":["15.5"],"playable":["15.12"],"fails":["15.12"],"load":["15.12"],"cases":["15.16"],"obtained":["15.16","15.28"],"be":["15.16"],"clicked":["15.20","17.1"],"before":["15.20","15.22"],"triggering":["15.20","15.22"],"default":["15.26"],"is":["15.28","22.17"],"via":["15.28"],"need":["15.33"],"determine":["15.33"],"appropriate":["15.33"],"timing":["15.33"],"m3u8":["15.35","22.41","26.2"],"000":["15.36"],"timeupdate":["15.39"],"this":["15.41","22.7"],"text":["16.1","18.1"],"when":["17.1"],"item":["17.1"],"script":["20.1","23.1","24.2"],"link":["20.3"],"packages":["20.3","20.9","23.3","23.9"],"template":["20.3","23.3"],"update":["20.4","20.5"],"the":["20.4","20.5"],"player":["20.4","20.12","23.12"],"reactive":["20.5"],"directly":["20.5"],"modifying":["20.5"],"definitions":["20.9","22.39"],"volume":["20.10"],"art8":["20.10","23.10"],"new":["20.10","23.10"],"yourself":["20.11"],"scripts":["20.11","23.11"],"reference":["20.11","21.0"],"documentation":["20.11"],"browserslist":["20.11","23.11"],"body":["20.12"],"div":["20.12","23.12"],"id":["20.12","23.12"],"importing":["20.13"],"dependency":["20.13"],"take":["20.13"],"effect":["20.13"],"see":["21.0"],"or":["21.1","25.1"],"note":["22.1"],"among":["22.1"],"all":["22.1"],"only":["22.1"],"required":["22.1"],"third":["22.2"],"party":["22.2"],"libraries":["22.2"],"section":["22.2"],"point":["22.4"],"jpg":["22.5","26.5"],"ffad00":["22.6","26.6"],"read":["22.7","22.10"],"cached":["22.7"],"value":["22.7"],"information":["22.10"],"policy":["22.10","26.10"],"changes":["22.10","26.10"],"url":["22.11","22.27"],"setting":["22.14","22.15","22.16","22.25","26.14","26.15","26.16","26.25"],"cross":["22.17"],"origin":["22.17"],"with":["22.17"],"website":["22.17"],"disable":["22.22"],"hd":["22.33"],"720p":["22.33","26.33"],"こんなとこにあるはずもないのに":["22.34","26.34"],"终わり":["22.34","26.34"],"generate":["22.36"],"online":["22.36"],"tool":["22.36","26.36"],"03a9f4":["22.37","26.37"],"font":["22.37","24.5","26.37"],"size":["22.37","24.5","26.37"],"30px":["22.37","26.37"],"webkit":["22.38"],"playsinline":["22.38","26.38"],"therefore":["22.40"],"if":["22.40"],"you":["22.40"],"best":["22.40"],"also":["22.40"],"settings":["22.42","22.43"],"start":["22.42","22.43","26.42","26.43"],"i18n":["22.42","26.42"],"tw":["22.43","26.43"],"more":["22.43"],"identify":["22.47"],"unique":["22.47"],"document":["22.51","26.51"],"createelement":["22.51","26.51"],"里直接修改":["23.4","23.5"],"是不会改变播放器的":["23.4","23.5"],"非响应式":["23.5"],"在":["23.5"],"构建配置":["23.11"],"build":["23.11"],"参考文档":["23.11"],"你需要在引入":["23.13"],"依赖前来修改它才会生效":["23.13"],"style":["24.4"],"弹幕自定义样式":["24.4"],"默认为空对象":["24.4"],"light":["24.5"],"只在自定义挂载时生效":["24.5"],"不透明度配置项":["24.5"],"弹幕字号配置项":["24.5"],"显示区域配置项":["24.5"],"弹幕速度配置项":["24.5"],"颜色列表配置项":["24.5"],"ref":["24.6"],"innerhtml":["24.6"],"ଘ":["24.6"],"੭ˊᵕˋ":["24.6"],"੭":["24.6"],"使用数组":["24.7"],"time":["24.7","24.9"],"异步返回":["24.9"],"显示弹幕":["24.10","24.11"],"hide":["24.11"],"border":["24.12"],"change":["24.13"],"fontsize":["24.13"],"const":["24.14"],"target":["24.14"],"xml":["24.16"],"也可以手动挂载":["24.16"],"reset":["24.18"],"弹幕重置":["24.18"],"destroy":["24.18"],"弹幕销毁":["24.18"],"全部选项里":["26.1"],"只有":["26.1"],"是必填的":["26.1"],"如需要播放":["26.2"],"或者":["26.2"],"flv":["26.2"],"等其它格式":["26.2"],"请参考左侧的":["26.2"],"第三方库":["26.2"],"回调函数里的":["26.4"],"就是播放器实例":["26.4"],"但回调函数假如使用了箭头函数":["26.4"],"则不会指向播放器实例":["26.4"],"下次初始化时":["26.7"],"如刷新页面":["26.7"],"播放器会读取该缓存值":["26.7"],"更多信息请阅读":["26.10"],"假如视频源地址和网站是跨域的":["26.17"],"可能会出现截图失败":["26.17"],"关闭毛玻璃效果":["26.22"],"在线生成预览图":["26.36"],"thumbnail":["26.36"],"所以假如你使用了":["26.40"],"最好同时要指明":["26.40"],"function":["26.41"],"更多的语言设置":["26.42","26.43"],"是不同的话":["26.47"],"那么你需要使用":["26.47"],"来标识视频的唯一":["26.47"]}]'},t={"0.0":{t:"# 高级属性",p:`这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用
+`,l:"advanced/built-in.html",a:"高级属性"},"0.1":{t:"`option`",p:`播放器的选项
+<div className="run-code">▶ Run Code< ...`,l:"advanced/built-in.html#option",a:"option"},"0.2":{t:"`template`",p:`管理播放器所有的 DOM 元素
+<div className="run-code">▶ Ru ...`,l:"advanced/built-in.html#template",a:"template"},"0.3":{t:"`events`",p:"管理播放器所有的 DOM 事件,实质上是代理了 addEventListener 和 removeEventListener ...",l:"advanced/built-in.html#events",a:"events"},"0.4":{t:"`storage`",p:`管理播放器的本地存储
+
+name 属性用于设置缓存的 key
+set 方法用于设置缓存
+get 方法用于获取缓存
+del 方 ...`,l:"advanced/built-in.html#storage",a:"storage"},"0.5":{t:"`icons`",p:`管理播放器所有的 svg 图标
+<div className="run-code">▶ Ru ...`,l:"advanced/built-in.html#icons",a:"icons"},"0.6":{t:"`i18n`",p:`管理播放器的 i18n
+
+get 方法用于获取 i18n 的值
+update 方法用于更新 i18n 对象
+
+<div ...`,l:"advanced/built-in.html#i18n",a:"i18n"},"0.7":{t:"`notice`",p:`管理播放器的提示语,只有一个 show 属性用于显示提示语
+<div className="run-code ...`,l:"advanced/built-in.html#notice",a:"notice"},"0.8":{t:"`layers`",p:`管理播放器的层
+
+add 方法用于动态添加层
+remove 方法用于动态删除层
+update 方法用于动态更新层
+show  ...`,l:"advanced/built-in.html#layers",a:"layers"},"0.9":{t:"`controls`",p:`管理播放器的控制器
+
+add 方法用于动态添加控制器
+remove 方法用于动态删除控制器
+update 方法用于动态更新控 ...`,l:"advanced/built-in.html#controls",a:"controls"},"0.10":{t:"`contextmenu`",p:`管理播放器的右键菜单
+
+add 方法用于动态添加菜单
+remove 方法用于动态删除菜单
+update 方法用于动态更新菜单 ...`,l:"advanced/built-in.html#contextmenu",a:"contextmenu"},"0.11":{t:"`subtitle`",p:`管理播放器的字幕功能
+
+url 属性设置和返回当前字幕地址
+style 方法设置当前字幕的样式
+switch 方法设置当前字 ...`,l:"advanced/built-in.html#subtitle",a:"subtitle"},"0.12":{t:"`info`",p:`管理播放器的信息面板,常用于查看当前播放器和视频的运行状态,例如版本号、分辨率、时长等。
+
+通过 art.info.show ...`,l:"advanced/built-in.html#info",a:"info"},"0.13":{t:"`loading`",p:`管理播放器的加载层
+
+show 属性用于设置是否显示加载层
+toggle 属性用于切换是否显示加载层
+
+<div cl ...`,l:"advanced/built-in.html#loading",a:"loading"},"0.14":{t:"`hotkey`",p:`管理播放器的快捷键功能
+
+add 方法用于添加快捷键
+remove 方法用于删除快捷键
+
+<div className ...`,l:"advanced/built-in.html#hotkey",a:"hotkey"},"0.15":{t:"`mask`",p:`管理播放器的遮罩层
+
+show 属性用于设置是否显示遮罩层
+toggle 属性用于切换是否显示遮罩层
+
+<div cl ...`,l:"advanced/built-in.html#mask",a:"mask"},"0.16":{t:"`setting`",p:`管理播放器的设置面板
+
+add 方法用于动态添加设置项
+remove 方法用于动态删除设置项
+update 方法用于动态更新 ...`,l:"advanced/built-in.html#setting",a:"setting"},"0.17":{t:"`plugins`",p:`管理播放器的插件功能,只有一个方法 add 用于动态添加插件
+<div className="run-cod ...`,l:"advanced/built-in.html#plugins",a:"plugins"},"1.0":{t:"# 静态属性",p:`这里的 静态属性 是指挂载在 构造函数 的 一级属性,非常少使用
+`,l:"advanced/class.html",a:"静态属性"},"1.1":{t:"`instances`",p:`返回全部播放器实例的数组,假如你想同时管理多个播放器的时候,可以用到该属性
+<div className=" ...`,l:"advanced/class.html#instances",a:"instances"},"1.2":{t:"`version`",p:`返回播放器的版本信息
+<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#version",a:"version"},"1.3":{t:"`env`",p:`返回播放器的环境变量
+<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#env",a:"env"},"1.4":{t:"`build`",p:`返回播放器的打包时间
+<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#build",a:"build"},"1.5":{t:"`config`",p:`返回视频的默认配置
+<div className="run-code">▶ Run Code ...`,l:"advanced/class.html#config",a:"config"},"1.6":{t:"`utils`",p:`返回播放器的工具函数集合
+<div className="run-code">▶ Run C ...`,l:"advanced/class.html#utils",a:"utils"},"1.7":{t:"`scheme`",p:`返回播放器选项的校验方案
+<div className="run-code">▶ Run C ...`,l:"advanced/class.html#scheme",a:"scheme"},"1.8":{t:"`Emitter`",p:`返回事件分发器的构造函数
+<div className="run-code">▶ Run C ...`,l:"advanced/class.html#emitter",a:"emitter"},"1.9":{t:"`validator`",p:`返回选项的校验函数
+<div className="run-code">▶ Run Code ...`,l:"advanced/class.html#validator",a:"validator"},"1.10":{t:"`kindOf`",p:`返回类型检测的函数工具
+<div className="run-code">▶ Run Co ...`,l:"advanced/class.html#kindof",a:"kindof"},"1.11":{t:"`html`",p:`返回播放器所需的 html 字符串
+<div className="run-code">▶  ...`,l:"advanced/class.html#html",a:"html"},"1.12":{t:"`option`",p:`返回播放器的默认选项
+<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#option",a:"option"},"2.0":{t:"# 实例事件",p:`播放器的事件分为两种,一种视频的 原生事件 (前缀 video:),另外一种是 自定义事件
+监听事件:
+<div cl ...`,l:"advanced/event.html",a:"实例事件"},"2.1":{t:"`ready`",p:`当播放器首次可以播放器时触发
+<div className="run-code">▶ Run ...`,l:"advanced/event.html#ready",a:"ready"},"2.2":{t:"`restart`",p:`当播放器切换地址后并可以播放时触发
+<div className="run-code">▶  ...`,l:"advanced/event.html#restart",a:"restart"},"2.3":{t:"`pause`",p:`当播放器暂停时触发
+<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#pause",a:"pause"},"2.4":{t:"`play`",p:`当播放器播放时触发
+<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#play",a:"play"},"2.5":{t:"`hotkey`",p:`当播放器热键被按下时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#hotkey",a:"hotkey"},"2.6":{t:"`destroy`",p:`当播放器销毁时触发
+<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#destroy",a:"destroy"},"2.7":{t:"`focus`",p:`当播放器获得焦点时触发
+<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#focus",a:"focus"},"2.8":{t:"`blur`",p:`当播放器失去焦点时触发
+<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#blur",a:"blur"},"2.9":{t:"`dblclick`",p:`当播放器被双击时触发
+<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#dblclick",a:"dblclick"},"2.10":{t:"`click`",p:`当播放器被单击时触发
+<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#click",a:"click"},"2.11":{t:"`error`",p:`当播放器加载视频发生错误时触发
+<div className="run-code">▶ Ru ...`,l:"advanced/event.html#error",a:"error"},"2.12":{t:"`hover`",p:`当播放器被鼠标移出或者移入时触发
+<div className="run-code">▶ R ...`,l:"advanced/event.html#hover",a:"hover"},"2.13":{t:"`mousemove`",p:`当播放器被鼠标经过时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#mousemove",a:"mousemove"},"2.14":{t:"`resize`",p:`当播放器尺寸变化时触发
+<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#resize",a:"resize"},"2.15":{t:"`view`",p:`当播放器出现在视口时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#view",a:"view"},"2.16":{t:"`lock`",p:`在移动端,当锁定的状态发生变化时触发
+<div className="run-code">▶ ...`,l:"advanced/event.html#lock",a:"lock"},"2.17":{t:"`aspectRatio`",p:`当播放器长宽比变化时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#aspectratio",a:"aspectratio"},"2.18":{t:"`autoHeight`",p:`当播放器自动设置高度时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#autoheight",a:"autoheight"},"2.19":{t:"`autoSize`",p:`当播放器自动设置尺寸时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#autosize",a:"autosize"},"2.20":{t:"`flip`",p:`当播放器发生翻转时触发
+<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#flip",a:"flip"},"2.21":{t:"`fullscreen`",p:`当播放器发生窗口全屏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#fullscreen",a:"fullscreen"},"2.22":{t:"`fullscreenError`",p:`当播放器发生窗口全屏错误时触发
+<div className="run-code">▶ Ru ...`,l:"advanced/event.html#fullscreenerror",a:"fullscreenerror"},"2.23":{t:"`fullscreenWeb`",p:`当播放器发生网页全屏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#fullscreenweb",a:"fullscreenweb"},"2.24":{t:"`mini`",p:`当播放器进入迷你模式时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#mini",a:"mini"},"2.25":{t:"`pip`",p:`当播放器进入画中画时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#pip",a:"pip"},"2.26":{t:"`screenshot`",p:`当播放器被截图时触发
+<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#screenshot",a:"screenshot"},"2.27":{t:"`seek`",p:`当播放器发生时间跳转时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#seek",a:"seek"},"2.28":{t:"`subtitleOffset`",p:`当播放器发生字幕偏移时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#subtitleoffset",a:"subtitleoffset"},"2.29":{t:"`subtitleBeforeUpdate`",p:`当字幕更新前触发
+<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitlebeforeupdate",a:"subtitlebeforeupdate"},"2.30":{t:"`subtitleAfterUpdate`",p:`当字幕更新后触发
+<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitleafterupdate",a:"subtitleafterupdate"},"2.31":{t:"`subtitleLoad`",p:`当字幕加载时触发
+<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitleload",a:"subtitleload"},"2.32":{t:"`info`",p:`当信息面板显示或隐藏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#info",a:"info"},"2.33":{t:"`layer`",p:`当自定义层显示或隐藏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#layer",a:"layer"},"2.34":{t:"`loading`",p:`当加载器显示或隐藏时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#loading",a:"loading"},"2.35":{t:"`mask`",p:`当遮罩层显示或隐藏时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#mask",a:"mask"},"2.36":{t:"`subtitle`",p:`当字幕层显示或隐藏时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#subtitle",a:"subtitle"},"2.37":{t:"`contextmenu`",p:`当右键菜单显示或隐藏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#contextmenu",a:"contextmenu"},"2.38":{t:"`control`",p:`当控制器显示或隐藏时触发
+<div className="run-code">▶ Run C ...`,l:"advanced/event.html#control",a:"control"},"2.39":{t:"`setting`",p:`当设置面板显示或隐藏时触发
+<div className="run-code">▶ Run  ...`,l:"advanced/event.html#setting",a:"setting"},"2.40":{t:"`muted`",p:`当静音的状态变化时触发
+<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#muted",a:"muted"},"2.41":{t:"`keydown`",p:`监听来自 document 的 keydown 事件
+<div className="run-code&qu ...`,l:"advanced/event.html#keydown",a:"keydown"},"2.42":{t:"`video:canplay`",p:`浏览器可以播放媒体文件了,但估计没有足够的数据来支撑播放到结束,不必停下来进一步缓冲内容
+`,l:"advanced/event.html#video-canplay",a:"video-canplay"},"2.43":{t:"`video:canplaythrough`",p:`浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束
+`,l:"advanced/event.html#video-canplaythrough",a:"video-canplaythrough"},"2.44":{t:"`video:complete`",p:`OfflineAudioContext 渲染完成
+`,l:"advanced/event.html#video-complete",a:"video-complete"},"2.45":{t:"`video:durationchange`",p:`duration 属性的值改变时触发
+`,l:"advanced/event.html#video-durationchange",a:"video-durationchange"},"2.46":{t:"`video:emptied`",p:"媒体内容变为空;例如,当这个 media 已经加载完成(或者部分加载完成),则发送此事件,并调用 load() 方法重新加载 ...",l:"advanced/event.html#video-emptied",a:"video-emptied"},"2.47":{t:"`video:ended`",p:`视频停止播放,因为 media 已经到达结束点
+`,l:"advanced/event.html#video-ended",a:"video-ended"},"2.48":{t:"`video:error`",p:`获取媒体数据时出错,或者资源类型不是受支持的媒体格式
+`,l:"advanced/event.html#video-error",a:"video-error"},"2.49":{t:"`video:loadeddata`",p:`media 中的首帧已经完成加载
+`,l:"advanced/event.html#video-loadeddata",a:"video-loadeddata"},"2.50":{t:"`video:loadedmetadata`",p:`已加载元数据
+`,l:"advanced/event.html#video-loadedmetadata",a:"video-loadedmetadata"},"2.51":{t:"`video:pause`",p:`播放已暂停
+`,l:"advanced/event.html#video-pause",a:"video-pause"},"2.52":{t:"`video:play`",p:`播放已开始
+`,l:"advanced/event.html#video-play",a:"video-play"},"2.53":{t:"`video:playing`",p:`由于缺乏数据而暂停或延迟后,播放准备开始
+`,l:"advanced/event.html#video-playing",a:"video-playing"},"2.54":{t:"`video:progress`",p:`在浏览器加载资源时周期性触发
+`,l:"advanced/event.html#video-progress",a:"video-progress"},"2.55":{t:"`video:ratechange`",p:`播放速率发生变化
+`,l:"advanced/event.html#video-ratechange",a:"video-ratechange"},"2.56":{t:"`video:seeked`",p:`跳帧(seek)操作完成
+`,l:"advanced/event.html#video-seeked",a:"video-seeked"},"2.57":{t:"`video:seeking`",p:`跳帧(seek)操作开始
+`,l:"advanced/event.html#video-seeking",a:"video-seeking"},"2.58":{t:"`video:stalled`",p:`用户代理(user agent)正在尝试获取媒体数据,但数据意外未出现
+`,l:"advanced/event.html#video-stalled",a:"video-stalled"},"2.59":{t:"`video:suspend`",p:`媒体数据加载已暂停
+`,l:"advanced/event.html#video-suspend",a:"video-suspend"},"2.60":{t:"`video:timeupdate`",p:`currentTime 属性指定的时间发生变化
+`,l:"advanced/event.html#video-timeupdate",a:"video-timeupdate"},"2.61":{t:"`video:volumechange`",p:`音量发生变化
+`,l:"advanced/event.html#video-volumechange",a:"video-volumechange"},"2.62":{t:"`video:waiting`",p:`由于暂时缺少数据,播放已停止
+`,l:"advanced/event.html#video-waiting",a:"video-waiting"},"3.0":{t:"# 全局属性",p:`这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到
+`,l:"advanced/global.html",a:"全局属性"},"3.1":{t:"DEBUG",p:`是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭
+<div className="run- ...`,l:"advanced/global.html#debug",a:"debug"},"3.2":{t:"STYLE",p:`返回播放器样式文本
+<div className="run-code">▶ Run Code ...`,l:"advanced/global.html#style",a:"style"},"3.3":{t:"CONTEXTMENU",p:`是否开启右键菜单,默认开启
+<div className="run-code">▶ Run  ...`,l:"advanced/global.html#contextmenu",a:"contextmenu"},"3.4":{t:"NOTICE_TIME",p:`提示信息的显示时长,单位为毫秒,默认为 2000
+<div className="run-code" ...`,l:"advanced/global.html#notice-time",a:"notice-time"},"3.5":{t:"SETTING_WIDTH",p:`设置面板的默认宽度,单位为像素,默认为 250
+<div className="run-code" ...`,l:"advanced/global.html#setting-width",a:"setting-width"},"3.6":{t:"SETTING_ITEM_WIDTH",p:`设置面板的设置项的默认宽度,单位为像素,默认为 200
+<div className="run-code&q ...`,l:"advanced/global.html#setting-item-width",a:"setting-item-width"},"3.7":{t:"SETTING_ITEM_HEIGHT",p:`设置面板的设置项的默认高度,单位为像素,默认为 35
+<div className="run-code&qu ...`,l:"advanced/global.html#setting-item-height",a:"setting-item-height"},"3.8":{t:"RESIZE_TIME",p:`resize 事件的节流时间,单位为毫秒,默认为 200
+<div className="run-code& ...`,l:"advanced/global.html#resize-time",a:"resize-time"},"3.9":{t:"SCROLL_TIME",p:`scroll 事件的节流时间,单位为毫秒,默认为 200
+<div className="run-code& ...`,l:"advanced/global.html#scroll-time",a:"scroll-time"},"3.10":{t:"SCROLL_GAP",p:`view 事件的边界容差距离,单位为像素,默认为 50
+<div className="run-code&q ...`,l:"advanced/global.html#scroll-gap",a:"scroll-gap"},"3.11":{t:"AUTO_PLAYBACK_MAX",p:`自动回放功能的最大记录数,默认为 10
+<div className="run-code"> ...`,l:"advanced/global.html#auto-playback-max",a:"auto-playback-max"},"3.12":{t:"AUTO_PLAYBACK_MIN",p:`自动回放功能的最小记录时长,单位为秒,默认为 5
+<div className="run-code" ...`,l:"advanced/global.html#auto-playback-min",a:"auto-playback-min"},"3.13":{t:"AUTO_PLAYBACK_TIMEOUT",p:`自动回放功能的隐藏延迟时长,单位为毫秒,默认为 3000
+<div className="run-code& ...`,l:"advanced/global.html#auto-playback-timeout",a:"auto-playback-timeout"},"3.14":{t:"RECONNECT_TIME_MAX",p:`发生连接错误时,自动连接的最大次数,默认为 5
+<div className="run-code" ...`,l:"advanced/global.html#reconnect-time-max",a:"reconnect-time-max"},"3.15":{t:"RECONNECT_SLEEP_TIME",p:`发生连接错误时,自动连接的延迟时间,单位为毫秒,默认为 1000
+<div className="run-c ...`,l:"advanced/global.html#reconnect-sleep-time",a:"reconnect-sleep-time"},"3.16":{t:"CONTROL_HIDE_TIME",p:`底部控制栏的自动隐藏的延迟时间,单位为毫秒,默认为 3000
+<div className="run-cod ...`,l:"advanced/global.html#control-hide-time",a:"control-hide-time"},"3.17":{t:"DBCLICK_TIME",p:`双击事件的延迟事件,单位为毫秒,默认为 300
+<div className="run-code" ...`,l:"advanced/global.html#dbclick-time",a:"dbclick-time"},"3.18":{t:"DBCLICK_FULLSCREEN",p:`在桌面端,是否双击切换全屏,默认为 true
+<div className="run-code"& ...`,l:"advanced/global.html#dbclick-fullscreen",a:"dbclick-fullscreen"},"3.19":{t:"MOBILE_DBCLICK_PLAY",p:`在移动端,是否双击切换播放暂停,默认为 true
+<div className="run-code" ...`,l:"advanced/global.html#mobile-dbclick-play",a:"mobile-dbclick-play"},"3.20":{t:"MOBILE_CLICK_PLAY",p:`在移动端,是否单击切换播放暂停,默认为 false
+<div className="run-code&quo ...`,l:"advanced/global.html#mobile-click-play",a:"mobile-click-play"},"3.21":{t:"AUTO_ORIENTATION_TIME",p:`在移动端,自动旋屏的延迟时间,单位为毫秒,默认为 200
+<div className="run-code& ...`,l:"advanced/global.html#auto-orientation-time",a:"auto-orientation-time"},"3.22":{t:"INFO_LOOP_TIME",p:`信息面板的刷新时间,单位为毫秒,默认为 1000
+<div className="run-code" ...`,l:"advanced/global.html#info-loop-time",a:"info-loop-time"},"3.23":{t:"FAST_FORWARD_VALUE",p:`在移动端,长按加速的速率倍数,默认为 3
+<div className="run-code"> ...`,l:"advanced/global.html#fast-forward-value",a:"fast-forward-value"},"3.24":{t:"FAST_FORWARD_TIME",p:`在移动端,长按加速的延迟时间,单位为毫秒,默认为 1000
+<div className="run-code ...`,l:"advanced/global.html#fast-forward-time",a:"fast-forward-time"},"3.25":{t:"TOUCH_MOVE_RATIO",p:`在移动端,左右滑动进度的速率倍数,默认为 0.5
+<div className="run-code" ...`,l:"advanced/global.html#touch-move-ratio",a:"touch-move-ratio"},"3.26":{t:"VOLUME_STEP",p:`快捷键调节音量的幅度比例,默认为 0.1
+<div className="run-code"> ...`,l:"advanced/global.html#volume-step",a:"volume-step"},"3.27":{t:"SEEK_STEP",p:`快捷键调节播放进度的幅度,单位为秒,默认为 5
+<div className="run-code" ...`,l:"advanced/global.html#seek-step",a:"seek-step"},"3.28":{t:"PLAYBACK_RATE",p:`内置播放速率的列表,默认为 [0.5, 0.75, 1, 1.25, 1.5, 2]
+<div className=& ...`,l:"advanced/global.html#playback-rate",a:"playback-rate"},"3.29":{t:"ASPECT_RATIO",p:`内置视频长宽比的列表,默认为 ['default', '4:3', '16:9']
+<div className=&q ...`,l:"advanced/global.html#aspect-ratio",a:"aspect-ratio"},"3.30":{t:"FLIP",p:`内置视频翻转的列表,默认为 ['normal', 'horizontal', 'vertical']
+<div cla ...`,l:"advanced/global.html#flip",a:"flip"},"3.31":{t:"FULLSCREEN_WEB_IN_BODY",p:`网页全屏时,是否把播放器挂在在 body 元素下,默认为 true
+<div className="run- ...`,l:"advanced/global.html#fullscreen-web-in-body",a:"fullscreen-web-in-body"},"3.32":{t:"LOG_VERSION",p:`设置是否打印播放器版本,默认为 true
+<div className="run-code"> ...`,l:"advanced/global.html#log-version",a:"log-version"},"3.33":{t:"USE_RAF",p:`设置是否使用 requestAnimationFrame ,默认为 false,目前主要用于进度条的平滑效果
+<div ...`,l:"advanced/global.html#use-raf",a:"use-raf"},"3.34":{t:"REMOVE_SRC_WHEN_DESTROY",p:`在销毁播放器时,是否同时移除视频的 src 属性并调用 load() 以主动释放媒体资源,默认为 true。
+开启后可以在单 ...`,l:"advanced/global.html#remove-src-when-destroy",a:"remove-src-when-destroy"},"4.0":{t:"# 编写插件",p:`但你已经知道播放器的属性, 方法和事件后,再编写插件是非常简单的事
+可以在实例化的时候加载插件的函数
+<div cla ...`,l:"advanced/plugin.html",a:"编写插件"},"5.0":{t:"# 实例属性",p:`这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用
+`,l:"advanced/property.html",a:"实例属性"},"5.1":{t:"`play`",p:`
+Type: Function
+
+播放视频
+<div className="run-code"&g ...`,l:"advanced/property.html#play",a:"play"},"5.2":{t:"`pause`",p:`
+Type: Function
+
+暂停视频
+<div className="run-code"&g ...`,l:"advanced/property.html#pause",a:"pause"},"5.3":{t:"`toggle`",p:`
+Type: Function
+
+切换视频的播放和暂停
+<div className="run-code&q ...`,l:"advanced/property.html#toggle",a:"toggle"},"5.4":{t:"`destroy`",p:`
+Type: Function
+Parameter: Boolean
+
+销毁播放器,接受一个参数表示是否销毁后同时移除播放器 ...`,l:"advanced/property.html#destroy",a:"destroy"},"5.5":{t:"`reset`",p:`
+Type: Function
+
+重置播放器的视频元素:会移除当前 src 并调用一次 load(),常用于在单页应用中手动 ...`,l:"advanced/property.html#reset",a:"reset"},"5.6":{t:"`seek`",p:`
+Type: Setter
+Parameter: Number
+
+视频时间跳转,单位秒
+<div className= ...`,l:"advanced/property.html#seek",a:"seek"},"5.7":{t:"`forward`",p:`
+Type: Setter
+Parameter: Number
+
+视频时间快进,单位秒
+<div className= ...`,l:"advanced/property.html#forward",a:"forward"},"5.8":{t:"`backward`",p:`
+Type: Setter
+Parameter: Number
+
+视频时间快退,单位秒
+<div className= ...`,l:"advanced/property.html#backward",a:"backward"},"5.9":{t:"`volume`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+设置和获取视频音量,范围在:[0, 1]
+& ...`,l:"advanced/property.html#volume",a:"volume"},"5.10":{t:"`url`",p:`
+Type: Setter/Getter
+Parameter: String
+
+设置和获取视频地址
+<div clas ...`,l:"advanced/property.html#url",a:"url"},"5.11":{t:"`switch`",p:`
+Type: Setter
+Parameter: String
+
+设置视频地址,设置时和 art.url 类似,但会执行一些 ...`,l:"advanced/property.html#switch",a:"switch"},"5.12":{t:"`switchUrl`",p:`
+Type: Function
+Parameter: String
+
+设置视频地址,设置时和 art.url 类似,但会执行 ...`,l:"advanced/property.html#switchurl",a:"switchurl"},"5.13":{t:"`switchQuality`",p:`
+Type: Function
+Parameter: String
+
+设置视频画质地址,和 art.switchUrl 类似 ...`,l:"advanced/property.html#switchquality",a:"switchquality"},"5.14":{t:"`muted`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+设置和获取视频是否静音
+<div c ...`,l:"advanced/property.html#muted",a:"muted"},"5.15":{t:"`currentTime`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+设置和获取视频当前时间,设置时间时和 see ...`,l:"advanced/property.html#currenttime",a:"currenttime"},"5.16":{t:"`duration`",p:`
+Type: Getter
+
+获取视频时长
+<div className="run-code"&g ...`,l:"advanced/property.html#duration",a:"duration"},"5.17":{t:"`screenshot`",p:`
+Type: Function
+
+下载当前视频帧的截图, 可选参数为截图名字
+<div className=" ...`,l:"advanced/property.html#screenshot",a:"screenshot"},"5.18":{t:"`getDataURL`",p:`
+Type: Function
+
+获取当前视频帧的截图的base64地址,返回的是一个 Promise
+<div cl ...`,l:"advanced/property.html#getdataurl",a:"getdataurl"},"5.19":{t:"`getBlobUrl`",p:`
+Type: Function
+
+获取当前视频帧的截图的blob地址,返回的是一个 Promise
+<div clas ...`,l:"advanced/property.html#getbloburl",a:"getbloburl"},"5.20":{t:"`fullscreen`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+设置和获取播放器窗口全屏
+<div  ...`,l:"advanced/property.html#fullscreen",a:"fullscreen"},"5.21":{t:"`fullscreenWeb`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+设置和获取播放器网页全屏
+<div  ...`,l:"advanced/property.html#fullscreenweb",a:"fullscreenweb"},"5.22":{t:"`pip`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+设置和获取播放器画中画模式
+<div ...`,l:"advanced/property.html#pip",a:"pip"},"5.23":{t:"`poster`",p:`
+Type: Setter/Getter
+Parameter: String
+
+设置和获取视频海报,只有在视频播放前才能看到 ...`,l:"advanced/property.html#poster",a:"poster"},"5.24":{t:"`mini`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+设置和获取播放器迷你模式
+<div  ...`,l:"advanced/property.html#mini",a:"mini"},"5.25":{t:"`playing`",p:`
+Type: Getter
+Parameter: Boolean
+
+获取视频是否正在播放中
+<div classNam ...`,l:"advanced/property.html#playing",a:"playing"},"5.26":{t:"`state`",p:`
+Type: Setter/Getter
+Parameter: String
+
+获取或设置播放器当前状态,支持:standa ...`,l:"advanced/property.html#state",a:"state"},"5.27":{t:"`autoSize`",p:`
+Type: Function
+
+设置视频是否自适应尺寸
+<div className="run-code& ...`,l:"advanced/property.html#autosize",a:"autosize"},"5.28":{t:"`rect`",p:`
+Type: Getter
+
+获取播放器的尺寸和坐标信息
+<div className="run-code& ...`,l:"advanced/property.html#rect",a:"rect"},"5.29":{t:"`bottom` / `top` / `left` / `right` / `x` / `y` / `width` / `height`",p:`
+Type: Getter
+
+这些属性是对 rect 的快捷访问:
+
+bottom, top, left, right, x ...`,l:"advanced/property.html#bottom-top-left-right-x-y-width-height",a:"bottom-top-left-right-x-y-width-height"},"5.30":{t:"`flip`",p:`
+Type: Setter/Getter
+Parameter: String
+
+设置和获取播放器翻转,支持normal,   ...`,l:"advanced/property.html#flip",a:"flip"},"5.31":{t:"`playbackRate`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+设置和获取播放器播放速度
+<div c ...`,l:"advanced/property.html#playbackrate",a:"playbackrate"},"5.32":{t:"`aspectRatio`",p:`
+Type: Setter/Getter
+Parameter: String
+
+设置和获取播放器长宽比
+<div cl ...`,l:"advanced/property.html#aspectratio",a:"aspectratio"},"5.33":{t:"`autoHeight`",p:`
+Type: Function
+
+当容器只有宽度,该属性可以自动计算出并设置视频的高度
+<div className= ...`,l:"advanced/property.html#autoheight",a:"autoheight"},"5.34":{t:"`attr`",p:`
+Type: Function
+Parameter: String
+
+动态获取和设置 video 元素的属性
+<div ...`,l:"advanced/property.html#attr",a:"attr"},"5.35":{t:"`type`",p:`
+Type: Setter/Getter
+Parameter: String
+
+动态获取和设置视频类型
+<div cl ...`,l:"advanced/property.html#type",a:"type"},"5.36":{t:"`theme`",p:`
+Type: Setter/Getter
+Parameter: String
+
+动态获取和设置播放器主题颜色
+<div ...`,l:"advanced/property.html#theme",a:"theme"},"5.37":{t:"`airplay`",p:`
+Type: Function
+
+开启隔空播放
+<div className="run-code" ...`,l:"advanced/property.html#airplay",a:"airplay"},"5.38":{t:"`loaded`",p:`
+Type: Getter
+
+视频缓存的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用
+&l ...`,l:"advanced/property.html#loaded",a:"loaded"},"5.39":{t:"`loadedTime`",p:`
+Type: Getter
+
+已缓存的媒体时长,单位为秒。通常与 loaded 一起使用,用于展示缓冲进度细节。
+<d ...`,l:"advanced/property.html#loadedtime",a:"loadedtime"},"5.40":{t:"`played`",p:`
+Type: Getter
+
+视频播放的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用
+&l ...`,l:"advanced/property.html#played",a:"played"},"5.41":{t:"`proxy`",p:`
+Type: Function
+
+DOM 事件的代理函数,实质上代理了 addEventListener 和 removeE ...`,l:"advanced/property.html#proxy",a:"proxy"},"5.42":{t:"`query`",p:`
+Type: Function
+
+DOM 的查询函数,类似 document.querySelector,但被查询的对象局限 ...`,l:"advanced/property.html#query",a:"query"},"5.43":{t:"`video`",p:`
+Type: Element
+
+快捷返回播放器的 video 元素
+<div className="run- ...`,l:"advanced/property.html#video",a:"video"},"5.44":{t:"`cssVar`",p:`
+Type: Function
+
+动态获取或设置 css 变量
+<div className="run-co ...`,l:"advanced/property.html#cssvar",a:"cssvar"},"5.45":{t:"`quality`",p:`
+Type: Setter
+Parameter: Array
+
+动态设置画质列表
+<div className=&qu ...`,l:"advanced/property.html#quality",a:"quality"},"5.46":{t:"`thumbnails`",p:`
+Type: Setter/Getter
+Parameter: Object
+
+动态设置缩略图
+<div classN ...`,l:"advanced/property.html#thumbnails",a:"thumbnails"},"5.47":{t:"`subtitleOffset`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+动态设置字幕偏移
+<div class ...`,l:"advanced/property.html#subtitleoffset",a:"subtitleoffset"},"6.0":{t:"# 右键菜单",p:"",l:"component/contextmenu.html",a:"右键菜单"},"6.1":{t:"配置",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+disable
+Boolean
+是否禁用组件
+
+
+name
+String
+组件唯一名称,用于 ...`,l:"component/contextmenu.html#配置",a:"配置"},"6.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#创建",a:"创建"},"6.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#添加",a:"添加"},"6.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#删除",a:"删除"},"6.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#更新",a:"更新"},"7.0":{t:"# 控制器",p:"",l:"component/controls.html",a:"控制器"},"7.1":{t:"配置",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+disable
+Boolean
+是否禁用组件
+
+
+name
+String
+组件唯一名称,用于 ...`,l:"component/controls.html#配置",a:"配置"},"7.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#创建",a:"创建"},"7.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#添加",a:"添加"},"7.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#删除",a:"删除"},"7.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#更新",a:"更新"},"8.0":{t:"# 业务层",p:"",l:"component/layers.html",a:"业务层"},"8.1":{t:"配置",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+disable
+Boolean
+是否禁用组件
+
+
+name
+String
+组件唯一名称,用于 ...`,l:"component/layers.html#配置",a:"配置"},"8.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#创建",a:"创建"},"8.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#添加",a:"添加"},"8.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#删除",a:"删除"},"8.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#更新",a:"更新"},"9.0":{t:"# 设置面板",p:"",l:"component/setting.html",a:"设置面板"},"9.1":{t:"内置",p:"须先打开设置面板,然后自带四个内置项:flip, playbackRate, aspectRatio, subtitleOf ...",l:"component/setting.html#内置",a:"内置"},"9.2":{t:"创建 - 按钮",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+html
+String, Element
+元素的 DOM
+
+
+icon
+String, El ...`,l:"component/setting.html#创建-按钮",a:"创建-按钮"},"9.3":{t:"创建 - 选择列表",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+html
+String, Element
+元素的 DOM
+
+
+icon
+String, El ...`,l:"component/setting.html#创建-选择列表",a:"创建-选择列表"},"9.4":{t:"创建 - 列表嵌套",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#创建-列表嵌套",a:"创建-列表嵌套"},"9.5":{t:"创建 - 切换按钮",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+html
+String, Element
+元素的 DOM 元素
+
+
+icon
+String, ...`,l:"component/setting.html#创建-切换按钮",a:"创建-切换按钮"},"9.6":{t:"创建 - 范围滑块",p:`
+
+
+属性
+类型
+描述
+
+
+
+
+html
+String, Element
+元素的 DOM 元素
+
+
+icon
+String, ...`,l:"component/setting.html#创建-范围滑块",a:"创建-范围滑块"},"9.7":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#添加",a:"添加"},"9.8":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#删除",a:"删除"},"9.9":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#更新",a:"更新"},"10.0":{t:"# Advanced Properties",p:"The Advanced Properties here refer to the secondary properties ...",l:"en/advanced/built-in.html",a:"advanced-properties"},"10.1":{t:"`option`",p:`The player's options.
+<div className="run-code"&g ...`,l:"en/advanced/built-in.html#option",a:"option"},"10.2":{t:"`template`",p:`Manages all DOM elements of the player.
+<div className=&quo ...`,l:"en/advanced/built-in.html#template",a:"template"},"10.3":{t:"`events`",p:"Manages all DOM events for the player. It essentially proxies  ...",l:"en/advanced/built-in.html#events",a:"events"},"10.4":{t:"`storage`",p:`Manages the player's local storage.
+
+The name property is used ...`,l:"en/advanced/built-in.html#storage",a:"storage"},"10.5":{t:"`icons`",p:`Manages all svg icons for the player.
+<div className=" ...`,l:"en/advanced/built-in.html#icons",a:"icons"},"10.6":{t:"`i18n`",p:`Manages the player's i18n.
+
+The get method is used to get an i ...`,l:"en/advanced/built-in.html#i18n",a:"i18n"},"10.7":{t:"`notice`",p:"Manages the player's notifications. It only has a show propert ...",l:"en/advanced/built-in.html#notice",a:"notice"},"10.8":{t:"`layers`",p:`Manages the player's layers.
+
+The add method is used to dynami ...`,l:"en/advanced/built-in.html#layers",a:"layers"},"10.9":{t:"`controls`",p:`Manages the player's controls.
+
+
+The add method is used to dyn ...`,l:"en/advanced/built-in.html#controls",a:"controls"},"10.10":{t:"`contextmenu`",p:`Manages the player's context menu
+
+The add method is used to d ...`,l:"en/advanced/built-in.html#contextmenu",a:"contextmenu"},"10.11":{t:"`subtitle`",p:`Manages the player's subtitle functionality
+
+The url property  ...`,l:"en/advanced/built-in.html#subtitle",a:"subtitle"},"10.12":{t:"`info`",p:"Manages the player's information panel, commonly used to view  ...",l:"en/advanced/built-in.html#info",a:"info"},"10.13":{t:"`loading`",p:`Manages the player's loading layer
+
+The show property is used  ...`,l:"en/advanced/built-in.html#loading",a:"loading"},"10.14":{t:"`hotkey`",p:`Manages the player's hotkey functionality
+
+The add method is u ...`,l:"en/advanced/built-in.html#hotkey",a:"hotkey"},"10.15":{t:"`mask`",p:`Manages the player's mask layer
+
+The show property is used to  ...`,l:"en/advanced/built-in.html#mask",a:"mask"},"10.16":{t:"`setting`",p:`Manages the player's settings panel
+
+The add method is used to ...`,l:"en/advanced/built-in.html#setting",a:"setting"},"10.17":{t:"`plugins`",p:"Manages the player's plugin functionality, with only the add m ...",l:"en/advanced/built-in.html#plugins",a:"plugins"},"11.0":{t:"# Static Properties",p:"Here, Static Properties refer to the top-level properties moun ...",l:"en/advanced/class.html",a:"static-properties"},"11.1":{t:"`instances`",p:"Returns an array of all player instances. This property can be ...",l:"en/advanced/class.html#instances",a:"instances"},"11.2":{t:"`version`",p:`Returns the version information of the player.
+<div classNa ...`,l:"en/advanced/class.html#version",a:"version"},"11.3":{t:"`env`",p:`Returns the environment variables of the player.
+<div class ...`,l:"en/advanced/class.html#env",a:"env"},"11.4":{t:"`build`",p:`Returns the build time of the player.
+<div className=" ...`,l:"en/advanced/class.html#build",a:"build"},"11.5":{t:"`config`",p:`Returns the default configuration for videos.
+<div classNam ...`,l:"en/advanced/class.html#config",a:"config"},"11.6":{t:"`utils`",p:`Returns the collection of utility functions for the player.
+&l ...`,l:"en/advanced/class.html#utils",a:"utils"},"11.7":{t:"`scheme`",p:`Returns the validation schema for player options.
+<div clas ...`,l:"en/advanced/class.html#scheme",a:"scheme"},"11.8":{t:"`Emitter`",p:`Returns the constructor function for the event emitter.
+<di ...`,l:"en/advanced/class.html#emitter",a:"emitter"},"11.9":{t:"`validator`",p:`Returns the validation function for options.
+<div className ...`,l:"en/advanced/class.html#validator",a:"validator"},"11.10":{t:"`kindOf`",p:`Returns the utility function for type detection.
+<div class ...`,l:"en/advanced/class.html#kindof",a:"kindof"},"11.11":{t:"`html`",p:`Returns the html string required by the player.
+<div classN ...`,l:"en/advanced/class.html#html",a:"html"},"11.12":{t:"`option`",p:`Returns the default options for the player.
+<div className= ...`,l:"en/advanced/class.html#option",a:"option"},"12.0":{t:"# Instance Events",p:"Player events are divided into two types: native events (prefi ...",l:"en/advanced/event.html",a:"instance-events"},"12.1":{t:"`ready`",p:`Triggered when the player is ready for the first time
+<div  ...`,l:"en/advanced/event.html#ready",a:"ready"},"12.2":{t:"`restart`",p:`Triggered when the player switches URL and becomes playable
+&l ...`,l:"en/advanced/event.html#restart",a:"restart"},"12.3":{t:"`pause`",p:`Triggered when the player is paused
+<div className="ru ...`,l:"en/advanced/event.html#pause",a:"pause"},"12.4":{t:"`play`",p:`Triggered when the player starts playing
+<div className=&qu ...`,l:"en/advanced/event.html#play",a:"play"},"12.5":{t:"`hotkey`",p:`Triggered when a hotkey is pressed on the player
+<div class ...`,l:"en/advanced/event.html#hotkey",a:"hotkey"},"12.6":{t:"`destroy`",p:`Triggered when the player is destroyed
+<div className=" ...`,l:"en/advanced/event.html#destroy",a:"destroy"},"12.7":{t:"`focus`",p:`Triggered when the player gains focus
+<div className=" ...`,l:"en/advanced/event.html#focus",a:"focus"},"12.8":{t:"`blur`",p:`Triggered when the player loses focus
+<div className=" ...`,l:"en/advanced/event.html#blur",a:"blur"},"12.9":{t:"`dblclick`",p:`Triggered when the player is double-clicked
+<div className= ...`,l:"en/advanced/event.html#dblclick",a:"dblclick"},"12.10":{t:"`click`",p:`Triggered when the player is clicked
+<div className="r ...`,l:"en/advanced/event.html#click",a:"click"},"12.11":{t:"`error`",p:`Triggered when an error occurs while loading the video
+<div ...`,l:"en/advanced/event.html#error",a:"error"},"12.12":{t:"`hover`",p:`Triggered when the mouse enters or leaves the player
+<div c ...`,l:"en/advanced/event.html#hover",a:"hover"},"12.13":{t:"`mousemove`",p:`Triggered when the mouse moves over the player
+<div classNa ...`,l:"en/advanced/event.html#mousemove",a:"mousemove"},"12.14":{t:"`resize`",p:`Triggered when the player's dimensions change
+<div classNam ...`,l:"en/advanced/event.html#resize",a:"resize"},"12.15":{t:"`view`",p:`Triggered when the player enters or leaves the viewport
+<di ...`,l:"en/advanced/event.html#view",a:"view"},"12.16":{t:"`lock`",p:`Triggered when the lock state changes on mobile devices
+<di ...`,l:"en/advanced/event.html#lock",a:"lock"},"12.17":{t:"`aspectRatio`",p:`Triggered when the player's aspect ratio changes
+<div class ...`,l:"en/advanced/event.html#aspectratio",a:"aspectratio"},"12.18":{t:"`autoHeight`",p:`Triggered when the player automatically adjusts its height
+< ...`,l:"en/advanced/event.html#autoheight",a:"autoheight"},"12.19":{t:"`autoSize`",p:`Triggered when the player automatically adjusts its size
+<d ...`,l:"en/advanced/event.html#autosize",a:"autosize"},"12.20":{t:"`flip`",p:`Triggered when the player is flipped
+<div className="r ...`,l:"en/advanced/event.html#flip",a:"flip"},"12.21":{t:"`fullscreen`",p:"Triggered when the player enters or exits window fullscreen mo ...",l:"en/advanced/event.html#fullscreen",a:"fullscreen"},"12.22":{t:"`fullscreenError`",p:`Triggered when a window fullscreen error occurs
+<div classN ...`,l:"en/advanced/event.html#fullscreenerror",a:"fullscreenerror"},"12.23":{t:"`fullscreenWeb`",p:`Triggered when the player enters or exits web fullscreen mode
+ ...`,l:"en/advanced/event.html#fullscreenweb",a:"fullscreenweb"},"12.24":{t:"`mini`",p:`Triggered when the player enters or exits mini mode
+<div cl ...`,l:"en/advanced/event.html#mini",a:"mini"},"12.25":{t:"`pip`",p:"Triggered when the player enters or exits picture-in-picture m ...",l:"en/advanced/event.html#pip",a:"pip"},"12.26":{t:"`screenshot`",p:`Triggered when the player captures a screenshot
+<div classN ...`,l:"en/advanced/event.html#screenshot",a:"screenshot"},"12.27":{t:"`seek`",p:`Triggered when the player performs a time seek
+<div classNa ...`,l:"en/advanced/event.html#seek",a:"seek"},"12.28":{t:"`subtitleOffset`",p:`Triggered when subtitle offset changes in the player
+<div c ...`,l:"en/advanced/event.html#subtitleoffset",a:"subtitleoffset"},"12.29":{t:"`subtitleBeforeUpdate`",p:`Triggered before subtitles are updated
+<div className=" ...`,l:"en/advanced/event.html#subtitlebeforeupdate",a:"subtitlebeforeupdate"},"12.30":{t:"`subtitleAfterUpdate`",p:`Triggered after subtitles are updated
+<div className=" ...`,l:"en/advanced/event.html#subtitleafterupdate",a:"subtitleafterupdate"},"12.31":{t:"`subtitleLoad`",p:`Triggered when subtitles are loaded
+<div className="ru ...`,l:"en/advanced/event.html#subtitleload",a:"subtitleload"},"12.32":{t:"`info`",p:`Triggered when the info panel is shown or hidden
+<div class ...`,l:"en/advanced/event.html#info",a:"info"},"12.33":{t:"`layer`",p:`Triggered when custom layers are shown or hidden
+<div class ...`,l:"en/advanced/event.html#layer",a:"layer"},"12.34":{t:"`loading`",p:`Triggered when the loader is shown or hidden
+<div className ...`,l:"en/advanced/event.html#loading",a:"loading"},"12.35":{t:"`mask`",p:`Triggered when the mask layer is shown or hidden
+<div class ...`,l:"en/advanced/event.html#mask",a:"mask"},"12.36":{t:"`subtitle`",p:`Triggered when the subtitle layer is shown or hidden
+<div c ...`,l:"en/advanced/event.html#subtitle",a:"subtitle"},"12.37":{t:"`contextmenu`",p:`Triggered when the context menu is shown or hidden
+<div cla ...`,l:"en/advanced/event.html#contextmenu",a:"contextmenu"},"12.38":{t:"`control`",p:`Triggered when the controls are shown or hidden
+<div classN ...`,l:"en/advanced/event.html#control",a:"control"},"12.39":{t:"`setting`",p:`Triggered when the settings panel is shown or hidden
+<div c ...`,l:"en/advanced/event.html#setting",a:"setting"},"12.40":{t:"`muted`",p:`Triggered when the mute state changes
+<div className=" ...`,l:"en/advanced/event.html#muted",a:"muted"},"12.41":{t:"`keydown`",p:`Listens for keydown events from the document
+<div className ...`,l:"en/advanced/event.html#keydown",a:"keydown"},"12.42":{t:"`video:canplay`",p:"The browser can start playing the media, but estimates there i ...",l:"en/advanced/event.html#video-canplay",a:"video-canplay"},"12.43":{t:"`video:canplaythrough`",p:"The browser estimates it can play the media through to the end ...",l:"en/advanced/event.html#video-canplaythrough",a:"video-canplaythrough"},"12.44":{t:"`video:complete`",p:`OfflineAudioContext rendering is complete
+`,l:"en/advanced/event.html#video-complete",a:"video-complete"},"12.45":{t:"`video:durationchange`",p:`Triggered when the value of the duration property changes
+`,l:"en/advanced/event.html#video-durationchange",a:"video-durationchange"},"12.46":{t:"`video:emptied`",p:"The media has become empty; for example, this event is sent wh ...",l:"en/advanced/event.html#video-emptied",a:"video-emptied"},"12.47":{t:"`video:ended`",p:"Playback has stopped because the media has reached its end poi ...",l:"en/advanced/event.html#video-ended",a:"video-ended"},"12.48":{t:"`video:error`",p:"An error occurred while fetching media data, or the resource t ...",l:"en/advanced/event.html#video-error",a:"video-error"},"12.49":{t:"`video:loadeddata`",p:`The first frame of the media has finished loading
+`,l:"en/advanced/event.html#video-loadeddata",a:"video-loadeddata"},"12.50":{t:"`video:loadedmetadata`",p:`Metadata has been loaded
+`,l:"en/advanced/event.html#video-loadedmetadata",a:"video-loadedmetadata"},"12.51":{t:"`video:pause`",p:`Playback has been paused
+`,l:"en/advanced/event.html#video-pause",a:"video-pause"},"12.52":{t:"`video:play`",p:`Playback has begun
+`,l:"en/advanced/event.html#video-play",a:"video-play"},"12.53":{t:"`video:playing`",p:"Playback is ready to start after having been paused or delayed ...",l:"en/advanced/event.html#video-playing",a:"video-playing"},"12.54":{t:"`video:progress`",p:"Periodically triggered while the browser is loading the resour ...",l:"en/advanced/event.html#video-progress",a:"video-progress"},"12.55":{t:"`video:ratechange`",p:`The playback rate has changed
+`,l:"en/advanced/event.html#video-ratechange",a:"video-ratechange"},"12.56":{t:"`video:seeked`",p:`A seek operation has completed
+`,l:"en/advanced/event.html#video-seeked",a:"video-seeked"},"12.57":{t:"`video:seeking`",p:`A seek operation has begun
+`,l:"en/advanced/event.html#video-seeking",a:"video-seeking"},"12.58":{t:"`video:stalled`",p:"The user agent is trying to fetch media data, but data is unex ...",l:"en/advanced/event.html#video-stalled",a:"video-stalled"},"12.59":{t:"`video:suspend`",p:`Media data loading has been suspended
+`,l:"en/advanced/event.html#video-suspend",a:"video-suspend"},"12.60":{t:"`video:timeupdate`",p:"The time indicated by the currentTime attribute has been updat ...",l:"en/advanced/event.html#video-timeupdate",a:"video-timeupdate"},"12.61":{t:"`video:volumechange`",p:`The volume has changed
+`,l:"en/advanced/event.html#video-volumechange",a:"video-volumechange"},"12.62":{t:"`video:waiting`",p:`Playback has stopped due to temporary lack of data
+`,l:"en/advanced/event.html#video-waiting",a:"video-waiting"},"13.0":{t:"# Global Properties",p:"These global properties refer to the top-level properties moun ...",l:"en/advanced/global.html",a:"global-properties"},"13.1":{t:"DEBUG",p:"Whether to enable debug mode, which can print all built-in eve ...",l:"en/advanced/global.html#debug",a:"debug"},"13.2":{t:"STYLE",p:`Returns the player style text.
+<div className="run-cod ...`,l:"en/advanced/global.html#style",a:"style"},"13.3":{t:"CONTEXTMENU",p:`Whether to enable the context menu. Default is on.
+<div cla ...`,l:"en/advanced/global.html#contextmenu",a:"contextmenu"},"13.4":{t:"NOTICE_TIME",p:"The display duration for notification messages, in millisecond ...",l:"en/advanced/global.html#notice-time",a:"notice-time"},"13.5":{t:"SETTING_WIDTH",p:"The default width of the settings panel, in pixels. Default is ...",l:"en/advanced/global.html#setting-width",a:"setting-width"},"13.6":{t:"SETTING_ITEM_WIDTH",p:"The default width of settings items in the settings panel, in  ...",l:"en/advanced/global.html#setting-item-width",a:"setting-item-width"},"13.7":{t:"SETTING_ITEM_HEIGHT",p:"The default height of settings items in the settings panel, in ...",l:"en/advanced/global.html#setting-item-height",a:"setting-item-height"},"13.8":{t:"RESIZE_TIME",p:"The throttle time for the resize event, in milliseconds. Defau ...",l:"en/advanced/global.html#resize-time",a:"resize-time"},"13.9":{t:"SCROLL_TIME",p:"The throttle time for the scroll event, in milliseconds. Defau ...",l:"en/advanced/global.html#scroll-time",a:"scroll-time"},"13.10":{t:"SCROLL_GAP",p:"The boundary tolerance distance for the view event, in pixels. ...",l:"en/advanced/global.html#scroll-gap",a:"scroll-gap"},"13.11":{t:"AUTO_PLAYBACK_MAX",p:"The maximum record count for the auto-playback feature. Defaul ...",l:"en/advanced/global.html#auto-playback-max",a:"auto-playback-max"},"13.12":{t:"AUTO_PLAYBACK_MIN",p:"The minimum record duration for the auto-playback feature, in  ...",l:"en/advanced/global.html#auto-playback-min",a:"auto-playback-min"},"13.13":{t:"AUTO_PLAYBACK_TIMEOUT",p:"The hide delay duration for the auto-playback feature, in mill ...",l:"en/advanced/global.html#auto-playback-timeout",a:"auto-playback-timeout"},"13.14":{t:"RECONNECT_TIME_MAX",p:"The maximum number of automatic reconnection attempts when a c ...",l:"en/advanced/global.html#reconnect-time-max",a:"reconnect-time-max"},"13.15":{t:"RECONNECT_SLEEP_TIME",p:"The delay time for automatic reconnection when a connection er ...",l:"en/advanced/global.html#reconnect-sleep-time",a:"reconnect-sleep-time"},"13.16":{t:"CONTROL_HIDE_TIME",p:"The delay time in milliseconds for auto-hiding the bottom cont ...",l:"en/advanced/global.html#control-hide-time",a:"control-hide-time"},"13.17":{t:"DBCLICK_TIME",p:"The delay time in milliseconds for double-click events. Defaul ...",l:"en/advanced/global.html#dbclick-time",a:"dbclick-time"},"13.18":{t:"DBCLICK_FULLSCREEN",p:"On desktop, whether double-click toggles fullscreen mode. Defa ...",l:"en/advanced/global.html#dbclick-fullscreen",a:"dbclick-fullscreen"},"13.19":{t:"MOBILE_DBCLICK_PLAY",p:"On mobile devices, whether double-click toggles play/pause. De ...",l:"en/advanced/global.html#mobile-dbclick-play",a:"mobile-dbclick-play"},"13.20":{t:"MOBILE_CLICK_PLAY",p:"On mobile devices, whether single-click toggles play/pause. De ...",l:"en/advanced/global.html#mobile-click-play",a:"mobile-click-play"},"13.21":{t:"AUTO_ORIENTATION_TIME",p:"On mobile devices, the delay time in milliseconds for automati ...",l:"en/advanced/global.html#auto-orientation-time",a:"auto-orientation-time"},"13.22":{t:"INFO_LOOP_TIME",p:"The refresh interval in milliseconds for the information panel ...",l:"en/advanced/global.html#info-loop-time",a:"info-loop-time"},"13.23":{t:"FAST_FORWARD_VALUE",p:"On mobile devices, the speed multiplier for fast-forward durin ...",l:"en/advanced/global.html#fast-forward-value",a:"fast-forward-value"},"13.24":{t:"FAST_FORWARD_TIME",p:"On mobile devices, the delay time in milliseconds for activati ...",l:"en/advanced/global.html#fast-forward-time",a:"fast-forward-time"},"13.25":{t:"TOUCH_MOVE_RATIO",p:"On mobile devices, the speed multiplier for seeking when swipi ...",l:"en/advanced/global.html#touch-move-ratio",a:"touch-move-ratio"},"13.26":{t:"VOLUME_STEP",p:"The volume adjustment step for keyboard shortcuts. Default is  ...",l:"en/advanced/global.html#volume-step",a:"volume-step"},"13.27":{t:"SEEK_STEP",p:"The seeking step in seconds for keyboard shortcuts. Default is ...",l:"en/advanced/global.html#seek-step",a:"seek-step"},"13.28":{t:"PLAYBACK_RATE",p:"The built-in list of playback rates. Default is [0.5, 0.75, 1, ...",l:"en/advanced/global.html#playback-rate",a:"playback-rate"},"13.29":{t:"ASPECT_RATIO",p:"The built-in list of video aspect ratios. Default is ['default ...",l:"en/advanced/global.html#aspect-ratio",a:"aspect-ratio"},"13.30":{t:"FLIP",p:"The built-in list of video flip modes. Default is ['normal', ' ...",l:"en/advanced/global.html#flip",a:"flip"},"13.31":{t:"FULLSCREEN_WEB_IN_BODY",p:"Determines whether to mount the player under the body element  ...",l:"en/advanced/global.html#fullscreen-web-in-body",a:"fullscreen-web-in-body"},"13.32":{t:"LOG_VERSION",p:`Sets whether to print the player version. Defaults to true.
+&l ...`,l:"en/advanced/global.html#log-version",a:"log-version"},"13.33":{t:"USE_RAF",p:"Sets whether to use requestAnimationFrame. Defaults to false.  ...",l:"en/advanced/global.html#use-raf",a:"use-raf"},"13.34":{t:"REMOVE_SRC_WHEN_DESTROY",p:"Determines whether to remove the video's src attribute and cal ...",l:"en/advanced/global.html#remove-src-when-destroy",a:"remove-src-when-destroy"},"14.0":{t:"# Writing Plugins",p:"Once you are familiar with the player's properties, methods, a ...",l:"en/advanced/plugin.html",a:"writing-plugins"},"15.0":{t:"# Instance Properties",p:"Here, Instance Properties refer to the first-level properties  ...",l:"en/advanced/property.html",a:"instance-properties"},"15.1":{t:"`play`",p:`
+Type: Function
+
+Play the video.
+<div className="run-c ...`,l:"en/advanced/property.html#play",a:"play"},"15.2":{t:"`pause`",p:`
+Type: Function
+
+Pause the video.
+<div className="run- ...`,l:"en/advanced/property.html#pause",a:"pause"},"15.3":{t:"`toggle`",p:`
+Type: Function
+
+Toggle video playback and pause.
+<div clas ...`,l:"en/advanced/property.html#toggle",a:"toggle"},"15.4":{t:"`destroy`",p:`
+Type: Function
+Parameter: Boolean
+
+Destroy the player. Accept ...`,l:"en/advanced/property.html#destroy",a:"destroy"},"15.5":{t:"`reset`",p:`
+Type: Function
+
+Reset the player's video element: removes the ...`,l:"en/advanced/property.html#reset",a:"reset"},"15.6":{t:"`seek`",p:`
+Type: Setter
+Parameter: Number
+
+Seek to a specific time in th ...`,l:"en/advanced/property.html#seek",a:"seek"},"15.7":{t:"`forward`",p:`
+Type: Setter
+Parameter: Number
+
+Fast forward the video time,  ...`,l:"en/advanced/property.html#forward",a:"forward"},"15.8":{t:"`backward`",p:`
+Type: Setter
+Parameter: Number
+
+Rewind the video time, in sec ...`,l:"en/advanced/property.html#backward",a:"backward"},"15.9":{t:"`volume`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+Set and get the video  ...`,l:"en/advanced/property.html#volume",a:"volume"},"15.10":{t:"`url`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Set and get the video  ...`,l:"en/advanced/property.html#url",a:"url"},"15.11":{t:"`switch`",p:`
+Type: Setter
+Parameter: String
+
+Set the video URL. Similar to ...`,l:"en/advanced/property.html#switch",a:"switch"},"15.12":{t:"`switchUrl`",p:`
+Type: Function
+Parameter: String
+
+Set the video URL. Similar  ...`,l:"en/advanced/property.html#switchurl",a:"switchurl"},"15.13":{t:"`switchQuality`",p:`
+Type: Function
+Parameter: String
+
+Sets the video quality URL. ...`,l:"en/advanced/property.html#switchquality",a:"switchquality"},"15.14":{t:"`muted`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+Sets and gets whether ...`,l:"en/advanced/property.html#muted",a:"muted"},"15.15":{t:"`currentTime`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+Sets and gets the curr ...`,l:"en/advanced/property.html#currenttime",a:"currenttime"},"15.16":{t:"`duration`",p:`
+Type: Getter
+
+Gets the duration of the video.
+<div classNa ...`,l:"en/advanced/property.html#duration",a:"duration"},"15.17":{t:"`screenshot`",p:`
+Type: Function
+
+Downloads a screenshot of the current video f ...`,l:"en/advanced/property.html#screenshot",a:"screenshot"},"15.18":{t:"`getDataURL`",p:`
+Type: Function
+
+Gets the base64 URL of a screenshot of the cu ...`,l:"en/advanced/property.html#getdataurl",a:"getdataurl"},"15.19":{t:"`getBlobUrl`",p:`
+Type: Function
+
+Gets the blob URL of a screenshot of the curr ...`,l:"en/advanced/property.html#getbloburl",a:"getbloburl"},"15.20":{t:"`fullscreen`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+Sets and gets the pla ...`,l:"en/advanced/property.html#fullscreen",a:"fullscreen"},"15.21":{t:"`fullscreenWeb`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+Sets and gets the pla ...`,l:"en/advanced/property.html#fullscreenweb",a:"fullscreenweb"},"15.22":{t:"`pip`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+Sets and gets the pla ...`,l:"en/advanced/property.html#pip",a:"pip"},"15.23":{t:"`poster`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Sets and gets the vide ...`,l:"en/advanced/property.html#poster",a:"poster"},"15.24":{t:"`mini`",p:`
+Type: Setter/Getter
+Parameter: Boolean
+
+Sets and gets the pla ...`,l:"en/advanced/property.html#mini",a:"mini"},"15.25":{t:"`playing`",p:`
+Type: Getter
+Parameter: Boolean
+
+Gets whether the video is cu ...`,l:"en/advanced/property.html#playing",a:"playing"},"15.26":{t:"`state`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Gets or sets the playe ...`,l:"en/advanced/property.html#state",a:"state"},"15.27":{t:"`autoSize`",p:`
+Type: Function
+
+Sets whether the video adapts its size automa ...`,l:"en/advanced/property.html#autosize",a:"autosize"},"15.28":{t:"`rect`",p:`
+Type: Getter
+
+Gets the player's dimensions and coordinate inf ...`,l:"en/advanced/property.html#rect",a:"rect"},"15.29":{t:"`bottom` / `top` / `left` / `right` / `x` / `y` / `width` / `height`",p:`
+Type: Getter
+
+These properties provide shortcut access to rec ...`,l:"en/advanced/property.html#bottom-top-left-right-x-y-width-height",a:"bottom-top-left-right-x-y-width-height"},"15.30":{t:"`flip`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Sets and gets the play ...`,l:"en/advanced/property.html#flip",a:"flip"},"15.31":{t:"`playbackRate`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+Sets and gets the play ...`,l:"en/advanced/property.html#playbackrate",a:"playbackrate"},"15.32":{t:"`aspectRatio`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Sets and gets the play ...`,l:"en/advanced/property.html#aspectratio",a:"aspectratio"},"15.33":{t:"`autoHeight`",p:`
+Type: Function
+
+When the container only has a defined width,  ...`,l:"en/advanced/property.html#autoheight",a:"autoheight"},"15.34":{t:"`attr`",p:`
+Type: Function
+Parameter: String
+
+Dynamically gets and sets a ...`,l:"en/advanced/property.html#attr",a:"attr"},"15.35":{t:"`type`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Dynamically gets and s ...`,l:"en/advanced/property.html#type",a:"type"},"15.36":{t:"`theme`",p:`
+Type: Setter/Getter
+Parameter: String
+
+Dynamically gets and s ...`,l:"en/advanced/property.html#theme",a:"theme"},"15.37":{t:"`airplay`",p:`
+Type: Function
+
+Initiates AirPlay.
+<div className="ru ...`,l:"en/advanced/property.html#airplay",a:"airplay"},"15.38":{t:"`loaded`",p:`
+Type: Getter
+
+The proportion of the video that has been buffe ...`,l:"en/advanced/property.html#loaded",a:"loaded"},"15.39":{t:"`loadedTime`",p:`
+Type: Getter
+
+The amount of media that has been buffered, in  ...`,l:"en/advanced/property.html#loadedtime",a:"loadedtime"},"15.40":{t:"`played`",p:`
+Type: Getter
+
+The proportion of the video that has been playe ...`,l:"en/advanced/property.html#played",a:"played"},"15.41":{t:"`proxy`",p:`
+Type: Function
+
+A proxy function for DOM events, essentially  ...`,l:"en/advanced/property.html#proxy",a:"proxy"},"15.42":{t:"`query`",p:`
+Type: Function
+
+A DOM query function, similar to document.que ...`,l:"en/advanced/property.html#query",a:"query"},"15.43":{t:"`video`",p:`
+Type: Element
+
+Quickly returns the player's video element.
+&l ...`,l:"en/advanced/property.html#video",a:"video"},"15.44":{t:"`cssVar`",p:`
+Type: Function
+
+Dynamically gets or sets CSS variables.
+<d ...`,l:"en/advanced/property.html#cssvar",a:"cssvar"},"15.45":{t:"`quality`",p:`
+Type: Setter
+Parameter: Array
+
+Dynamically sets the list of a ...`,l:"en/advanced/property.html#quality",a:"quality"},"15.46":{t:"`thumbnails`",p:`
+Type: Setter/Getter
+Parameter: Object
+
+Dynamically set thumbn ...`,l:"en/advanced/property.html#thumbnails",a:"thumbnails"},"15.47":{t:"`subtitleOffset`",p:`
+Type: Setter/Getter
+Parameter: Number
+
+Dynamically set subtit ...`,l:"en/advanced/property.html#subtitleoffset",a:"subtitleoffset"},"16.0":{t:"# Context Menu",p:"",l:"en/component/contextmenu.html",a:"context-menu"},"16.1":{t:"Configuration",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+disable
+Boolean
+Whether to di ...`,l:"en/component/contextmenu.html#configuration",a:"configuration"},"16.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#creation",a:"creation"},"16.3":{t:"Addition",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#addition",a:"addition"},"16.4":{t:"Removal",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#removal",a:"removal"},"16.5":{t:"Update",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#update",a:"update"},"17.0":{t:"# Controls",p:"",l:"en/component/controls.html",a:"controls"},"17.1":{t:"Configuration",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+disable
+Boolean
+Whether to di ...`,l:"en/component/controls.html#configuration",a:"configuration"},"17.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#creation",a:"creation"},"17.3":{t:"Adding",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#adding",a:"adding"},"17.4":{t:"Removal",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#removal",a:"removal"},"17.5":{t:"Updating",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#updating",a:"updating"},"18.0":{t:"# Layer",p:"",l:"en/component/layers.html",a:"layer"},"18.1":{t:"Configuration",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+disable
+Boolean
+Whether to di ...`,l:"en/component/layers.html#configuration",a:"configuration"},"18.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#creation",a:"creation"},"18.3":{t:"Addition",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#addition",a:"addition"},"18.4":{t:"Removal",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#removal",a:"removal"},"18.5":{t:"Update",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#update",a:"update"},"19.0":{t:"# Settings Panel",p:"",l:"en/component/setting.html",a:"settings-panel"},"19.1":{t:"Built-in",p:"First, you need to open the settings panel. It comes with four ...",l:"en/component/setting.html#built-in",a:"built-in"},"19.2":{t:"Creating - Buttons",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+html
+String, Element
+Element  ...`,l:"en/component/setting.html#creating-buttons",a:"creating-buttons"},"19.3":{t:"Creating - Selection Lists",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+html
+String, Element
+Element  ...`,l:"en/component/setting.html#creating-selection-lists",a:"creating-selection-lists"},"19.4":{t:"Creating - Nested Lists",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#creating-nested-lists",a:"creating-nested-lists"},"19.5":{t:"Create - Toggle Button",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+html
+String, Element
+DOM elem ...`,l:"en/component/setting.html#create-toggle-button",a:"create-toggle-button"},"19.6":{t:"Create - Range Slider",p:`
+
+
+Property
+Type
+Description
+
+
+
+
+html
+String, Element
+DOM elem ...`,l:"en/component/setting.html#create-range-slider",a:"create-range-slider"},"19.7":{t:"Add",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#add",a:"add"},"19.8":{t:"Remove",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#remove",a:"remove"},"19.9":{t:"Update",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#update",a:"update"},"20.0":{t:"# Installation & Usage",p:"",l:"en/index.html",a:"installation-usage"},"20.1":{t:"Installation",p:`::: code-group
+npm install artplayer
+
+yarn add artplayer
+
+pnpm ...`,l:"en/index.html#installation",a:"installation"},"20.2":{t:"`CDN`",p:`::: code-group
+https://cdn.jsdelivr.net/npm/artplayer/dist/art ...`,l:"en/index.html#cdn",a:"cdn"},"20.3":{t:"Usage",p:`::: code-group
+<html>
+    <head>
+        <title ...`,l:"en/index.html#usage",a:"usage"},"20.4":{t:"`Vue.js`",p:`::: code-group
+<template>
+  <div ref="$container ...`,l:"en/index.html#vue-js",a:"vue-js"},"20.5":{t:"`React.js`",p:`::: code-group
+import Artplayer from 'artplayer'
+import { useE ...`,l:"en/index.html#react-js",a:"react-js"},"20.6":{t:"TypeScript",p:"artplayer.d.ts is automatically imported when importing Artpla ...",l:"en/index.html#typescript",a:"typescript"},"20.7":{t:"Vue.js",p:`
+
+`,l:"en/index.html#vue-js",a:"vue-js"},"20.8":{t:"React.js",p:`import Artplayer from 'artplayer';
+const art = useRef<Artpl ...`,l:"en/index.html#react-js",a:"react-js"},"20.9":{t:"Option",p:`You can also use the option type.
+import Artplayer, { type Opt ...`,l:"en/index.html#option",a:"option"},"20.10":{t:"JavaScript",p:"Sometimes your js files may lose TypeScript type hints. In suc ...",l:"en/index.html#javascript",a:"javascript"},"20.11":{t:"Legacy Browsers",p:"The production build artplayer.js only supports the latest maj ...",l:"en/index.html#legacy-browsers",a:"legacy-browsers"},"20.12":{t:"ECMAScript Module",p:`::: tip ESM Demo:
+https://artplayer.org/esm.html
+:::
+Starting  ...`,l:"en/index.html#ecmascript-module",a:"ecmascript-module"},"20.13":{t:"Custom userAgent",p:"Currently, the detection for whether a device is mobile is not ...",l:"en/index.html#custom-useragent",a:"custom-useragent"},"21.0":{t:"# Language Settings",p:`::: danger
+Due to the increasing number of bundled multilingua ...`,l:"en/start/i18n.html",a:"language-settings"},"21.1":{t:"Default Languages",p:"The default languages are: en, zh-cn. No manual import is requ ...",l:"en/start/i18n.html#default-languages",a:"default-languages"},"21.2":{t:"Importing Languages",p:"Language files before bundling are located at: artplayer/src/i ...",l:"en/start/i18n.html#importing-languages",a:"importing-languages"},"21.3":{t:"Adding a New Language",p:`var art = new Artplayer({
+    container: '.artplayer-app',
+    ...`,l:"en/start/i18n.html#adding-a-new-language",a:"adding-a-new-language"},"21.4":{t:"Modifying Languages",p:`import zhTw from 'artplayer/i18n/zh-tw';
+
+var art = new Artpla ...`,l:"en/start/i18n.html#modifying-languages",a:"modifying-languages"},"22.0":{t:"# Basic Options",p:"",l:"en/start/option.html",a:"basic-options"},"22.1":{t:"`container`",p:`
+Type: String, Element
+Default: #artplayer
+
+The DOM container  ...`,l:"en/start/option.html#container",a:"container"},"22.2":{t:"`url`",p:`
+Type: String
+Default: ''
+
+The video source URL.
+<div class ...`,l:"en/start/option.html#url",a:"url"},"22.3":{t:"`id`",p:`
+Type: String
+Default: ''
+
+The unique identifier for the playe ...`,l:"en/start/option.html#id",a:"id"},"22.4":{t:"`onReady`",p:`
+Type: Function
+Default: undefined
+
+The constructor accepts a  ...`,l:"en/start/option.html#onready",a:"onready"},"22.5":{t:"`poster`",p:`
+Type: String
+Default: ''
+
+The video poster image, which only  ...`,l:"en/start/option.html#poster",a:"poster"},"22.6":{t:"`theme`",p:`
+Type: String
+Default: #f00
+
+The player's theme color, current ...`,l:"en/start/option.html#theme",a:"theme"},"22.7":{t:"`volume`",p:`
+Type: Number
+Default: 0.7
+
+The default volume of the player.
+ ...`,l:"en/start/option.html#volume",a:"volume"},"22.8":{t:"`isLive`",p:`
+Type: Boolean
+Default: false
+
+Enable live streaming mode, whi ...`,l:"en/start/option.html#islive",a:"islive"},"22.9":{t:"`muted`",p:`
+Type: Boolean
+Default: false
+
+Whether to mute by default.
+< ...`,l:"en/start/option.html#muted",a:"muted"},"22.10":{t:"`autoplay`",p:`
+Type: Boolean
+Default: false
+
+Whether to autoplay.
+<div cl ...`,l:"en/start/option.html#autoplay",a:"autoplay"},"22.11":{t:"`autoSize`",p:`
+Type: Boolean
+Default: false
+
+By default, the player's dimens ...`,l:"en/start/option.html#autosize",a:"autosize"},"22.12":{t:"`autoMini`",p:`
+Type: Boolean
+Default: false
+
+Automatically enters mini playe ...`,l:"en/start/option.html#automini",a:"automini"},"22.13":{t:"`loop`",p:`
+Type: Boolean
+Default: false
+
+Whether to enable video looping ...`,l:"en/start/option.html#loop",a:"loop"},"22.14":{t:"`flip`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the video fl ...`,l:"en/start/option.html#flip",a:"flip"},"22.15":{t:"`playbackRate`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the video pl ...`,l:"en/start/option.html#playbackrate",a:"playbackrate"},"22.16":{t:"`aspectRatio`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the video as ...`,l:"en/start/option.html#aspectratio",a:"aspectratio"},"22.17":{t:"`screenshot`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the Video Sc ...`,l:"en/start/option.html#screenshot",a:"screenshot"},"22.18":{t:"`setting`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the toggle b ...`,l:"en/start/option.html#setting",a:"setting"},"22.19":{t:"`hotkey`",p:`
+Type: Boolean
+Default: true
+
+Whether to enable hotkeys.
+<d ...`,l:"en/start/option.html#hotkey",a:"hotkey"},"22.20":{t:"`pip`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the Picture- ...`,l:"en/start/option.html#pip",a:"pip"},"22.21":{t:"`mutex`",p:`
+Type: Boolean
+Default: true
+
+If multiple players exist simult ...`,l:"en/start/option.html#mutex",a:"mutex"},"22.22":{t:"`backdrop`",p:`
+Type: Boolean
+Default: true
+
+Whether to enable the backdrop b ...`,l:"en/start/option.html#backdrop",a:"backdrop"},"22.23":{t:"`fullscreen`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the player W ...`,l:"en/start/option.html#fullscreen",a:"fullscreen"},"22.24":{t:"`fullscreenWeb`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the player W ...`,l:"en/start/option.html#fullscreenweb",a:"fullscreenweb"},"22.25":{t:"`subtitleOffset`",p:`
+Type: Boolean
+Default: false
+
+Subtitle timing offset, range w ...`,l:"en/start/option.html#subtitleoffset",a:"subtitleoffset"},"22.26":{t:"`miniProgressBar`",p:`
+Type: Boolean
+Default: false
+
+Mini progress bar that appears  ...`,l:"en/start/option.html#miniprogressbar",a:"miniprogressbar"},"22.27":{t:"`useSSR`",p:`
+Type: Boolean
+Default: false
+
+Whether to use SSR mount mode.  ...`,l:"en/start/option.html#usessr",a:"usessr"},"22.28":{t:"`playsInline`",p:`
+Type: Boolean
+Default: true
+
+Whether to use playsInline mode  ...`,l:"en/start/option.html#playsinline",a:"playsinline"},"22.29":{t:"`layers`",p:`
+Type: Array
+Default: []
+
+Initialize custom layers.
+<div cl ...`,l:"en/start/option.html#layers",a:"layers"},"22.30":{t:"`settings`",p:`
+Type: Array
+Default: []
+
+Initialize custom settings panel.
+&l ...`,l:"en/start/option.html#settings",a:"settings"},"22.31":{t:"`contextmenu`",p:`
+Type: Array
+Default: []
+
+Initialize custom context menu.
+< ...`,l:"en/start/option.html#contextmenu",a:"contextmenu"},"22.32":{t:"`controls`",p:`
+Type: Array
+Default: []
+
+Initialize custom bottom control bar ...`,l:"en/start/option.html#controls",a:"controls"},"22.33":{t:"`quality`",p:`
+Type: Array
+Default: []
+
+Whether to display the Quality Selec ...`,l:"en/start/option.html#quality",a:"quality"},"22.34":{t:"`highlight`",p:`
+Type: Array
+Default: []
+
+Display Highlight Information on the ...`,l:"en/start/option.html#highlight",a:"highlight"},"22.35":{t:"`plugins`",p:`
+Type: Array
+Default: []
+
+Initialize custom plugins.
+<div c ...`,l:"en/start/option.html#plugins",a:"plugins"},"22.36":{t:"`thumbnails`",p:`
+Type: Object
+Default: {}
+
+Set Preview Thumbnails on the progr ...`,l:"en/start/option.html#thumbnails",a:"thumbnails"},"22.37":{t:"`subtitle`",p:`
+Type: Object
+Default: {}
+
+Set the video subtitle. Supported s ...`,l:"en/start/option.html#subtitle",a:"subtitle"},"22.38":{t:"`moreVideoAttr`",p:`
+Type: Object
+Default: {'controls': false, 'preload': 'metadat ...`,l:"en/start/option.html#morevideoattr",a:"morevideoattr"},"22.39":{t:"`icons`",p:`
+Type: Object
+Default: {}
+
+Used to replace default icons, supp ...`,l:"en/start/option.html#icons",a:"icons"},"22.40":{t:"`type`",p:`
+Type: String
+Default: ''
+
+Used to specify the video format. I ...`,l:"en/start/option.html#type",a:"type"},"22.41":{t:"`customType`",p:`
+Type: Object
+Default: {}
+
+Matches based on the video's type a ...`,l:"en/start/option.html#customtype",a:"customtype"},"22.42":{t:"`lang`",p:`
+Type: String
+Default: navigator.language.toLowerCase()
+
+The d ...`,l:"en/start/option.html#lang",a:"lang"},"22.43":{t:"`i18n`",p:`
+Type: Object
+Default: {}
+
+Custom i18n configuration. This con ...`,l:"en/start/option.html#i18n",a:"i18n"},"22.44":{t:"`lock`",p:`
+Type: Boolean
+Default: false
+
+Whether to display a lock butto ...`,l:"en/start/option.html#lock",a:"lock"},"22.45":{t:"`gesture`",p:`
+Type: Boolean
+Default: true
+
+Whether to enable gesture events ...`,l:"en/start/option.html#gesture",a:"gesture"},"22.46":{t:"`fastForward`",p:`
+Type: Boolean
+Default: false
+
+Whether to add a long-press vid ...`,l:"en/start/option.html#fastforward",a:"fastforward"},"22.47":{t:"`autoPlayback`",p:`
+Type: Boolean
+Default: false
+
+Whether to use the automatic pl ...`,l:"en/start/option.html#autoplayback",a:"autoplayback"},"22.48":{t:"`autoOrientation`",p:`
+Type: Boolean
+Default: false
+
+Whether to rotate the player du ...`,l:"en/start/option.html#autoorientation",a:"autoorientation"},"22.49":{t:"`airplay`",p:`
+Type: Boolean
+Default: false
+
+Whether to display the airplay  ...`,l:"en/start/option.html#airplay",a:"airplay"},"22.50":{t:"`cssVar`",p:`
+Type: Object
+Default: {}
+
+Used to modify built-in CSS variabl ...`,l:"en/start/option.html#cssvar",a:"cssvar"},"22.51":{t:"`proxy`",p:`
+Type: function
+Default: undefined
+
+The function can return a  ...`,l:"en/start/option.html#proxy",a:"proxy"},"23.0":{t:"# 安装使用",p:"",l:"index.html",a:"安装使用"},"23.1":{t:"安装",p:`::: code-group
+npm install artplayer
+
+yarn add artplayer
+
+pnpm ...`,l:"index.html#安装",a:"安装"},"23.2":{t:"`CDN`",p:`::: code-group
+https://cdn.jsdelivr.net/npm/artplayer/dist/art ...`,l:"index.html#cdn",a:"cdn"},"23.3":{t:"使用",p:`::: code-group
+<html>
+    <head>
+        <title ...`,l:"index.html#使用",a:"使用"},"23.4":{t:"`Vue.js`",p:`::: code-group
+<template>
+  <div ref="$container ...`,l:"index.html#vue-js",a:"vue-js"},"23.5":{t:"`React.js`",p:`::: code-group
+import Artplayer from 'artplayer'
+import { useE ...`,l:"index.html#react-js",a:"react-js"},"23.6":{t:"TypeScript",p:`导入 Artplayer 时会自动导入的 artplayer.d.ts
+`,l:"index.html#typescript",a:"typescript"},"23.7":{t:"Vue.js",p:`
+
+`,l:"index.html#vue-js",a:"vue-js"},"23.8":{t:"React.js",p:`import Artplayer from 'artplayer';
+const art = useRef<Artpl ...`,l:"index.html#react-js",a:"react-js"},"23.9":{t:"Option",p:`你也可以使用选项的类型
+import Artplayer, { type Option } from 'artplayer' ...`,l:"index.html#option",a:"option"},"23.10":{t:"JavaScript",p:`有时你的 js 文件会丢失 TypeScript 的类型提示,这时候你可以手动导入类型
+变量:
+/**
+ * @type { ...`,l:"index.html#javascript",a:"javascript"},"23.11":{t:"古老的浏览器",p:`生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version
+对于 ...`,l:"index.html#古老的浏览器",a:"古老的浏览器"},"23.12":{t:"ECMAScript Module",p:`::: tip ESM Demo:
+https://artplayer.org/esm.html
+:::
+从 5.2.6 开 ...`,l:"index.html#ecmascript-module",a:"ecmascript-module"},"23.13":{t:"自定义 userAgent",p:"目前对于是否移动设备的判断并不准确,有时候希望通过改变 userAgent 来调整播放器的UI, 所以在 5.2.4 开始新 ...",l:"index.html#自定义-useragent",a:"自定义-useragent"},"24.0":{t:"# 弹幕库",p:"",l:"plugin/danmuku.html",a:"弹幕库"},"24.1":{t:"演示",p:`👉 查看完整演示
+`,l:"plugin/danmuku.html#演示",a:"演示"},"24.2":{t:"安装",p:`::: code-group
+npm install artplayer-plugin-danmuku
+
+yarn add  ...`,l:"plugin/danmuku.html#安装",a:"安装"},"24.3":{t:"CDN",p:`::: code-group
+https://cdn.jsdelivr.net/npm/artplayer-plugin-d ...`,l:"plugin/danmuku.html#cdn",a:"cdn"},"24.4":{t:"弹幕结构",p:`每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数
+{
+    t ...`,l:"plugin/danmuku.html#弹幕结构",a:"弹幕结构"},"24.5":{t:"全部选项",p:`只有danmuku是必须的参数,其余都是非必填
+{
+    danmuku: [], // 弹幕数据
+    speed:  ...`,l:"plugin/danmuku.html#全部选项",a:"全部选项"},"24.6":{t:"生命周期",p:`来自用户输入的弹幕:
+beforeEmit -> filter -> beforeVisible -> a ...`,l:"plugin/danmuku.html#生命周期",a:"生命周期"},"24.7":{t:"使用弹幕数组",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#使用弹幕数组",a:"使用弹幕数组"},"24.8":{t:"使用弹幕 XML",p:`弹幕 XML 文件,和 Bilibili 网站的弹幕格式一致
+<div className="run-cod ...`,l:"plugin/danmuku.html#使用弹幕-xml",a:"使用弹幕-xml"},"24.9":{t:"使用异步返回",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#使用异步返回",a:"使用异步返回"},"24.10":{t:"`hide/show`",p:`通过方法 hide 和 show 进行隐藏或者显示弹幕
+<div className="run-code&q ...`,l:"plugin/danmuku.html#hide-show",a:"hide-show"},"24.11":{t:"`isHide`",p:`通过属性 isHide 判断当前弹幕是隐藏或者显示
+<div className="run-code&quo ...`,l:"plugin/danmuku.html#ishide",a:"ishide"},"24.12":{t:"`emit`",p:`通过方法 emit 发送一条实时弹幕
+<div className="run-code" data ...`,l:"plugin/danmuku.html#emit",a:"emit"},"24.13":{t:"`config`",p:`通过方法 config 实时改变弹幕配置
+<div className="run-code" da ...`,l:"plugin/danmuku.html#config",a:"config"},"24.14":{t:"`load`",p:`通过 load 方法可以重载弹幕库,或者切换新弹幕库,或者追加新的弹幕库
+<div className="r ...`,l:"plugin/danmuku.html#load",a:"load"},"24.15":{t:"`reset`",p:`用于清空当前显示的弹幕
+<div className="run-code" data-libs=& ...`,l:"plugin/danmuku.html#reset",a:"reset"},"24.16":{t:"`mount`",p:`在初始化弹幕插件的时候,是可以指定弹幕发射器的挂载位置的,默认是挂载在控制栏的中部,你也可以把它挂载在播放器以外的地方。
+当 ...`,l:"plugin/danmuku.html#mount",a:"mount"},"24.17":{t:"`option`",p:`用于获取当前弹幕配置
+<div className="run-code" data-libs=&q ...`,l:"plugin/danmuku.html#option",a:"option"},"24.18":{t:"事件",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#事件",a:"事件"},"25.0":{t:"# 语言设置",p:`::: danger
+鉴于捆绑的多国语言越来越多, 从 5.1.0 版本开始, artplayer.js 核心代码除了包含  ...`,l:"start/i18n.html",a:"语言设置"},"25.1":{t:"默认语言",p:`默认语言有: en, zh-cn, 无需手动导入
+var art = new Artplayer({
+    contain ...`,l:"start/i18n.html#默认语言",a:"默认语言"},"25.2":{t:"导入语言",p:`打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言
+打包后的语言文件存放于: a ...`,l:"start/i18n.html#导入语言",a:"导入语言"},"25.3":{t:"新增语言",p:`var art = new Artplayer({
+    container: '.artplayer-app',
+    ...`,l:"start/i18n.html#新增语言",a:"新增语言"},"25.4":{t:"修改语言",p:`import zhTw from 'artplayer/i18n/zh-tw';
+
+var art = new Artpla ...`,l:"start/i18n.html#修改语言",a:"修改语言"},"26.0":{t:"# 基础选项",p:"",l:"start/option.html",a:"基础选项"},"26.1":{t:"`container`",p:`
+Type: String, Element
+Default: #artplayer
+
+播放器挂载的 DOM 容器
+< ...`,l:"start/option.html#container",a:"container"},"26.2":{t:"`url`",p:`
+Type: String
+Default: ''
+
+视频源地址
+<div className="run-c ...`,l:"start/option.html#url",a:"url"},"26.3":{t:"`id`",p:`
+Type: String
+Default: ''
+
+播放器的唯一标识,目前只用于记忆播放 autoplayback
+< ...`,l:"start/option.html#id",a:"id"},"26.4":{t:"`onReady`",p:`
+Type: Function
+Default: undefined
+
+构造函数接受一个函数作为第二个参数,播放器初始化成功 ...`,l:"start/option.html#onready",a:"onready"},"26.5":{t:"`poster`",p:`
+Type: String
+Default: ''
+
+视频的海报,只会出现在播放器初始化且未播放的状态下
+<div c ...`,l:"start/option.html#poster",a:"poster"},"26.6":{t:"`theme`",p:`
+Type: String
+Default: #f00
+
+播放器主题颜色,目前用于 进度条 和 高亮元素 上
+<div ...`,l:"start/option.html#theme",a:"theme"},"26.7":{t:"`volume`",p:`
+Type: Number
+Default: 0.7
+
+播放器的默认音量
+<div className="r ...`,l:"start/option.html#volume",a:"volume"},"26.8":{t:"`isLive`",p:`
+Type: Boolean
+Default: false
+
+使用直播模式,会隐藏进度条和播放时间
+<div clas ...`,l:"start/option.html#islive",a:"islive"},"26.9":{t:"`muted`",p:`
+Type: Boolean
+Default: false
+
+是否默认静音
+<div className=" ...`,l:"start/option.html#muted",a:"muted"},"26.10":{t:"`autoplay`",p:`
+Type: Boolean
+Default: false
+
+是否自动播放
+<div className=" ...`,l:"start/option.html#autoplay",a:"autoplay"},"26.11":{t:"`autoSize`",p:`
+Type: Boolean
+Default: false
+
+播放器的尺寸默认会填充整个 container 容器尺寸,所以 ...`,l:"start/option.html#autosize",a:"autosize"},"26.12":{t:"`autoMini`",p:`
+Type: Boolean
+Default: false
+
+当播放器滚动到浏览器视口以外时,自动进入 迷你播放 模式
+&l ...`,l:"start/option.html#automini",a:"automini"},"26.13":{t:"`loop`",p:`
+Type: Boolean
+Default: false
+
+是否循环播放
+<div className=" ...`,l:"start/option.html#loop",a:"loop"},"26.14":{t:"`flip`",p:`
+Type: Boolean
+Default: false
+
+是否显示视频翻转功能,目前只出现在 设置面板 和 右键菜单 里 ...`,l:"start/option.html#flip",a:"flip"},"26.15":{t:"`playbackRate`",p:`
+Type: Boolean
+Default: false
+
+是否显示视频播放速度功能,会出现在 设置面板 和 右键菜单 里 ...`,l:"start/option.html#playbackrate",a:"playbackrate"},"26.16":{t:"`aspectRatio`",p:`
+Type: Boolean
+Default: false
+
+是否显示视频长宽比功能,会出现在 设置面板 和 右键菜单 里
+ ...`,l:"start/option.html#aspectratio",a:"aspectratio"},"26.17":{t:"`screenshot`",p:`
+Type: Boolean
+Default: false
+
+是否在底部控制栏里显示 视频截图 功能
+<div cla ...`,l:"start/option.html#screenshot",a:"screenshot"},"26.18":{t:"`setting`",p:`
+Type: Boolean
+Default: false
+
+是否在底部控制栏里显示 设置面板 的开关按钮
+<div  ...`,l:"start/option.html#setting",a:"setting"},"26.19":{t:"`hotkey`",p:`
+Type: Boolean
+Default: true
+
+是否使用快捷键
+<div className=" ...`,l:"start/option.html#hotkey",a:"hotkey"},"26.20":{t:"`pip`",p:`
+Type: Boolean
+Default: false
+
+是否在底部控制栏里显示 画中画 的开关按钮
+<div c ...`,l:"start/option.html#pip",a:"pip"},"26.21":{t:"`mutex`",p:`
+Type: Boolean
+Default: true
+
+假如页面里同时存在多个播放器,是否只能让一个播放器播放
+< ...`,l:"start/option.html#mutex",a:"mutex"},"26.22":{t:"`backdrop`",p:`
+Type: Boolean
+Default: true
+
+是否开启播放器 UI 的背景虚化效果。开启后,设置面板、右键菜单 ...`,l:"start/option.html#backdrop",a:"backdrop"},"26.23":{t:"`fullscreen`",p:`
+Type: Boolean
+Default: false
+
+是否在底部控制栏里显示播放器 窗口全屏 按钮
+<div  ...`,l:"start/option.html#fullscreen",a:"fullscreen"},"26.24":{t:"`fullscreenWeb`",p:`
+Type: Boolean
+Default: false
+
+是否在底部控制栏里显示播放器 网页全屏 按钮
+<div  ...`,l:"start/option.html#fullscreenweb",a:"fullscreenweb"},"26.25":{t:"`subtitleOffset`",p:`
+Type: Boolean
+Default: false
+
+字幕时间偏移,范围在 [-5s, 5s],出现在 设置面板 里 ...`,l:"start/option.html#subtitleoffset",a:"subtitleoffset"},"26.26":{t:"`miniProgressBar`",p:`
+Type: Boolean
+Default: false
+
+迷你进度条,只在播放器失去焦点后且正在播放时出现
+<di ...`,l:"start/option.html#miniprogressbar",a:"miniprogressbar"},"26.27":{t:"`useSSR`",p:`
+Type: Boolean
+Default: false
+
+是否使用 SSR 挂载模式,假如你希望在播放器挂载前,就提前渲 ...`,l:"start/option.html#usessr",a:"usessr"},"26.28":{t:"`playsInline`",p:`
+Type: Boolean
+Default: true
+
+在移动端是否使用 playsInline 模式
+<div  ...`,l:"start/option.html#playsinline",a:"playsinline"},"26.29":{t:"`layers`",p:`
+Type: Array
+Default: []
+
+初始化自定义的 层
+<div className="ru ...`,l:"start/option.html#layers",a:"layers"},"26.30":{t:"`settings`",p:`
+Type: Array
+Default: []
+
+初始化自定义的 设置面板
+<div className=" ...`,l:"start/option.html#settings",a:"settings"},"26.31":{t:"`contextmenu`",p:`
+Type: Array
+Default: []
+
+初始化自定义的 右键菜单
+<div className=" ...`,l:"start/option.html#contextmenu",a:"contextmenu"},"26.32":{t:"`controls`",p:`
+Type: Array
+Default: []
+
+初始化自定义的底部 控制栏
+<div className=&quo ...`,l:"start/option.html#controls",a:"controls"},"26.33":{t:"`quality`",p:`
+Type: Array
+Default: []
+
+是否在底部控制栏里显示 画质选择 列表
+
+
+
+属性
+类型
+描述
+
+
+
+
+ ...`,l:"start/option.html#quality",a:"quality"},"26.34":{t:"`highlight`",p:`
+Type: Array
+Default: []
+
+在进度条上显示 高亮信息
+
+
+
+属性
+类型
+描述
+
+
+
+
+time
+Nu ...`,l:"start/option.html#highlight",a:"highlight"},"26.35":{t:"`plugins`",p:`
+Type: Array
+Default: []
+
+初始化自定义的 插件
+<div className="r ...`,l:"start/option.html#plugins",a:"plugins"},"26.36":{t:"`thumbnails`",p:`
+Type: Object
+Default: {}
+
+在进度条上设置 预览图
+
+
+
+属性
+类型
+描述
+
+
+
+
+url
+Str ...`,l:"start/option.html#thumbnails",a:"thumbnails"},"26.37":{t:"`subtitle`",p:`
+Type: Object
+Default: {}
+
+设置视频的字幕,支持字幕格式:vtt, srt, ass
+
+
+
+属性
+ ...`,l:"start/option.html#subtitle",a:"subtitle"},"26.38":{t:"`moreVideoAttr`",p:`
+Type: Object
+Default: {'controls': false, 'preload': 'metadat ...`,l:"start/option.html#morevideoattr",a:"morevideoattr"},"26.39":{t:"`icons`",p:`
+Type: Object
+Default: {}
+
+用于替换默认图标,支持 Html 字符串和 HTMLElement
+& ...`,l:"start/option.html#icons",a:"icons"},"26.40":{t:"`type`",p:`
+Type: String
+Default: ''
+
+用于指明视频的格式,需要配合 customType 一起使用,默认视频 ...`,l:"start/option.html#type",a:"type"},"26.41":{t:"`customType`",p:`
+Type: Object
+Default: {}
+
+通过视频的 type 进行匹配,把视频解码权交给第三方程序进行处理,处 ...`,l:"start/option.html#customtype",a:"customtype"},"26.42":{t:"`lang`",p:`
+Type: String
+Default: navigator.language.toLowerCase()
+
+默认显示语 ...`,l:"start/option.html#lang",a:"lang"},"26.43":{t:"`i18n`",p:`
+Type: Object
+Default: {}
+
+自定义 i18n 配置,该配置会和自带的 i18n 进行深度合并
+新增 ...`,l:"start/option.html#i18n",a:"i18n"},"26.44":{t:"`lock`",p:`
+Type: Boolean
+Default: false
+
+是否在移动端显示一个 锁定按钮 ,用于隐藏底部 控制栏
+< ...`,l:"start/option.html#lock",a:"lock"},"26.45":{t:"`gesture`",p:`
+Type: Boolean
+Default: true
+
+是否在移动端启用视频元素上的手势事件
+<div class ...`,l:"start/option.html#gesture",a:"gesture"},"26.46":{t:"`fastForward`",p:`
+Type: Boolean
+Default: false
+
+是否在移动端添加长按视频快进功能
+<div classN ...`,l:"start/option.html#fastforward",a:"fastforward"},"26.47":{t:"`autoPlayback`",p:`
+Type: Boolean
+Default: false
+
+是否使用自动 回放功能
+<div className=& ...`,l:"start/option.html#autoplayback",a:"autoplayback"},"26.48":{t:"`autoOrientation`",p:`
+Type: Boolean
+Default: false
+
+是否在移动端的网页全屏时,根据视频尺寸和视口尺寸,旋转播放器
+ ...`,l:"start/option.html#autoorientation",a:"autoorientation"},"26.49":{t:"`airplay`",p:`
+Type: Boolean
+Default: false
+
+是否显示 airplay 按钮,当前只有部分浏览器支持该功能
+ ...`,l:"start/option.html#airplay",a:"airplay"},"26.50":{t:"`cssVar`",p:`
+Type: Object
+Default: {}
+
+用于改变内置的css变量
+<div className=&quo ...`,l:"start/option.html#cssvar",a:"cssvar"},"26.51":{t:"`proxy`",p:`
+Type: function
+Default: undefined
+
+函数可以返回一个第三方的 HTMLCanvasEle ...`,l:"start/option.html#proxy",a:"proxy"}},n={previewLength:62,buttonLabel:"Search",placeholder:"Search docs",allow:[],ignore:[]},a={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:n};export{a as default};
diff --git a/docs/document/assets/chunks/virtual_search-data.lPsPwGvM.js b/docs/document/assets/chunks/virtual_search-data.lPsPwGvM.js
deleted file mode 100644
index 71bf6da06..000000000
--- a/docs/document/assets/chunks/virtual_search-data.lPsPwGvM.js
+++ /dev/null
@@ -1,1368 +0,0 @@
-const e={map:'[{"高级属性":["0.0"],"option":["0.1","1.12","10.1","11.12","20.9","23.9","24.17"],"template":["0.2","10.2"],"events":["0.3","10.3"],"storage":["0.4","10.4"],"icons":["0.5","10.5","22.38","26.38"],"i18n":["0.6","10.6","22.42","26.42"],"notice":["0.7","3.4","10.7","13.4"],"layers":["0.8","10.8","22.28","26.28"],"controls":["0.9","10.9","22.31","26.31"],"contextmenu":["0.10","2.37","3.3","10.10","12.37","13.3","22.30","26.30"],"subtitle":["0.11","2.36","10.11","12.36","22.36","26.36"],"loading":["0.12","2.34","10.12","12.34"],"hotkey":["0.13","2.5","10.13","12.5","22.19","26.19"],"mask":["0.14","2.35","10.14","12.35"],"setting":["0.15","2.39","3.5","3.6","3.7","10.15","12.39","13.5","13.6","13.7","22.18","26.18"],"plugins":["0.16","10.16","22.34","26.34"],"静态属性":["1.0"],"instances":["1.1","11.1"],"version":["1.2","11.2"],"env":["1.3","11.3"],"build":["1.4","11.4"],"config":["1.5","11.5","24.13"],"utils":["1.6","11.6"],"scheme":["1.7","11.7"],"emitter":["1.8","11.8"],"validator":["1.9","11.9"],"kindof":["1.10","11.10"],"html":["1.11","11.11"],"实例事件":["2.0"],"ready":["2.1","12.1"],"restart":["2.2","12.2"],"pause":["2.3","5.2","12.3","15.2"],"play":["2.4","5.1","12.4","15.1"],"destroy":["2.6","5.4","12.6","15.4"],"focus":["2.7","12.7"],"blur":["2.8","12.8"],"dblclick":["2.9","12.9"],"click":["2.10","12.10"],"error":["2.11","12.11"],"hover":["2.12","12.12"],"mousemove":["2.13","12.13"],"resize":["2.14","3.8","12.14","13.8"],"view":["2.15","12.15"],"lock":["2.16","12.16","22.43","26.43"],"aspectratio":["2.17","5.29","12.17","15.29","22.16","26.16"],"autoheight":["2.18","5.30","12.18","15.30"],"autosize":["2.19","5.25","12.19","15.25","22.11","26.11"],"flip":["2.20","3.30","5.27","12.20","13.30","15.27","22.14","26.14"],"fullscreen":["2.21","3.31","5.19","12.21","13.31","15.19","22.22","26.22"],"fullscreenerror":["2.22","12.22"],"fullscreenweb":["2.23","5.20","12.23","15.20","22.23","26.23"],"mini":["2.24","5.23","12.24","15.23"],"pip":["2.25","5.21","12.25","15.21","22.20","26.20"],"screenshot":["2.26","5.16","12.26","15.16","22.17","26.17"],"seek":["2.27","3.27","5.5","12.27","13.27","15.5"],"subtitleoffset":["2.28","5.43","12.28","15.43","22.24","26.24"],"subtitlebeforeupdate":["2.29","12.29"],"subtitleafterupdate":["2.30","12.30"],"subtitleload":["2.31","12.31"],"info":["2.32","3.22","12.32","13.22"],"layer":["2.33","12.33","18.0"],"control":["2.38","3.16","12.38","13.16"],"muted":["2.40","5.13","12.40","15.13","22.9","26.9"],"keydown":["2.41","12.41"],"video":["2.42","2.43","2.44","2.45","2.46","2.47","2.48","2.49","2.50","2.51","2.52","2.53","2.54","2.55","2.56","2.57","2.58","2.59","2.60","2.61","2.62","5.39","12.42","12.43","12.44","12.45","12.46","12.47","12.48","12.49","12.50","12.51","12.52","12.53","12.54","12.55","12.56","12.57","12.58","12.59","12.60","12.61","12.62","15.39"],"全局属性":["3.0"],"debug":["3.1","13.1"],"style":["3.2","13.2"],"scroll":["3.9","3.10","13.9","13.10"],"auto":["3.11","3.12","3.13","3.21","13.11","13.12","13.13","13.21"],"reconnect":["3.14","3.15","13.14","13.15"],"dbclick":["3.17","3.18","13.17","13.18"],"mobile":["3.19","3.20","13.19","13.20"],"fast":["3.23","3.24","13.23","13.24"],"touch":["3.25","13.25"],"volume":["3.26","5.8","13.26","15.8","22.7","26.7"],"playback":["3.28","13.28"],"aspect":["3.29","13.29"],"log":["3.32","13.32"],"use":["3.33","13.33"],"编写插件":["4.0"],"实例属性":["5.0"],"toggle":["5.3","15.3"],"forward":["5.6","15.6"],"backward":["5.7","15.7"],"url":["5.9","15.9","22.2","26.2"],"switch":["5.10","15.10"],"switchurl":["5.11","15.11"],"switchquality":["5.12","15.12"],"currenttime":["5.14","15.14"],"duration":["5.15","15.15"],"getdataurl":["5.17","15.17"],"getbloburl":["5.18","15.18"],"poster":["5.22","15.22","22.5","26.5"],"playing":["5.24","15.24"],"rect":["5.26","15.26"],"playbackrate":["5.28","15.28","22.15","26.15"],"attr":["5.31","15.31"],"type":["5.32","15.32","22.39","26.39"],"theme":["5.33","15.33","22.6","26.6"],"airplay":["5.34","15.34","22.48","26.48"],"loaded":["5.35","15.35"],"played":["5.36","15.36"],"proxy":["5.37","15.37","22.50","26.50"],"query":["5.38","15.38"],"cssvar":["5.40","15.40","22.49","26.49"],"quality":["5.41","15.41","22.32","26.32"],"thumbnails":["5.42","15.42","22.35","26.35"],"右键菜单":["6.0"],"配置":["6.1","7.1","8.1"],"创建":["6.2","7.2","8.2","9.2","9.3","9.4","9.5","9.6"],"添加":["6.3","7.3","8.3","9.7"],"删除":["6.4","7.4","8.4","9.8"],"更新":["6.5","7.5","8.5","9.9"],"控制器":["7.0"],"业务层":["8.0"],"设置面板":["9.0"],"内置":["9.1"],"advanced":["10.0"],"static":["11.0"],"example":["12.0"],"global":["13.0"],"writing":["14.0"],"instance":["15.0"],"context":["16.0"],"configuration":["16.1","17.1","18.1"],"creation":["16.2","17.2","18.2"],"add":["16.3","18.3","19.7","21.3"],"delete":["16.4","17.4","18.4","19.8"],"updates":["16.5","19.9"],"controller":["17.0"],"adding":["17.3"],"update":["17.5","18.5"],"settings":["19.0","22.29","26.29"],"built":["19.1"],"create":["19.2","19.3","19.5","19.6"],"creating":["19.4"],"installation":["20.0","20.1"],"cdn":["20.2","23.2","24.3"],"usage":["20.3"],"vue":["20.4","20.7","23.4","23.7"],"react":["20.5","20.8","23.5","23.8"],"typescript":["20.6","23.6"],"javascript":["20.10","23.10"],"ancient":["20.11"],"ecmascript":["20.12","23.12"],"custom":["20.13"],"language":["21.0"],"default":["21.1"],"importing":["21.2"],"modify":["21.4"],"basic":["22.0"],"container":["22.1","26.1"],"id":["22.3","26.3"],"onready":["22.4","26.4"],"islive":["22.8","26.8"],"autoplay":["22.10","26.10"],"automini":["22.12","26.12"],"loop":["22.13","26.13"],"mutex":["22.21","26.21"],"miniprogressbar":["22.25","26.25"],"usessr":["22.26","26.26"],"playsinline":["22.27","26.27"],"highlight":["22.33","26.33"],"morevideoattr":["22.37","26.37"],"customtype":["22.40","26.40"],"lang":["22.41","26.41"],"gesture":["22.44","26.44"],"fastforward":["22.45","26.45"],"autoplayback":["22.46","26.46"],"autoorientation":["22.47","26.47"],"安装使用":["23.0"],"安装":["23.1","24.2"],"使用":["23.3"],"古老的浏览器":["23.11"],"自定义":["23.13"],"弹幕库":["24.0"],"演示":["24.1"],"弹幕结构":["24.4"],"全部选项":["24.5"],"生命周期":["24.6"],"使用弹幕数组":["24.7"],"使用弹幕":["24.8"],"使用异步返回":["24.9"],"hide":["24.10"],"ishide":["24.11"],"emit":["24.12"],"load":["24.14"],"reset":["24.15"],"mount":["24.16"],"事件":["24.18"],"语言设置":["25.0"],"默认语言":["25.1"],"导入语言":["25.2"],"新增语言":["25.3"],"修改语言":["25.4"],"基础选项":["26.0"]},{"0":["3.28","5.35","5.36","22.7","26.7"],"1":["23.11","24.5"],"3":["3.29","23.9"],"4":["3.29","21.3","25.3"],"5":["3.28","8.2","18.2","24.5"],"7":["8.3","18.3","22.7"],"9":["25.3"],"10":["24.5"],"15":["4.0","14.0"],"21":["8.5","9.9","18.5","19.9"],"26":["7.5","17.5"],"27":["9.9","19.9"],"75":["3.28"],"250":["3.5"],"这里的":["0.0","1.0","3.0","5.0"],"播放器的选项":["0.1"],"div":["0.1","0.2","0.4","0.5","0.7","0.13","0.16","1.1","1.6","2.0","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.3","4.0","5.1","5.2","5.3","5.15","5.26","5.30","5.34","5.41","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","10.1","14.0","15.15","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.28","22.29","24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.28","26.29","26.30","26.31"],"classname":["0.1","0.2","0.16","2.0","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","4.0","5.41","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","14.0","15.15","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.28","22.29","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.28","26.29"],"run":["0.1","0.2","2.0","2.2","2.6","2.11","2.12","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","2.39","4.0","5.41","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","22.2","22.28","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.28","26.29"],"管理播放器所有的":["0.2","0.3","0.5"],"dom":["0.2","0.3","5.37","5.38","9.2","9.3","9.5","9.6","10.2","10.3","15.37","15.38","19.2","19.3","19.5","19.6","22.1","26.1"],"元素":["0.2","9.5","9.6"],"事件":["0.3","4.0"],"实质上是代理了":["0.3"],"addeventlistener":["0.3","5.37","10.3","15.37"],"和":["0.3","4.0","5.12","24.8","24.10","26.4"],"removeeventlistener":["0.3","10.3"],"当使用以下方法来处理事件":["0.3"],"播放器销毁时也会自动销毁该事件":["0.3"],"管理播放器的本地存储":["0.4"],"name":["0.4","4.0","10.4","17.1"],"属性用于设置缓存的":["0.4"],"key":["0.4","10.4"],"set":["0.4","10.4","13.6","13.7","15.10","15.11","15.12","15.13","15.14","15.19","15.20","15.21","15.22","15.27","15.28","15.29","22.35","22.36"],"方法用于设置缓存":["0.4"],"get":["0.4","0.6","10.6","15.14","15.15","15.19","15.21","15.22","15.24","15.31"],"方法用于获取缓存":["0.4"],"del":["0.4"],"方法用于删除缓存":["0.4"],"clear":["0.4"],"方法用于清空缓存":["0.4"],"svg":["0.5","10.5"],"图标":["0.5"],"管理播放器的":["0.6"],"方法用于获取":["0.6"],"的值":["0.6"],"update":["0.6","0.8","0.9","0.10","0.15"],"管理播放器的提示语":["0.7"],"只有一个":["0.7"],"show":["0.7","0.12","0.14","10.12","10.14","22.17","22.20","22.32","22.33","24.10"],"属性用于显示提示语":["0.7"],"管理播放器的层":["0.8"],"add":["0.8","0.9","0.10","0.13","0.15","0.16","10.8","10.9","10.10","10.13","10.15"],"方法用于动态添加层":["0.8"],"remove":["0.8","0.9","0.10","0.13","0.15"],"方法用于动态删除层":["0.8"],"管理播放器的控制器":["0.9"],"方法用于动态添加控制器":["0.9"],"方法用于动态删除控制器":["0.9"],"管理播放器的右键菜单":["0.10"],"方法用于动态添加菜单":["0.10"],"方法用于动态删除菜单":["0.10"],"方法用于动态更新菜单":["0.10"],"管理播放器的字幕功能":["0.11"],"url":["0.11","5.11","10.11"],"属性设置和返回当前字幕地址":["0.11"],"style":["0.11"],"方法设置当前字幕的样式":["0.11"],"switch":["0.11"],"管理播放器的加载层":["0.12"],"属性用于设置是否显示加载层":["0.12"],"toggle":["0.12","0.14","19.5"],"管理播放器的快捷键功能":["0.13"],"方法用于添加快捷键":["0.13"],"方法用于删除快捷键":["0.13"],"管理播放器的遮罩层":["0.14"],"属性用于设置是否显示遮罩层":["0.14"],"管理播放器的设置面板":["0.15"],"方法用于动态添加设置项":["0.15"],"方法用于动态删除设置项":["0.15"],"方法用于动态更新设置项":["0.15"],"管理播放器的插件功能":["0.16"],"只有一个方法":["0.16"],"用于动态添加插件":["0.16"],"返回全部播放器实例的数组":["1.1"],"假如你想同时管理多个播放器的时候":["1.1"],"可以用到该属性":["1.1"],"返回播放器的版本信息":["1.2"],"返回播放器的环境变量":["1.3"],"返回播放器的打包时间":["1.4"],"返回视频的默认配置":["1.5"],"返回播放器的工具函数集合":["1.6"],"返回播放器选项的校验方案":["1.7"],"返回事件分发器的构造函数":["1.8"],"返回选项的校验函数":["1.9"],"返回类型检测的函数工具":["1.10"],"返回播放器所需的":["1.11"],"返回播放器的默认选项":["1.12"],"播放器的事件分为两种":["2.0"],"一种视频的":["2.0"],"原生事件":["2.0"],"前缀":["2.0"],"video":["2.0","12.0","13.29","13.30","15.1","15.2","15.7","15.10","15.11","15.12","15.15","22.2","22.36","22.39","22.40"],"另外一种是":["2.0"],"自定义事件":["2.0"],"监听事件":["2.0"],"code":["2.0","2.2","2.28","4.0","6.2","6.3","6.4","6.5","7.2","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.4","9.7","9.8","9.9","14.0","16.2","16.3","16.4","16.5","17.2","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.4","19.7","19.8","19.9","20.1","20.2","20.3","20.4","20.5","22.2","22.28","23.1","23.2","23.3","23.4","23.5","24.2","24.3","24.6","24.7","24.9","24.11","24.12","24.13","24.14","24.15","24.17","24.18","26.2","26.28"],"js":["2.0","4.0","6.5","7.2","7.3","7.5","8.2","8.3","8.5","9.4","9.8","9.9","14.0","16.5","17.2","17.3","17.5","18.2","18.3","18.5","19.4","19.8","19.9","20.4","20.5","20.7","20.8","20.10","20.11","21.3","21.4","23.4","23.5","23.7","23.8","23.10","23.11","24.5","24.18","25.2","25.3","25.4"],"当播放器首次可以播放器时触发":["2.1"],"当播放器切换地址后并可以播放时触发":["2.2"],"当播放器暂停时触发":["2.3"],"当播放器播放时触发":["2.4"],"当播放器热键被按下时触发":["2.5"],"当播放器销毁时触发":["2.6"],"当播放器获得焦点时触发":["2.7"],"当播放器失去焦点时触发":["2.8"],"当播放器被双击时触发":["2.9"],"当播放器被单击时触发":["2.10"],"当播放器加载视频发生错误时触发":["2.11"],"当播放器被鼠标移出或者移入时触发":["2.12"],"当播放器被鼠标经过时触发":["2.13"],"当播放器尺寸变化时触发":["2.14"],"当播放器出现在视口时触发":["2.15"],"在移动端":["2.16","3.19","3.20","3.21","3.23","3.24","3.25"],"当锁定的状态发生变化时触发":["2.16"],"当播放器长宽比变化时触发":["2.17"],"当播放器自动设置高度时触发":["2.18"],"当播放器自动设置尺寸时触发":["2.19"],"当播放器发生翻转时触发":["2.20"],"当播放器发生窗口全屏时触发":["2.21"],"当播放器发生窗口全屏错误时触发":["2.22"],"当播放器发生网页全屏时触发":["2.23"],"当播放器进入迷你模式时触发":["2.24"],"当播放器进入画中画时触发":["2.25"],"当播放器被截图时触发":["2.26"],"当播放器发生时间跳转时触发":["2.27"],"当播放器发生字幕偏移时触发":["2.28"],"当字幕更新前触发":["2.29"],"当字幕更新后触发":["2.30"],"当字幕加载时触发":["2.31"],"当信息面板显示或隐藏时触发":["2.32"],"当自定义层显示或隐藏时触发":["2.33"],"当加载器显示或隐藏时触发":["2.34"],"当遮罩层显示或隐藏时触发":["2.35"],"当字幕层显示或隐藏时触发":["2.36"],"当右键菜单显示或隐藏时触发":["2.37"],"当控制器显示或隐藏时触发":["2.38"],"当设置面板显示或隐藏时触发":["2.39"],"当静音的状态变化时触发":["2.40"],"监听来自":["2.41"],"document":["2.41"],"的":["2.41"],"canplay":["2.42","12.42"],"canplaythrough":["2.43","12.43"],"complete":["2.44","12.44"],"durationchange":["2.45","12.45"],"emptied":["2.46","12.46"],"ended":["2.47","12.47"],"error":["2.48","12.48"],"loadeddata":["2.49","12.49"],"loadedmetadata":["2.50","12.50"],"pause":["2.51","12.51","13.20"],"play":["2.52","3.19","3.20","12.52","13.19","13.20","15.3","22.10"],"playing":["2.53","12.53"],"progress":["2.54","12.54","22.35"],"ratechange":["2.55","12.55"],"seeked":["2.56","12.56"],"seeking":["2.57","12.57"],"stalled":["2.58","12.58"],"suspend":["2.59","12.59"],"timeupdate":["2.60","12.60"],"volumechange":["2.61","12.61"],"waiting":["2.62","12.62"],"是否开始":["3.1"],"模式":["3.1"],"返回播放器样式文本":["3.2"],"是否开启右键菜单":["3.3"],"默认开启":["3.3"],"time":["3.4","3.8","3.9","3.14","3.15","3.16","3.17","3.21","3.22","3.24","13.4","13.8","13.9","13.14","13.15","13.16","13.17","13.21","13.22","13.24","22.24"],"提示信息的显示时长":["3.4"],"单位为毫秒":["3.4","3.8","3.9","3.13","3.16","3.17","3.22"],"width":["3.5","3.6","9.3","13.5","13.6","15.30"],"设置面板的默认宽度":["3.5"],"单位为像素":["3.5","3.6","3.7","3.10"],"默认为":["3.5","3.6","3.7","3.11","3.17","3.26","3.28","3.29","3.30","3.32","3.33"],"item":["3.6","3.7","13.6","13.7","19.2","19.3"],"设置面板的设置项的默认宽度":["3.6"],"height":["3.7","13.7"],"设置面板的设置项的默认高度":["3.7"],"事件的节流时间":["3.8","3.9"],"gap":["3.10","13.10"],"view":["3.10"],"事件的边界容差距离":["3.10"],"playback":["3.11","3.12","3.13","12.53","13.11","13.12","13.13","22.46"],"max":["3.11","3.14","13.11","13.14"],"自动回放功能的最大记录数":["3.11"],"min":["3.12","13.12"],"自动回放功能的最小记录时长":["3.12"],"单位为秒":["3.12","3.27"],"timeout":["3.13","13.13"],"自动回放功能的隐藏延迟时长":["3.13"],"发生连接错误时":["3.14","3.15"],"自动连接的最大次数":["3.14"],"sleep":["3.15","13.15"],"自动连接的延迟时间":["3.15"],"hide":["3.16","13.16"],"底部控制栏的自动隐藏的延迟时间":["3.16"],"双击事件的延迟事件":["3.17"],"fullscreen":["3.18","13.18"],"在桌面端":["3.18"],"是否双击切换全屏":["3.18"],"dbclick":["3.19","13.19"],"是否双击切换播放暂停":["3.19"],"click":["3.20","10.10","13.17","13.20"],"是否单击切换播放暂停":["3.20"],"orientation":["3.21","13.21"],"自动旋屏的延迟时间":["3.21"],"loop":["3.22","13.22"],"信息面板的刷新时间":["3.22"],"forward":["3.23","3.24","13.23","13.24"],"value":["3.23","13.23"],"长按加速的速率倍数":["3.23"],"长按加速的延迟时间":["3.24"],"move":["3.25","13.25"],"ratio":["3.25","3.29","12.17","13.25","13.26","13.29"],"左右滑动进度的速率倍数":["3.25"],"step":["3.26","3.27","13.26","13.27"],"快捷键调节音量的幅度比例":["3.26"],"快捷键调节播放进度的幅度":["3.27"],"rate":["3.28","13.28"],"内置播放速率的列表":["3.28"],"内置视频长宽比的列表":["3.29"],"default":["3.29","13.5","13.6","13.7","22.1","22.2","22.3","22.4","22.5","22.6","22.7","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.28","22.29","22.30","22.31","22.32","22.33","22.34","22.35","22.36","22.37","22.38","22.39","22.40","22.41","22.42","22.43","22.44","22.45","22.46","22.47","22.48","22.49","22.50","26.1","26.2","26.3","26.4","26.5","26.6","26.7","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.28","26.29","26.30","26.31","26.32","26.33","26.34","26.35","26.36","26.37","26.38","26.39","26.40","26.41","26.42","26.43","26.44","26.45","26.46","26.47","26.48","26.49","26.50"],"内置视频翻转的列表":["3.30"],"normal":["3.30"],"horizontal":["3.30"],"vertical":["3.30"],"web":["3.31","13.31"],"in":["3.31","10.3","13.24","13.28","13.29","13.30","13.31","19.1","21.2","22.39"],"body":["3.31","13.31"],"网页全屏时":["3.31"],"version":["3.32","13.32"],"设置是否打印播放器版本":["3.32"],"raf":["3.33","13.33"],"设置是否使用":["3.33"],"requestanimationframe":["3.33"],"但你已经知道播放器的":["4.0"],"属性":["4.0","6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.32","26.33","26.35","26.36"],"方法":["4.0"],"后":["4.0"],"再编写插件是非常简单的事":["4.0"],"可以在实例化的时候加载插件的函数":["4.0"],"function":["4.0","5.1","5.2","5.3","5.4","5.11","5.12","5.16","5.17","5.18","5.25","5.30","5.31","5.34","5.37","5.38","5.40","9.3","15.1","15.2","15.3","15.4","15.11","15.12","15.16","15.17","15.18","15.25","15.30","15.31","15.34","15.37","15.38","15.40","19.3","22.4","22.50","26.4","26.50"],"myplugin":["4.0"],"art":["4.0","5.11","7.2","15.11","17.2"],"console":["4.0"],"info":["4.0"],"return":["4.0"],"something":["4.0"],"type":["5.1","5.2","5.3","5.4","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.26","5.27","5.28","5.29","5.30","5.31","5.33","5.34","5.35","5.36","5.37","5.38","5.39","5.40","5.41","5.42","5.43","15.1","15.2","15.3","15.4","15.5","15.6","15.7","15.8","15.9","15.10","15.11","15.12","15.13","15.14","15.15","15.16","15.17","15.18","15.19","15.20","15.21","15.22","15.23","15.24","15.25","15.26","15.27","15.28","15.29","15.30","15.31","15.33","15.34","15.35","15.36","15.37","15.38","15.39","15.40","15.41","15.42","15.43","16.1","17.1","18.1","19.2","19.3","19.5","19.6","20.10","22.1","22.2","22.3","22.4","22.5","22.6","22.7","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.28","22.29","22.30","22.31","22.32","22.33","22.34","22.35","22.36","22.37","22.38","22.40","22.41","22.42","22.43","22.44","22.45","22.46","22.47","22.48","22.49","22.50","26.1","26.2","26.3","26.4","26.5","26.6","26.7","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.28","26.29","26.30","26.31","26.32","26.33","26.34","26.35","26.36","26.37","26.38","26.40","26.41","26.42","26.43","26.44","26.45","26.46","26.47","26.48","26.49","26.50"],"播放视频":["5.1"],"暂停视频":["5.2"],"切换视频的播放和暂停":["5.3"],"parameter":["5.4","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.19","5.20","5.21","5.22","5.23","5.24","5.27","5.28","5.29","5.31","5.32","5.33","5.41","5.42","5.43","15.4","15.5","15.6","15.7","15.8","15.9","15.10","15.11","15.12","15.13","15.14","15.19","15.20","15.21","15.22","15.23","15.24","15.27","15.28","15.29","15.31","15.32","15.33","15.41","15.42","15.43"],"boolean":["5.4","5.13","5.19","5.20","5.21","5.24","7.1","15.4","15.13","15.19","15.20","15.21","15.23","15.24","16.1","17.1","18.1","22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.19","22.20","22.21","22.22","22.23","22.24","22.25","22.26","22.27","22.43","22.44","22.45","22.46","22.47","22.48","26.8","26.9","26.10","26.11","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.19","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.43","26.44","26.45","26.46","26.47","26.48"],"setter":["5.5","5.6","5.7","5.8","5.9","5.10","5.13","5.14","5.19","5.20","5.21","5.22","5.23","5.27","5.28","5.29","5.32","5.33","5.41","5.42","5.43","15.5","15.6","15.7","15.8","15.9","15.10","15.13","15.14","15.19","15.20","15.21","15.22","15.23","15.27","15.28","15.29","15.32","15.33","15.41","15.42","15.43"],"number":["5.5","5.6","5.7","5.8","5.14","5.28","13.11","13.14","15.5","15.6","15.7","15.8","15.14","15.28","15.43","21.0","22.7","26.7"],"getter":["5.8","5.9","5.13","5.14","5.15","5.19","5.20","5.21","5.22","5.23","5.24","5.26","5.27","5.28","5.29","5.32","5.33","5.35","5.36","5.42","5.43","15.8","15.9","15.13","15.14","15.15","15.19","15.20","15.21","15.22","15.23","15.24","15.26","15.27","15.28","15.29","15.32","15.33","15.35","15.36","15.42","15.43"],"string":["5.10","5.11","5.12","5.22","5.27","5.29","5.31","5.32","5.33","9.2","9.3","9.5","9.6","15.9","15.10","15.11","15.12","15.22","15.27","15.29","15.31","15.32","15.33","17.1","19.2","19.3","19.5","19.6","22.1","22.2","22.3","22.5","22.6","22.39","22.41","26.1","26.2","26.3","26.5","26.6","26.39","26.41"],"设置视频地址":["5.10","5.11"],"设置时和":["5.10","5.11"],"设置视频画质地址":["5.12"],"获取视频时长":["5.15"],"下载当前视频帧的截图":["5.16"],"可选参数为截图名字":["5.16"],"获取当前视频帧的截图的":["5.17","5.18"],"base64":["5.17","15.17"],"地址":["5.17","5.18"],"blob":["5.18","15.18"],"设置和获取视频海报":["5.22"],"设置视频是否自适应尺寸":["5.25"],"获取播放器的尺寸和坐标信息":["5.26"],"当容器只有宽度":["5.30"],"该属性可以自动计算出并设置视频的高度":["5.30"],"动态获取和设置":["5.31"],"开启隔空播放":["5.34"],"视频缓存的比例":["5.35"],"范围是":["5.35","5.36"],"视频播放的比例":["5.36"],"事件的代理函数":["5.37"],"实质上代理了":["5.37"],"的查询函数":["5.38"],"element":["5.39","9.2","9.3","9.5","9.6","15.39","19.2","19.3","19.5","19.6","22.1","26.1"],"快捷返回播放器的":["5.39"],"动态获取或设置":["5.40"],"css":["5.40"],"变量":["5.40","23.10"],"array":["5.41","9.3","11.1","15.41","19.3","22.28","22.29","22.30","22.31","22.32","22.33","22.34","26.28","26.29","26.30","26.31","26.32","26.33","26.34"],"动态设置画质列表":["5.41"],"object":["5.42","15.42","22.35","22.36","22.37","22.38","22.40","22.42","22.49","26.35","26.36","26.37","26.38","26.40","26.42","26.49"],"类型":["6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.33","26.35","26.36"],"描述":["6.1","7.1","8.1","9.2","9.3","9.5","9.6","26.35"],"disable":["6.1","7.1","8.1","16.1","17.1","18.1"],"var":["7.2","9.4","17.2"],"new":["7.2","17.2"],"artplayer":["7.2","17.2","20.4","20.5","20.11","20.12","21.2","22.1","23.5","23.11","23.12","24.18","25.2","25.4","26.1"],"container":["7.2","15.30","17.2"],"须先打开设置面板":["9.1"],"然后自带四个内置项":["9.1"],"flip":["9.1"],"playbackrate":["9.1"],"按钮":["9.2"],"html":["9.2","9.3","9.5","9.6","19.2","19.3","19.5","19.6","20.3","23.3","26.38"],"元素的":["9.2","9.3","9.5","9.6"],"选择列表":["9.3"],"icon":["9.3","9.5","9.6","19.3","19.6"],"元素的图标":["9.3"],"selector":["9.3","19.3"],"元素列表":["9.3"],"onselect":["9.3","19.3"],"元素点击事件":["9.3"],"列表嵌套":["9.4"],"切换按钮":["9.5"],"范围滑块":["9.6"],"properties":["10.0","11.0","14.0","15.0"],"the":["10.0","10.1","10.2","10.3","10.4","10.5","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","12.0","12.1","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.30","12.31","12.32","12.36","12.37","12.38","12.39","12.40","12.41","12.42","12.43","12.46","12.58","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.14","13.15","13.23","13.24","13.25","13.26","13.27","13.28","14.0","15.3","15.4","15.10","15.11","15.15","15.17","15.18","15.19","15.26","15.30","15.35","15.36","15.41","17.1","19.1","19.6","20.9","20.10","20.11","20.13","21.0","21.1","22.1","22.2","22.3","22.4","22.5","22.7","22.11","22.17","22.32","22.33","22.35","22.36","22.39","22.40","22.46","22.50"],"options":["10.1","22.0"],"for":["10.1","10.3","10.8","13.8","13.9","15.37"],"player":["10.1","10.2","10.3","10.4","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16","11.1","12.0","12.1","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.12","12.14","12.15","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","14.0"],"manages":["10.2","10.3","10.4"],"all":["10.2","10.3","10.5","11.1"],"of":["10.2","10.4","10.8","10.10","10.11","10.12","10.13","11.1","11.6","13.5","13.28","13.29","13.30","15.35","15.36","15.41","20.11","20.13","21.0","22.5","22.11","22.39"],"elements":["10.2"],"which":["10.3","13.27","15.37","22.4","22.39","22.42"],"is":["10.3","10.4","10.6","10.8","10.9","10.10","10.13","10.15","12.0","12.1","12.12","14.0","20.11","20.13","22.39"],"essentially":["10.3","15.37"],"a":["10.3","10.15","11.6","12.5","12.33","12.34","12.35","15.16","15.37","15.39","22.4"],"proxy":["10.3"],"and":["10.3","10.11","14.0","15.14","15.19","15.21","15.22","15.26","20.0"],"local":["10.4"],"attribute":["10.4","15.30","19.6"],"used":["10.4","10.6","10.8","10.9","10.10","10.15","22.38","22.39","22.49"],"to":["10.4","10.6","10.9","10.15","12.41","13.1","13.3","13.20","13.24","13.32","13.33","15.11","15.38","16.1","17.1","18.1","22.10","22.15","22.17","22.19","22.26","22.32","22.38","22.39","22.46","22.47","22.49"],"cache":["10.4"],"method":["10.4","10.6","10.8","10.9","10.10","10.13","10.15"],"manage":["10.5","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","10.15","10.16"],"s":["10.6","10.7","10.9","10.14","10.15","10.16","12.0","14.0","19.5","19.6","22.40"],"notices":["10.7"],"there":["10.7"],"dynamically":["10.8","10.9","10.15","15.31","15.32","15.33","15.40","15.41"],"controllers":["10.9"],"right":["10.10","12.37"],"context":["10.10","22.30"],"menu":["10.10","16.0","22.30"],"features":["10.11","10.16"],"property":["10.11","10.14","16.1","17.1","18.1","19.2","19.3","19.5"],"sets":["10.11","15.8","15.25"],"layer":["10.12","10.14"],"functionality":["10.13"],"settings":["10.15","12.39","19.1","21.0"],"panel":["10.15","12.39","13.22","19.0","19.1","22.29"],"plugin":["10.16","14.0","24.18"],"with":["10.16","20.11"],"here":["11.0","13.0","15.0"],"returns":["11.1","11.2","11.3","11.4","11.5","11.6","11.7","11.8","11.9","11.10","11.11","11.12","13.2"],"an":["11.1","12.11","12.48"],"collection":["11.6"],"utility":["11.6"],"events":["12.0","14.0","15.37"],"are":["12.0","12.29","12.30","21.2"],"divided":["12.0"],"into":["12.0"],"two":["12.0"],"types":["12.0"],"one":["12.0"],"native":["12.0"],"prefix":["12.0"],"other":["12.0"],"custom":["12.0","12.33","22.28","22.29","22.30","22.31","22.34","22.42"],"triggered":["12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40"],"when":["12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.30","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","13.31","15.30"],"switches":["12.2"],"occurs":["12.11","12.28"],"mouse":["12.13"],"on":["12.16","13.18","13.19","13.20","13.21","13.23","13.25","22.33","22.35"],"mobile":["12.16","13.21","13.23","13.25","20.13"],"aspect":["12.17"],"automatically":["12.18","22.10","22.12"],"goes":["12.21","12.22"],"enters":["12.24","12.25"],"subtitle":["12.28","12.31","22.24"],"offset":["12.28"],"before":["12.29","21.2"],"subtitles":["12.29","12.30","22.36"],"updated":["12.29"],"loads":["12.31"],"information":["12.32","22.33"],"loader":["12.34"],"controller":["12.38"],"listen":["12.41"],"browser":["12.42"],"media":["12.46"],"content":["12.46"],"attributes":["13.0"],"whether":["13.1","13.3","13.18","13.19","13.20","13.32","13.33","15.25","16.1","17.1","18.1","22.10","22.14","22.15","22.17","22.19","22.26","22.32","22.43","22.45","22.46","22.47","22.48"],"start":["13.1"],"mode":["13.1"],"enable":["13.3"],"display":["13.4","22.18","22.22","22.23"],"duration":["13.4","13.12","13.13"],"throttle":["13.8","13.9"],"boundary":["13.10"],"tolerance":["13.10"],"distance":["13.10"],"maximum":["13.11","13.14"],"minimum":["13.12"],"delay":["13.13","13.15","13.16","13.17"],"auto":["13.16"],"double":["13.17"],"event":["13.17"],"desktop":["13.18"],"devices":["13.21","20.13"],"refresh":["13.22"],"milliseconds":["13.24"],"increment":["13.27"],"by":["13.27"],"list":["13.28","13.29","13.30","15.41","19.3"],"built":["13.28","13.29","13.30"],"flips":["13.30"],"setting":["13.32","13.33","15.11","15.40","15.41"],"plugins":["14.0"],"once":["14.0"],"you":["14.0","20.9"],"know":["14.0"],"methods":["14.0"],"very":["14.0"],"simple":["14.0"],"can":["14.0","15.30","20.9"],"load":["14.0"],"functions":["14.0"],"during":["14.0"],"instantiation":["14.0"],"jump":["15.5"],"address":["15.11","15.17","15.18","22.2"],"similar":["15.11","15.38"],"quality":["15.12"],"download":["15.16"],"gets":["15.17","15.18","15.26"],"size":["15.26","22.11"],"has":["15.30"],"only":["15.30","20.11"],"this":["15.30"],"activate":["15.34"],"proportion":["15.35","15.36"],"proxies":["15.37"],"shortcut":["15.39"],"getting":["15.40"],"or":["15.40"],"description":["16.1","17.1","18.1","19.2","19.3","19.5","19.6"],"component":["17.1"],"first":["19.1"],"open":["19.1"],"button":["19.2","19.5"],"selection":["19.3","22.32"],"nested":["19.4"],"lists":["19.4"],"range":["19.6"],"slider":["19.6"],"group":["20.1","20.2","20.3","20.4","20.5","23.1","23.2","23.3","23.4","23.5","24.2","24.3"],"bash":["20.2","23.2","24.2","24.3"],"index":["20.3","23.3","24.18"],"head":["20.3"],"jsx":["20.5","20.8","23.5","23.8"],"import":["20.5","21.4","23.5","23.9","25.4"],"from":["20.5","21.4","23.5","25.4"],"useeffect":["20.5","23.5"],"useref":["20.5"],"importing":["20.6"],"also":["20.9"],"use":["20.9","22.8","22.19","22.26","22.46"],"sometimes":["20.10"],"your":["20.10"],"file":["20.10"],"may":["20.10"],"lose":["20.10"],"typescript":["20.10","23.10"],"hints":["20.10"],"browsers":["20.11"],"production":["20.11"],"build":["20.11"],"compatible":["20.11"],"module":["20.12","23.12"],"tip":["20.12","23.12"],"esm":["20.12","23.12"],"demo":["20.12","23.12"],"https":["20.12","23.12"],"org":["20.12","23.12"],"useragent":["20.13","23.13"],"currently":["20.13"],"determination":["20.13"],"not":["20.13"],"danger":["21.0","25.0"],"given":["21.0"],"increasing":["21.0"],"bundled":["21.0"],"languages":["21.1","21.2"],"language":["21.2","21.3","21.4","22.41","26.41"],"files":["21.2"],"packaging":["21.2"],"located":["21.2"],"src":["21.2","25.2"],"i18n":["21.2","25.2"],"zhtw":["21.4","25.4"],"where":["22.1"],"source":["22.2"],"unique":["22.3"],"undefined":["22.4","22.50","26.4","26.50"],"constructor":["22.4"],"accepts":["22.4"],"as":["22.4"],"second":["22.4"],"argument":["22.4"],"f00":["22.6","26.6"],"false":["22.8","22.9","22.10","22.11","22.12","22.13","22.14","22.15","22.16","22.17","22.18","22.20","22.22","22.23","22.24","22.25","22.26","22.37","22.43","22.45","22.46","22.47","22.48","26.10","26.11","26.12","26.14","26.15","26.16","26.17","26.24","26.26","26.43","26.46","26.48"],"displays":["22.16"],"true":["22.19","22.21","22.27","22.44","26.19"],"hotkeys":["22.19"],"if":["22.21"],"mini":["22.25"],"ssr":["22.26","26.26"],"server":["22.26"],"initializes":["22.28","22.29","22.31"],"initialize":["22.30","22.34"],"bottom":["22.31"],"control":["22.31"],"bar":["22.35"],"supporting":["22.36"],"formats":["22.36"],"vtt":["22.36","26.36"],"srt":["22.36","26.36"],"controls":["22.37","26.37"],"preload":["22.37"],"replace":["22.38"],"specify":["22.39"],"format":["22.39"],"conjunction":["22.39"],"matches":["22.40"],"navigator":["22.41","26.41"],"configuration":["22.42"],"will":["22.42"],"be":["22.42"],"deeply":["22.42"],"merged":["22.42"],"automatic":["22.46"],"导入":["23.6"],"你也可以使用选项的类型":["23.9"],"ts":["23.9"],"有时你的":["23.10"],"文件会丢失":["23.10"],"的类型提示":["23.10"],"这时候你可以手动导入类型":["23.10"],"生产构建的":["23.11"],"只兼容最新一个主版本的":["23.11"],"chrome":["23.11"],"last":["23.11"],"目前对于是否移动设备的判断并不准确":["23.13"],"有时候希望通过改变":["23.13"],"来调整播放器的ui":["23.13"],"查看完整演示":["24.1"],"jsdelivr":["24.3"],"每一个弹幕是一个对象":["24.4"],"多个弹幕组成的数组就是弹幕库":["24.4"],"通常只需要":["24.4"],"text":["24.4"],"只有":["24.5"],"danmuku":["24.5","24.18"],"是必须的参数":["24.5"],"其余都是非必填":["24.5"],"弹幕数据":["24.5"],"speed":["24.5"],"弹幕持续时间":["24.5"],"范围在":["24.5"],"margin":["24.5"],"来自用户输入的弹幕":["24.6"],"beforeemit":["24.6"],"filter":["24.6"],"beforevisible":["24.6"],"artplayerplugindanmuku":["24.6"],"visible":["24.6"],"来自服务器的弹幕":["24.6"],"xml":["24.8"],"弹幕":["24.8"],"文件":["24.8"],"data":["24.9","24.11","24.12","24.13","24.14","24.18"],"通过方法":["24.10","24.12","24.13"],"进行隐藏或者显示弹幕":["24.10"],"通过属性":["24.11"],"判断当前弹幕是隐藏或者显示":["24.11"],"发送一条实时弹幕":["24.12"],"libs":["24.12","24.13","24.14","24.18"],"实时改变弹幕配置":["24.13"],"uncompiled":["24.13","24.14","24.18"],"通过":["24.14"],"方法可以重载弹幕库":["24.14"],"或者切换新弹幕库":["24.14"],"或者追加新的弹幕库":["24.14"],"用于清空当前显示的弹幕":["24.15"],"在初始化弹幕插件的时候":["24.16"],"是可以指定弹幕发射器的挂载位置的":["24.16"],"默认是挂载在控制栏的中部":["24.16"],"你也可以把它挂载在播放器以外的地方":["24.16"],"当播放器全屏的时候":["24.16"],"发射器会自动回到控制栏的中部":["24.16"],"假如你挂载的地方是亮色的话":["24.16"],"建议把":["24.16"],"用于获取当前弹幕配置":["24.17"],"鉴于捆绑的多国语言越来越多":["25.0"],"从":["25.0"],"默认语言有":["25.1"],"en":["25.1"],"zh":["25.1"],"打包前的语言文件存放于":["25.2"],"欢迎来添加你的语言":["25.2"],"打包后的语言文件存放于":["25.2"],"dist":["25.2"],"播放器挂载的":["26.1"],"视频源地址":["26.2"],"播放器的唯一标识":["26.3"],"构造函数接受一个函数作为第二个参数":["26.4"],"播放器初始化成功且视频可以播放时触发":["26.4"],"ready":["26.4"],"视频的海报":["26.5"],"是否自动播放":["26.10"],"是否使用快捷键":["26.19"],"字幕时间偏移":["26.24"],"是否使用":["26.26"],"初始化自定义的":["26.28","26.29","26.30","26.34"],"层":["26.28"],"设置面板":["26.29"],"右键菜单":["26.30"],"初始化自定义的底部":["26.31"],"控制栏":["26.31"],"是否在底部控制栏里显示":["26.32"],"画质选择":["26.32"],"列表":["26.32"],"在进度条上显示":["26.33"],"高亮信息":["26.33"],"插件":["26.34"],"在进度条上设置":["26.35"],"预览图":["26.35"],"设置视频的字幕":["26.36"],"支持字幕格式":["26.36"],"ass":["26.36"],"用于替换默认图标":["26.38"],"支持":["26.38"],"用于指明视频的格式":["26.39"],"需要配合":["26.39"],"customtype":["26.39"],"通过视频的":["26.40"],"自定义":["26.42"],"配置":["26.42"],"该配置会和自带的":["26.42"],"进行深度合并":["26.42"],"新增你的语言":["26.42"],"是否使用自动":["26.46"],"回放功能":["26.46"],"用于改变内置的css变量":["26.49"]},{"0":["3.25","3.26","5.8","13.28","21.0","24.5","25.0"],"1":["3.26","3.28","5.8","5.35","5.36","13.28","20.11","21.0","23.10","25.0"],"2":["3.28","20.8","20.12","23.8","23.12","23.13"],"3":["3.23","13.29","20.9","22.2","23.10","26.2"],"4":["6.2","13.29","16.2","22.46","23.13","26.42"],"5":["3.12","3.14","3.25","3.27","13.28","20.12","21.0","22.28","22.29","23.12","23.13","25.0","26.28","26.29"],"6":["2.0","6.3","7.3","12.0","16.3","17.3","20.12","23.12"],"7":["15.15","26.7"],"8":["20.3"],"9":["3.29","9.7","13.29","19.7","21.3","26.42"],"10":["2.2","3.11","7.2","17.2"],"11":["2.28"],"13":["6.2","6.3","16.2","16.3"],"14":["9.7","19.7"],"16":["3.29","13.29"],"19":["5.41"],"21":["6.4","6.5","7.3","7.4","8.4","16.4","16.5","17.3","17.4","18.4"],"22":["8.2","8.3","9.8","18.2","18.3","19.8"],"23":["22.28","26.28"],"24":["6.5","16.5"],"25":["3.28","24.5"],"29":["5.41","8.5","18.5"],"34":["22.29","26.29"],"35":["3.7"],"40":["7.5","17.5"],"50":["3.10"],"75":["13.28"],"200":["3.6","3.8","3.9","3.21"],"300":["3.17"],"1000":["3.15","3.22","3.24"],"2000":["3.4"],"3000":["3.13","3.16"],"code":["0.1","0.2","0.4","0.5","0.6","0.7","0.12","0.13","0.14","0.15","0.16","1.1","1.6","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.3","3.5","3.6","3.7","3.17","3.29","3.30","5.1","5.2","5.3","5.11","5.13","5.15","5.16","5.19","5.20","5.21","5.22","5.24","5.25","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.40","5.41","5.42","9.3","10.1","10.2","12.0","12.20","12.29","12.30","12.31","13.20","15.1","15.2","15.11","15.15","15.19","15.34","15.40","15.41","19.3","22.1","22.7","22.10","22.19","22.29","22.30","22.31","22.34","22.42","22.46","24.10","24.16","25.2","26.1","26.4","26.10","26.19","26.29","26.30","26.31","26.34","26.38","26.42","26.46","26.49"],"js":["0.2","0.4","0.13","0.16","2.2","2.18","2.22","2.24","2.28","2.29","2.30","2.31","5.41","6.2","6.3","6.4","7.4","8.4","9.3","9.6","9.7","10.2","12.0","15.15","15.41","16.2","16.3","16.4","17.4","18.4","19.3","19.7","21.2","22.1","22.2","22.19","22.28","22.29","22.46","24.4","24.6","24.11","24.12","24.13","24.14","25.1","26.2","26.4","26.28","26.29","26.31","26.42"],"var":["0.2","0.4","2.0","4.0","5.41","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.2","8.3","8.4","8.5","9.3","9.7","9.8","9.9","10.2","12.0","14.0","15.15","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.2","18.3","18.4","18.5","19.3","19.4","19.7","19.8","19.9","21.3","21.4","22.2","22.28","22.29","24.13","24.14","24.18","25.3","25.4","26.2","26.28","26.29"],"proxy":["0.3"],"方法用于代理":["0.3"],"hover":["0.3"],"方法用于代理自定义的":["0.3"],"div":["0.3","0.6","0.8","0.9","0.10","0.12","0.14","0.15","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","2.41","3.1","3.2","3.4","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.17","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.29","3.30","3.32","3.33","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.27","5.28","5.29","5.31","5.32","5.33","5.37","5.39","5.40","5.42","5.43","9.1","9.3","10.2","10.5","11.6","12.0","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.31","12.34","12.38","12.39","12.40","12.41","13.20","13.30","15.1","15.2","15.7","15.11","15.19","15.21","15.26","15.30","15.34","15.40","15.41","15.42","15.43","19.3","20.4","22.1","22.7","22.10","22.19","22.30","22.31","22.34","22.38","22.42","22.46","23.4","24.8","24.16","26.1","26.3","26.4","26.5","26.7","26.8","26.9","26.10","26.13","26.17","26.19","26.21","26.25","26.34","26.38","26.42","26.44","26.45","26.46","26.49"],"classname":["0.4","0.5","0.6","0.7","0.8","0.9","0.10","0.12","0.13","0.14","0.15","1.1","1.2","1.3","1.4","1.5","1.6","1.7","1.8","1.9","1.10","1.12","2.41","3.1","3.2","3.3","3.4","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.16","3.17","3.18","3.19","3.20","3.22","3.23","3.26","3.27","3.29","3.30","3.32","3.33","5.1","5.2","5.3","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.23","5.24","5.25","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.39","5.40","5.42","5.43","9.1","9.3","10.1","10.2","10.5","12.0","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.14","12.16","12.18","12.20","12.21","12.22","12.23","12.24","12.26","12.27","12.28","12.29","12.30","12.31","12.40","12.41","13.20","15.1","15.2","15.11","15.19","15.21","15.26","15.30","15.34","15.40","15.41","15.42","19.3","22.1","22.7","22.10","22.19","22.30","22.31","22.34","22.38","22.42","22.46","24.8","24.10","24.16","26.1","26.3","26.4","26.5","26.7","26.9","26.10","26.13","26.17","26.19","26.30","26.31","26.34","26.38","26.42","26.44","26.45","26.46","26.49"],"run":["0.4","0.5","0.6","0.7","0.10","0.12","0.13","0.14","0.15","0.16","1.1","1.6","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.3","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.17","3.22","3.29","3.30","3.32","5.1","5.2","5.3","5.7","5.9","5.11","5.13","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.24","5.25","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.40","5.42","5.43","9.1","9.3","10.1","10.2","10.5","12.0","12.6","12.7","12.8","12.10","12.20","12.24","12.28","12.29","12.30","12.31","13.20","15.1","15.2","15.11","15.15","15.19","15.21","15.30","15.34","15.40","15.41","19.3","22.1","22.7","22.10","22.19","22.29","22.30","22.31","22.34","22.42","22.46","24.8","24.10","24.16","26.1","26.4","26.5","26.7","26.10","26.19","26.30","26.31","26.34","26.38","26.42","26.46","26.49"],"art":["0.4","2.0","5.10","5.12","5.41","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.2","8.3","8.5","9.3","9.4","9.7","9.8","9.9","12.0","14.0","15.10","15.12","15.15","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.2","18.3","18.5","19.3","19.4","19.7","19.8","19.9","21.3","22.2","23.10","24.14","24.18","25.3","25.4","26.2"],"new":["0.4","2.0","4.0","6.2","6.3","6.4","6.5","7.3","7.4","7.5","8.3","9.3","9.4","9.7","9.8","9.9","12.0","14.0","16.2","16.3","16.4","16.5","17.3","17.4","17.5","18.3","19.3","19.4","19.7","19.8","19.9","22.2","24.14","24.18","25.3","26.2"],"artplayer":["0.4","2.0","4.0","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.4","9.8","9.9","12.0","14.0","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.4","19.8","19.9","20.3","20.6","21.4","22.2","23.3","23.4","23.6","23.9","23.10","24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17","26.2"],"container":["0.4","2.0","4.0","6.4","6.5","7.3","7.5","9.3","9.4","9.8","9.9","12.0","14.0","16.4","16.5","17.3","17.5","19.4","19.8","19.9","20.4","20.5","22.2","22.11","23.5","24.18","26.11"],"方法用于更新":["0.6"],"对象":["0.6"],"方法用于动态更新层":["0.8"],"show":["0.8","0.9","0.10","0.15","10.7","22.14","22.15"],"属性用于设置是否显示全部层":["0.8"],"toggle":["0.8","0.9","0.10","0.15","13.19","22.18"],"方法用于切换是否显示全部层":["0.8"],"方法用于动态更新控制器":["0.9"],"属性用于设置是否显示全部控制器":["0.9"],"方法用于切换是否显示全部控制器":["0.9"],"属性用于设置是否显示全部菜单":["0.10"],"方法用于切换是否显示全部菜单":["0.10"],"方法设置当前字幕地址和选项":["0.11"],"texttrack":["0.11"],"获取当前字幕轨":["0.11"],"activecues":["0.11"],"获取当前活跃的字幕列表":["0.11"],"cues":["0.11"],"属性用于切换是否显示加载层":["0.12"],"属性用于切换是否显示遮罩层":["0.14"],"属性用于设置是否显示全部设置项":["0.15"],"方法用于切换是否显示全部设置项":["0.15"],"字符串":["1.11"],"app":["2.0","4.0","7.2","7.5","9.3","9.4","9.8","9.9","12.0","14.0","17.2","17.5","19.4","19.8","19.9","22.2","24.18"],"url":["2.0","4.0","5.10","7.2","7.5","9.4","9.9","12.0","14.0","15.10","15.11","17.2","17.5","19.4","19.9","22.35","22.36","24.18","26.35","26.36"],"assets":["2.0","4.0","7.2","8.2","8.3","8.4","8.5","9.4","9.9","12.0","14.0","17.2","18.2","18.3","18.4","18.5","19.4","19.9","22.2","22.28","24.18","26.28"],"sample":["2.0","4.0","7.2","8.2","8.3","8.4","8.5","9.4","9.9","14.0","17.2","18.2","18.3","18.4","18.5","19.4","19.9","22.2","22.28","24.18","26.28"],"mp4":["2.0","4.0","7.2","14.0","17.2","24.18"],"on":["2.0","4.0","12.5","14.0","22.21","22.22","22.23","22.47"],"canplay":["2.0"],"事件":["2.41"],"浏览器可以播放媒体文件了":["2.42"],"浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束":["2.43"],"offlineaudiocontext":["2.44","12.44"],"duration":["2.45"],"媒体内容变为空":["2.46"],"例如":["2.46"],"视频停止播放":["2.47"],"获取媒体数据时出错":["2.48"],"media":["2.49","12.42","12.59"],"已加载元数据":["2.50"],"播放已暂停":["2.51"],"播放已开始":["2.52"],"由于缺乏数据而暂停或延迟后":["2.53"],"在浏览器加载资源时周期性触发":["2.54"],"播放速率发生变化":["2.55"],"跳帧":["2.56","2.57"],"用户代理":["2.58"],"媒体数据加载已暂停":["2.59"],"currenttime":["2.60"],"音量发生变化":["2.61"],"由于暂时缺少数据":["2.62"],"可以打印出视频全部的内置事件":["3.1"],"默认关闭":["3.1"],"默认为":["3.4","3.8","3.9","3.10","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.27","3.31","5.4"],"单位为毫秒":["3.15","3.21","3.24"],"true":["3.18","3.19","3.32","5.4","26.21","26.27","26.44"],"false":["3.20","3.31","3.33","13.20","13.33","26.8","26.9","26.13","26.18","26.20","26.22","26.23","26.25","26.37","26.45","26.47"],"是否把播放器挂在在":["3.31"],"元素下":["3.31"],"目前主要用于进度条的平滑效果":["3.33"],"dosomething":["4.0","14.0"],"video":["4.0","5.31","5.35","5.36","7.2","9.4","9.9","14.0","15.3","15.6","15.8","15.9","15.13","15.14","15.16","15.17","15.18","15.22","15.24","15.25","15.30","15.31","15.32","15.35","15.36","17.2","19.4","19.9","22.4","22.5","22.14","22.16","22.37","24.18","26.40"],"plugins":["4.0"],"ready":["4.0","12.53","22.4"],"可以在实例化之后再加载插件的函数":["4.0"],"销毁播放器":["5.4"],"接受一个参数表示是否销毁后同时移除播放器的":["5.4"],"html":["5.4","20.12","22.38","23.12","26.26","26.32"],"视频时间跳转":["5.5"],"单位秒":["5.5","5.6","5.7","26.33"],"视频时间快进":["5.6"],"视频时间快退":["5.7"],"设置和获取视频音量":["5.8"],"范围在":["5.8","26.24"],"string":["5.9","6.1","7.1","8.1","11.11","16.1","18.1","22.35","22.36","26.32","26.33","26.35","26.36"],"设置和获取视频地址":["5.9"],"类似":["5.10","5.11","5.12","5.14","5.38"],"但会执行一些优化操作":["5.10","5.11"],"switchurl":["5.12","15.12"],"但会带上之前的播放进度":["5.12"],"设置和获取视频是否静音":["5.13"],"设置和获取视频当前时间":["5.14"],"设置时间时和":["5.14"],"seek":["5.14"],"但它不会触发额外的事件":["5.14"],"返回的是一个":["5.17","5.18"],"promise":["5.17","5.18"],"设置和获取播放器窗口全屏":["5.19"],"设置和获取播放器网页全屏":["5.20"],"设置和获取播放器画中画模式":["5.21"],"只有在视频播放前才能看到海报效果":["5.22"],"boolean":["5.23","6.1","8.1","9.5","19.5","26.32"],"设置和获取播放器迷你模式":["5.23"],"获取视频是否正在播放中":["5.24"],"设置和获取播放器翻转":["5.27"],"支持":["5.27"],"normal":["5.27","13.30"],"horizontal":["5.27","13.30"],"vertical":["5.27","13.30"],"设置和获取播放器播放速度":["5.28"],"设置和获取播放器长宽比":["5.29"],"元素的属性":["5.31"],"动态获取和设置视频类型":["5.32"],"动态获取和设置播放器主题颜色":["5.33"],"常配合":["5.35","5.36"],"timeupdate":["5.35","5.36"],"事件使用":["5.35","5.36"],"和":["5.37","26.6","26.14","26.15","26.16"],"removeeventlistener":["5.37","15.37"],"当使用":["5.37"],"来处理事件":["5.37"],"播放器销毁时也会自动销毁该事件":["5.37"],"document":["5.38","12.41","15.38"],"queryselector":["5.38","15.38"],"但被查询的对象局限于当前播放器内":["5.38"],"可以避免同类名的错误":["5.38"],"元素":["5.39"],"动态设置缩略图":["5.42"],"number":["5.43","9.2","9.3","17.1","19.3","22.33","22.35","26.33","26.35"],"动态设置字幕偏移":["5.43"],"是否禁用组件":["6.1","7.1","8.1"],"name":["6.1","7.1","7.2","8.1","14.0","16.1","17.2","18.1","22.36","26.36"],"组件唯一名称":["7.1"],"用于标记类名":["7.1"],"index":["7.1","7.2","17.1","17.2","24.6","24.9","24.11","24.12","24.13","24.14"],"controls":["7.2","17.2"],"your":["7.2","17.2","22.42"],"button":["7.2","17.2","22.17","22.18","22.22","22.23","22.43","22.48"],"img":["8.2","8.3","8.4","8.5","18.2","18.3","18.4","18.5","22.28","26.28"],"layer":["8.2","8.3","8.4","8.5","12.35","12.36","18.2","18.3","18.4","18.5","22.28"],"png":["8.2","8.3","8.5","18.2","18.3","18.5"],"aspectratio":["9.1"],"subtitleoffset":["9.1"],"icon":["9.2","19.2","19.5"],"元素的图标":["9.2","9.5","9.6"],"onclick":["9.2","19.2"],"function":["9.2","9.5","9.6","11.9","11.10","14.0","19.2","19.6","20.5","22.45","23.5","24.6"],"元素点击事件":["9.2"],"width":["9.2","19.2","19.3"],"列表宽度":["9.3"],"tooltip":["9.3","9.5","9.6","19.3"],"提示文本":["9.3","9.6"],"switch":["9.5","13.18","19.5","22.20"],"按钮默认状态":["9.5"],"onswitch":["9.5"],"按钮切换事件":["9.5"],"range":["9.6","22.24"],"array":["9.6","19.6"],"默认状态数组":["9.6"],"onrange":["9.6","19.6"],"完成时触发的事件":["9.6"],"onchange":["9.6"],"变化时触发的事件":["9.6"],"here":["10.0"],"when":["10.3","11.1","13.14","13.15","13.23","13.24","15.37","22.4","22.5","22.12","22.25"],"using":["10.3","15.37"],"following":["10.3"],"methods":["10.3"],"to":["10.3","10.7","10.10","10.12","10.13","10.14","10.16","12.0","12.1","12.2","13.0","13.5","13.18","13.19","13.30","13.31","15.5","15.10","15.12","15.37","15.39","20.13","22.4","22.9","22.13","22.14","22.27","22.40","22.43","22.44","22.45","22.48"],"handle":["10.3","15.37"],"event":["10.3","12.41","13.8","13.9","13.10","15.37","19.2","19.3","19.6"],"will":["10.3","15.11","15.37","22.8","22.11","22.17"],"also":["10.3"],"be":["10.3","15.11"],"automatically":["10.3","12.19","15.30","15.37"],"destroyed":["10.3","12.6"],"get":["10.4","15.13","15.20","15.23","15.27","15.28","15.29","15.32","15.33"],"del":["10.4"],"of":["10.5","10.6","11.2","11.3","11.4","11.5","12.17","13.4","13.6","13.7","13.11","13.14","13.23","13.25","13.26","15.3","15.14","15.16","15.17","15.18","15.26","15.28","15.29","15.30","15.31","16.1","17.1","18.1","22.3","22.7","22.15"],"player":["10.5","11.6","11.12","12.5","12.11","12.13","12.17","12.28","13.2","13.31","13.32","15.4","15.19","15.20","15.21","15.23","15.26","15.27","15.33","20.5","20.13","22.1","22.3","22.4","22.6","22.7","22.11","22.47","23.5"],"retrieve":["10.6","15.9"],"value":["10.6"],"update":["10.6","10.8","10.9","10.15"],"only":["10.7","10.16","15.22","22.5","22.25"],"one":["10.7","10.16"],"property":["10.7","10.12","11.1","22.32","22.33","22.35","22.36"],"used":["10.7","10.12","10.13","10.14","22.6"],"display":["10.7","10.12","10.14","22.41","22.43","22.48"],"adding":["10.8"],"remove":["10.8","10.9","10.10","10.13","10.15"],"removing":["10.8"],"dynamically":["10.10","10.16","15.42","15.43"],"items":["10.10","13.6","13.7"],"returns":["10.11"],"current":["10.11","15.14","15.16","15.17","15.18"],"address":["10.11","12.2","15.9","15.10","15.12"],"style":["10.11"],"method":["10.11","10.16"],"is":["10.12","10.14","12.2","12.3","12.5","12.6","12.9","12.10","12.11","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.53","13.20","13.24","13.27","13.29","13.33","15.10","15.13","15.22","15.24","15.35","22.4","22.24"],"set":["10.12","10.14","15.9","15.23","15.30","15.31","15.32","15.33","15.42","15.43"],"whether":["10.12","10.14","13.31","15.4","15.13","15.24","22.9","22.13","22.27","22.44"],"a":["10.13","12.26","12.56","12.57","15.4","15.5","22.40","22.43","22.50"],"item":["10.15"],"add":["10.16","22.42","22.45"],"refer":["11.0","13.0"],"you":["11.1","20.10","20.11","20.13","22.26"],"can":["11.1","12.42","13.1","20.10","22.50"],"use":["11.1","22.27"],"this":["11.1","20.10"],"information":["11.2","15.26"],"environment":["11.3"],"variables":["11.3","15.40","20.10","22.49"],"time":["11.4","12.27","15.5","15.6","15.7","15.14","22.33","26.33"],"default":["11.5","13.17","13.20","13.22","13.24","13.28","13.29","13.33","19.5","19.6","20.5","23.5"],"configuration":["11.5"],"functions":["11.6"],"for":["11.6","11.7","11.8","11.10","12.1","12.46","13.10","13.11","13.12","13.13","13.15","13.16","13.21","17.1","20.11","22.18"],"the":["11.6","12.5","12.11","12.47","12.49","12.55","12.60","13.0","13.16","13.21","13.31","13.32","13.33","15.6","15.8","15.9","15.13","15.14","15.16","15.20","15.21","15.22","15.23","15.24","15.25","15.27","15.28","15.29","15.31","15.32","15.33","15.37","15.38","15.39","16.1","18.1","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.24","22.42","22.47","22.48"],"validation":["11.7","11.9"],"constructor":["11.8"],"tool":["11.10"],"required":["11.11"],"s":["11.12","15.33"],"listening":["12.0"],"able":["12.1","12.2"],"play":["12.1","12.2","12.42","22.4"],"and":["12.2","15.3","15.8","15.9","15.13","15.20","15.23","15.27","15.28","15.29","15.30","15.31","15.32","15.33","15.37","19.1","20.12","22.4","22.17","22.38"],"paused":["12.3"],"starts":["12.4"],"playing":["12.4"],"pressed":["12.5"],"gains":["12.7"],"loses":["12.8"],"focus":["12.8"],"double":["12.9","13.24"],"clicked":["12.9","12.10"],"while":["12.11"],"loading":["12.11"],"hovered":["12.12"],"or":["12.12","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39"],"unhovered":["12.12"],"by":["12.12","13.28","22.9","22.11","22.39"],"moves":["12.13"],"over":["12.13"],"size":["12.14","12.19"],"changes":["12.14","12.16","12.17","12.40"],"appears":["12.15","22.5","22.25"],"in":["12.15","12.25","12.27","12.28","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.12","13.17","13.22","15.5","15.7","15.21","20.10","22.17","22.20","22.32","22.42","22.49"],"viewport":["12.15"],"locked":["12.16"],"state":["12.16","12.40","15.3","19.5","19.6"],"sets":["12.18","12.19"],"height":["12.18","15.30"],"flips":["12.20"],"into":["12.21","12.22"],"full":["12.21","12.22"],"screen":["12.21","12.22"],"error":["12.22"],"enters":["12.23"],"web":["12.23","15.20","22.23","22.47"],"fullscreen":["12.23","22.23"],"mode":["12.24","12.25","15.21","22.8","22.12","22.26","22.27","24.5"],"picture":["12.25","15.21","22.20"],"takes":["12.26"],"jumps":["12.27"],"updated":["12.30"],"panel":["12.32","13.5","13.6","13.7"],"shown":["12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39"],"hidden":["12.32","12.33","12.34","12.35","12.36","12.38","12.39"],"click":["12.37","13.3","19.2","19.3"],"menu":["12.37","13.3"],"from":["12.41","15.35","15.36","20.12","21.0","23.9","25.2"],"browser":["12.43"],"estimates":["12.43"],"triggered":["12.45","19.6","22.4"],"becomes":["12.46"],"empty":["12.46"],"example":["12.46"],"occurred":["12.48"],"metadata":["12.50","22.37","26.37"],"playback":["12.51","12.52","12.62","13.27","15.28","22.15"],"periodically":["12.54"],"user":["12.58"],"agent":["12.58"],"volume":["12.61"],"which":["13.1","15.8","15.10","22.5","22.8"],"print":["13.1","13.32"],"out":["13.1"],"all":["13.1"],"built":["13.1","22.42","22.49"],"right":["13.3"],"context":["13.3","22.17"],"notification":["13.4"],"message":["13.4"],"settings":["13.5","13.6","13.7"],"pixels":["13.5","13.10"],"defaults":["13.5","13.8","13.9","13.30"],"milliseconds":["13.8","13.9","13.17","13.22"],"view":["13.10"],"records":["13.11"],"automatic":["13.11","13.14","13.15"],"feature":["13.12","13.13","22.14","22.15","22.16","22.46"],"hiding":["13.13"],"reconnection":["13.14","13.15"],"attempts":["13.14"],"attempt":["13.15"],"bottom":["13.16","22.32"],"measured":["13.17"],"pause":["13.19","15.3"],"single":["13.20"],"delay":["13.21"],"rotation":["13.21"],"unit":["13.22"],"multiplier":["13.23"],"rate":["13.23"],"speed":["13.23","13.25","15.28","22.15"],"tapped":["13.24"],"sliding":["13.25"],"adjusting":["13.26"],"with":["13.26","19.1","22.39","22.42"],"shortcuts":["13.26"],"progress":["13.27","22.25","22.33"],"adjusted":["13.27"],"via":["13.27"],"speeds":["13.28"],"ratios":["13.29"],"mount":["13.31","22.26"],"requestanimationframe":["13.33"],"currently":["13.33","15.24","22.3","22.6","22.41"],"myplugin":["14.0"],"console":["14.0"],"info":["14.0"],"return":["14.0","15.39","22.50"],"something":["14.0"],"accepts":["15.4"],"indicating":["15.4"],"specific":["15.5"],"fast":["15.6","22.45"],"rewind":["15.7"],"seconds":["15.7"],"gets":["15.8"],"ranges":["15.8"],"similar":["15.10","15.12"],"but":["15.11","15.12","15.38"],"some":["15.11"],"optimization":["15.11"],"operations":["15.11"],"executed":["15.11"],"it":["15.12","19.1","22.16","22.17"],"setting":["15.14"],"frame":["15.16"],"optional":["15.16"],"screenshot":["15.17","15.18"],"window":["15.19","22.22"],"page":["15.20"],"effect":["15.22"],"visible":["15.22"],"should":["15.25"],"auto":["15.25"],"adjust":["15.25","20.13"],"position":["15.26"],"supports":["15.27","22.38","22.41"],"aspect":["15.29","22.16"],"ratio":["15.29","22.16"],"calculate":["15.30"],"attributes":["15.31","22.37"],"that":["15.35","15.36"],"cached":["15.35"],"ranging":["15.35","15.36"],"has":["15.36"],"been":["15.36"],"object":["15.38"],"being":["15.38"],"queried":["15.38"],"css":["15.40","22.49"],"qualities":["15.41"],"subtitle":["15.43"],"offset":["15.43","22.24"],"component":["16.1","18.1"],"unique":["16.1","17.1","18.1"],"class":["17.1"],"identification":["17.1"],"then":["19.1"],"comes":["19.1"],"four":["19.1"],"text":["19.3","26.33"],"upon":["19.6"],"usage":["20.0"],"bash":["20.1","23.1"],"npm":["20.1","23.1","24.2"],"jsdelivr":["20.2","23.2"],"net":["20.2","23.2","24.3"],"https":["20.2","23.2","24.3"],"title":["20.3","23.3"],"demo":["20.3"],"meta":["20.3"],"charset":["20.3"],"utf":["20.3"],"template":["20.4","23.4"],"ref":["20.4"],"export":["20.5","23.5"],"option":["20.5","23.5"],"getinstance":["20.5","23.5"],"rest":["20.5","23.5"],"const":["20.5","23.5"],"import":["20.8","20.9","20.10","23.8","23.10","25.2"],"type":["20.9","23.9","23.10"],"ts":["20.9","26.39"],"case":["20.10"],"manually":["20.10"],"types":["20.10"],"latest":["20.11"],"major":["20.11"],"version":["20.11","21.0","23.11"],"chrome":["20.11"],"last":["20.11"],"starting":["20.12","21.0"],"accurate":["20.13"],"sometimes":["20.13"],"may":["20.13"],"want":["20.13","22.26"],"ui":["20.13"],"multilingual":["21.0"],"packs":["21.0"],"are":["21.1","22.21"],"en":["21.1","26.41"],"zh":["21.1","21.4","25.4","26.41"],"cn":["21.1","25.1"],"packaged":["21.2"],"at":["21.2"],"dist":["21.2"],"i18n":["21.4","25.4"],"tw":["21.4","25.4"],"mounts":["22.1"],"identifier":["22.3"],"successfully":["22.4"],"initialized":["22.4"],"color":["22.6","24.5"],"live":["22.8"],"hide":["22.8"],"mute":["22.9"],"fill":["22.11"],"entire":["22.11"],"enter":["22.12"],"mini":["22.12"],"appear":["22.17"],"toolbar":["22.17"],"there":["22.21"],"multiple":["22.21"],"players":["22.21"],"5s":["22.24","26.24"],"bar":["22.25","22.31","22.32","22.33"],"side":["22.26"],"rendering":["22.26"],"useful":["22.26"],"if":["22.26"],"list":["22.32"],"control":["22.32"],"description":["22.32","22.33","22.35","22.36"],"thumbnail":["22.35"],"ass":["22.36"],"additional":["22.37"],"these":["22.37"],"strings":["22.38"],"htmlelement":["22.38","26.38"],"customtype":["22.39"],"same":["22.39"],"as":["22.39"],"file":["22.39"],"extension":["22.39"],"delegate":["22.40"],"decoding":["22.40"],"third":["22.40","22.50"],"tolowercase":["22.41","26.41"],"language":["22.42"],"enable":["22.44"],"events":["22.44"],"forward":["22.45"],"rotate":["22.47"],"mobile":["22.47"],"change":["22.49"],"party":["22.50"],"htmlcanvaselement":["22.50","26.50"],"head":["23.3"],"useref":["23.5"],"let":["23.10"],"null":["23.10"],"参数":["23.10"],"对于古老的浏览器":["23.11"],"可以使用":["23.11"],"legacy":["23.11"],"文件":["23.11"],"从":["23.12"],"开始":["23.12"],"所以在":["23.13"],"开始新增了一个":["23.13"],"install":["24.2"],"就可以发送一个弹幕":["24.4"],"其余都是非必要参数":["24.4"],"弹幕文本":["24.4"],"弹幕上下边距":["24.5"],"支持像素数字和百分比":["24.5"],"opacity":["24.5"],"弹幕透明度":["24.5"],"ffffff":["24.5"],"默认弹幕颜色":["24.5"],"可以被单独弹幕项覆盖":["24.5"],"data":["24.6","24.7","24.10","24.15","24.17"],"libs":["24.6","24.7","24.9","24.10","24.11","24.15","24.17"],"uncompiled":["24.6","24.7","24.9","24.10","24.11","24.12","24.15","24.17"],"plugin":["24.6","24.7","24.9","24.10","24.11","24.12","24.13","24.14","24.15","24.17"],"danmuku":["24.6","24.9","24.11","24.12","24.13","24.14","24.15","24.17"],"保存到数据库":["24.6"],"savedanmu":["24.6"],"bilibili":["24.8"],"网站的弹幕格式一致":["24.8"],"theme":["24.16"],"设置成":["24.16"],"light":["24.16"],"否则会看不清":["24.16"],"无需手动导入":["25.1"],"group":["25.2"],"id":["25.2"],"容器":["26.1"],"目前只用于记忆播放":["26.3"],"autoplayback":["26.3"],"事件一样":["26.4"],"只会出现在播放器初始化且未播放的状态下":["26.5"],"播放器主题颜色":["26.6"],"目前用于":["26.6"],"进度条":["26.6"],"播放器的默认音量":["26.7"],"使用直播模式":["26.8"],"会隐藏进度条和播放时间":["26.8"],"是否默认静音":["26.9"],"播放器的尺寸默认会填充整个":["26.11"],"容器尺寸":["26.11"],"所以经常出现黑边":["26.11"],"该值能自动调整播放器尺寸以隐藏黑边":["26.11"],"当播放器滚动到浏览器视口以外时":["26.12"],"自动进入":["26.12"],"迷你播放":["26.12"],"模式":["26.12","26.27"],"是否循环播放":["26.13"],"是否显示视频翻转功能":["26.14"],"目前只出现在":["26.14"],"设置面板":["26.14","26.15","26.16","26.18","26.24"],"右键菜单":["26.14","26.15","26.16"],"是否显示视频播放速度功能":["26.15"],"会出现在":["26.15","26.16"],"是否显示视频长宽比功能":["26.16"],"是否在底部控制栏里显示":["26.17","26.18","26.20"],"视频截图":["26.17"],"功能":["26.17"],"的开关按钮":["26.18","26.20"],"画中画":["26.20"],"假如页面里同时存在多个播放器":["26.21"],"是否只能让一个播放器播放":["26.21"],"是否在底部控制栏里显示播放器":["26.22","26.23"],"窗口全屏":["26.22"],"按钮":["26.22","26.23","26.48"],"网页全屏":["26.23"],"出现在":["26.24"],"迷你进度条":["26.25"],"只在播放器失去焦点后且正在播放时出现":["26.25"],"挂载模式":["26.26"],"假如你希望在播放器挂载前":["26.26"],"就提前渲染好播放器所需的":["26.26"],"时有用":["26.26"],"你可以通过":["26.26"],"在移动端是否使用":["26.27"],"类型":["26.32"],"描述":["26.32","26.33","26.36"],"默认画质":["26.32"],"画质名字":["26.32"],"高亮时间":["26.33"],"高亮文本":["26.33"],"预览图地址":["26.35"],"预览图数量":["26.35"],"column":["26.35"],"字幕名字":["26.36"],"字幕地址":["26.36"],"字幕类型":["26.36"],"可选":["26.36"],"preload":["26.37"],"更多视频属性":["26.37"],"这些属性将直接写入视频元素里":["26.37"],"字符串和":["26.38"],"一起使用":["26.39"],"默认视频的格式就是视频地址的后缀":["26.39"],"如":["26.39"],"m3u8":["26.39"],"mkv":["26.39"],"但有时候视频地地址没有正确的后缀":["26.39"],"进行匹配":["26.40"],"把视频解码权交给第三方程序进行处理":["26.40"],"处理的函数能接收三个参数":["26.40"],"视频":["26.40"],"dom":["26.40"],"默认显示语言":["26.41"],"目前支持":["26.41"],"是否在移动端显示一个":["26.43"],"锁定按钮":["26.43"],"用于隐藏底部":["26.43"],"控制栏":["26.43"],"是否在移动端启用视频元素上的手势事件":["26.44"],"是否在移动端添加长按视频快进功能":["26.45"],"是否在移动端的网页全屏时":["26.47"],"根据视频尺寸和视口尺寸":["26.47"],"旋转播放器":["26.47"],"是否显示":["26.48"],"当前只有部分浏览器支持该功能":["26.48"],"函数可以返回一个第三方的":["26.50"],"或者":["26.50"],"htmlvideoelement":["26.50"],"例如可以代理一个已经存在的":["26.50"]},{"0":["9.6","13.26","15.8","15.35","15.36"],"1":["9.6","13.26","15.8","15.35","15.36","19.6","20.10"],"2":["13.28","20.13","22.1","24.5","26.1"],"3":["20.7","20.10","23.7"],"4":["22.7","22.10","22.19","22.30","22.31","22.38","22.42","25.1","26.10","26.19","26.30","26.31","26.38","26.46","26.49"],"5":["9.6","13.12","19.6","20.13","22.46","26.46"],"6":["2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40"],"7":["2.19","2.21","2.23","2.25","2.26","5.15","5.26","5.30","15.30","22.4","22.38","26.4","26.38"],"8":["2.17","2.20","5.1","5.13","5.20","5.28","5.29","5.31","5.32","5.33","5.40","12.20","15.40"],"9":["2.29","2.30","2.31","5.11","5.19","5.21","5.22","5.34","12.29","12.30","12.31","15.11","15.19","15.21","15.34","22.4","22.42","26.4"],"10":["2.6","2.18","2.24","7.5","9.6","12.24","13.11","13.24","17.5","24.4"],"11":["5.2","5.3","5.20","5.30","12.28","15.2","15.30","23.11"],"12":["22.30","26.30"],"15":["22.34","26.34"],"16":["22.31","26.31"],"17":["4.0","14.0"],"19":["15.41"],"25":["13.28"],"29":["15.41"],"35":["13.7"],"50":["13.10"],"200":["13.6","13.8","13.9","13.21"],"250":["9.3","13.5","19.3"],"300":["13.17"],"1000":["13.22","24.6"],"2000":["13.4"],"是指挂载在":["0.0","1.0","5.0"],"js":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.12","0.14","0.15","1.1","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.3","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","3.30","5.1","5.2","5.3","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.22","5.24","5.25","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.37","5.40","5.42","5.43","9.1","9.5","10.1","10.4","10.5","10.6","10.13","12.6","12.18","12.20","12.24","12.28","12.29","12.30","12.31","13.20","15.1","15.2","15.11","15.19","15.21","15.26","15.30","15.34","15.40","15.42","19.6","21.0","22.4","22.7","22.10","22.30","22.31","22.34","22.38","22.42","24.7","24.9","24.10","24.15","24.16","24.17","25.0","26.1","26.7","26.10","26.19","26.30","26.33","26.34","26.38","26.46","26.49"],"var":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.12","0.13","0.14","0.15","0.16","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","5.2","5.3","5.11","5.13","5.15","5.19","5.21","5.22","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.40","5.42","9.5","10.1","10.5","12.29","12.30","12.31","13.20","15.2","15.11","15.19","15.21","15.30","15.40","15.41","22.1","22.7","22.10","22.19","22.30","22.31","22.42","22.46","24.6","24.9","24.10","24.11","24.12","25.1","25.2","26.1","26.4","26.10","26.19","26.30","26.31","26.38","26.42","26.46"],"art":["0.1","0.2","0.5","0.6","0.7","0.10","0.13","0.15","0.16","2.2","2.6","2.11","2.12","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","2.39","5.15","5.19","5.21","5.22","5.26","5.30","5.40","8.4","9.5","10.1","10.2","12.31","13.20","15.19","15.21","15.30","15.40","15.41","18.4","20.5","20.10","21.4","22.1","22.7","22.10","22.19","22.28","22.29","22.30","22.31","22.42","22.46","23.5","24.6","24.11","24.12","24.13","25.1","25.2","26.1","26.4","26.19","26.28","26.29","26.30","26.31","26.34","26.38","26.40","26.42","26.46"],"new":["0.1","0.2","0.6","0.7","0.13","0.15","0.16","2.2","2.6","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.11","5.22","5.40","5.41","8.2","8.4","8.5","10.1","10.2","15.11","15.15","15.19","15.21","15.30","15.41","18.2","18.4","18.5","20.5","21.3","21.4","22.1","22.7","22.10","22.19","22.28","22.29","22.30","22.31","22.42","22.46","23.5","24.6","24.11","24.12","24.13","25.4","26.1","26.4","26.28","26.29","26.30","26.31","26.42"],"artplayer":["0.2","0.7","0.13","0.15","0.16","2.2","2.22","2.24","2.28","2.29","2.30","2.31","3.5","3.6","3.7","3.29","3.30","5.11","5.22","5.41","8.2","8.3","8.4","8.5","9.7","10.1","10.2","13.20","15.11","15.15","15.19","15.30","15.41","18.2","18.3","18.4","18.5","19.3","19.7","20.1","20.8","20.9","20.10","21.0","21.3","22.7","22.10","22.19","22.28","22.29","22.30","22.31","22.42","22.46","23.1","23.8","24.2","24.3","24.8","24.16","25.0","25.3","26.4","26.26","26.28","26.29","26.30","26.31","26.42"],"container":["0.2","0.3","0.13","0.16","2.2","2.28","5.11","5.41","6.2","6.3","7.4","8.2","8.3","8.4","8.5","9.7","10.2","15.11","15.15","15.19","15.41","16.2","16.3","17.4","18.2","18.3","18.4","18.5","19.3","19.7","21.3","21.4","22.7","22.10","22.19","22.28","22.29","22.30","22.31","22.42","22.46","23.4","23.9","24.6","24.11","24.12","24.13","24.14","25.3","25.4","26.2","26.4","26.28","26.29","26.31","26.42"],"app":["0.2","0.4","0.13","5.41","6.2","6.3","6.4","6.5","7.3","7.4","8.2","8.3","8.4","8.5","9.7","10.2","15.11","15.15","15.41","16.2","16.3","16.4","16.5","17.3","17.4","18.2","18.3","18.4","18.5","19.3","19.7","20.3","20.4","21.4","22.1","22.19","22.28","22.29","22.46","23.4","24.11","24.12","24.13","24.14","25.4","26.2","26.4","26.28","26.29","26.42"],"url":["0.2","0.4","5.41","6.2","6.3","6.4","6.5","7.3","7.4","8.2","8.3","8.5","9.3","9.7","9.8","10.2","15.15","15.41","16.2","16.3","16.4","16.5","17.3","17.4","18.2","18.3","18.5","19.3","19.7","19.8","22.19","22.28","22.29","22.32","22.39","22.46","24.12","24.13","24.14","26.28","26.29","26.32","26.40","26.42"],"classname":["0.3","0.11","1.11","3.15","3.21","3.24","3.25","3.28","3.31","5.4","5.14","5.27","5.35","5.36","5.37","5.38","9.2","9.5","10.4","10.6","10.7","10.13","10.16","11.6","12.1","12.2","12.5","12.11","12.12","12.13","12.15","12.17","12.19","12.25","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","13.2","13.3","13.5","13.8","13.9","13.10","13.17","13.22","13.28","13.29","13.30","13.32","15.3","15.5","15.6","15.7","15.8","15.9","15.10","15.13","15.20","15.22","15.23","15.24","15.25","15.27","15.28","15.29","15.31","15.32","15.33","15.37","15.39","15.43","19.2","19.5","22.4","22.9","22.13","22.33","22.41","22.49","26.6","26.8","26.12","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.32","26.33","26.37","26.39","26.41","26.43","26.47","26.48","26.50"],"run":["0.3","0.8","0.9","0.11","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.1","3.2","3.4","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.33","5.4","5.5","5.6","5.8","5.10","5.12","5.14","5.23","5.27","5.35","5.36","5.37","5.38","5.39","9.2","9.5","10.4","10.6","10.7","10.13","10.16","11.6","12.1","12.2","12.3","12.4","12.5","12.9","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.22","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.8","13.9","13.10","13.17","13.22","13.28","13.29","13.30","15.3","15.6","15.7","15.8","15.9","15.13","15.20","15.22","15.24","15.25","15.26","15.27","15.28","15.29","15.31","15.32","15.33","15.37","15.42","15.43","19.2","19.5","22.4","22.9","22.13","22.33","22.38","22.41","22.49","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.27","26.32","26.33","26.37","26.39","26.41","26.43","26.44","26.45","26.47","26.48","26.50"],"code":["0.3","0.8","0.9","0.10","0.11","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","2.41","3.1","3.2","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","5.4","5.5","5.6","5.7","5.8","5.9","5.10","5.12","5.14","5.17","5.18","5.23","5.27","5.35","5.36","5.37","5.38","5.39","5.43","9.1","9.2","9.5","10.4","10.5","10.6","10.7","10.13","10.16","11.6","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.8","13.9","13.17","13.22","13.29","13.30","15.3","15.7","15.8","15.9","15.13","15.20","15.21","15.24","15.26","15.27","15.28","15.29","15.30","15.31","15.32","15.33","15.37","15.42","15.43","19.5","21.0","21.2","22.4","22.38","22.49","24.8","26.3","26.5","26.7","26.8","26.9","26.12","26.13","26.17","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.27","26.32","26.33","26.37","26.39","26.41","26.43","26.44","26.45","26.47","26.48"],"document":["0.3","22.1"],"assets":["0.4","5.41","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.7","9.8","10.2","15.11","15.15","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.3","19.7","19.8","22.29","22.46","24.12","24.13","24.14","26.2","26.29","26.42"],"sample":["0.4","5.41","6.2","6.3","6.4","6.5","7.3","7.4","7.5","9.3","9.8","10.2","12.0","15.15","16.2","16.3","16.4","16.5","17.3","17.4","17.5","19.3","19.8","22.29","24.13","24.14","26.2","26.29","26.42"],"video":["0.4","5.41","6.2","6.3","6.4","6.5","7.3","7.5","8.2","8.3","8.5","9.3","9.8","10.2","11.5","12.11","13.1","15.5","16.2","16.3","16.4","16.5","17.3","17.5","18.2","18.3","18.5","19.3","19.8","22.13","22.15","22.29","22.44","22.45","24.13","24.14","26.2","26.50"],"mp4":["0.4","6.3","6.4","6.5","7.3","7.5","8.2","8.3","8.5","9.3","9.4","9.8","9.9","12.0","16.3","16.4","16.5","17.3","17.5","18.2","18.3","18.5","19.3","19.4","19.8","19.9","22.2","24.14","26.2"],"test":["0.4"],"foo":["0.4"],"bar":["0.4","13.16","13.33","22.6","22.8","22.17","22.22","22.23"],"const":["0.4","9.6","19.6","20.9","23.9"],"获取整体的字幕列表":["0.11"],"div":["0.11","3.31","5.4","5.35","5.36","5.38","9.2","9.5","10.4","10.6","10.7","10.13","10.16","11.9","11.12","12.1","12.2","12.5","12.11","12.12","12.32","12.33","12.35","12.36","12.37","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.17","13.22","13.26","13.28","13.29","13.32","15.3","15.5","15.6","15.8","15.9","15.10","15.12","15.13","15.16","15.17","15.18","15.20","15.22","15.23","15.24","15.25","15.27","15.28","15.29","15.31","15.32","15.33","15.37","15.39","19.2","19.5","20.3","22.4","22.9","22.13","22.24","22.27","22.33","22.41","22.49","26.6","26.12","26.14","26.15","26.16","26.18","26.20","26.22","26.23","26.24","26.26","26.27","26.32","26.33","26.37","26.39","26.40","26.41","26.43","26.47","26.48","26.50"],"console":["1.1","2.0","12.0","24.18"],"info":["2.0","12.0","24.18"],"只监听一次事件":["2.0"],"但估计没有足够的数据来支撑播放到结束":["2.42"],"渲染完成":["2.44"],"属性的值改变时触发":["2.45"],"当这个":["2.46"],"因为":["2.47"],"或者资源类型不是受支持的媒体格式":["2.48"],"中的首帧已经完成加载":["2.49"],"播放准备开始":["2.53"],"seek":["2.56","2.57","12.56","12.57","13.25","15.14"],"user":["2.58","23.13"],"属性指定的时间发生变化":["2.60"],"播放已停止":["2.62"],"也是指挂载在":["3.0"],"构造函数":["3.0"],"组件唯一名称":["6.1","8.1"],"用于标记类名":["6.1","8.1"],"index":["6.1","7.5","8.1","16.1","17.5","18.1","24.7","24.10","24.15","24.16","24.17"],"number":["6.1","7.1","8.1","16.1","18.1","19.2"],"contextmenu":["6.4","6.5","16.4","16.5"],"name":["6.5","7.5","9.9","15.16","16.5","17.5","19.9","22.32"],"组件索引":["7.1"],"用于显示的优先级":["7.1"],"html":["7.1","7.2","9.4","9.9","15.4","17.1","17.2","19.4","19.9","22.26","22.32"],"element":["7.1","13.31","15.31","17.1"],"position":["7.2","7.5","17.2","17.5"],"left":["7.2","13.25","17.2"],"tooltip":["7.2","9.2","9.9","17.2","19.2","19.5","19.6","19.9"],"style":["7.2","9.3","17.2","22.36","26.36"],"color":["7.2","15.33","17.2"],"red":["7.2","17.2"],"click":["7.2","13.18","13.19","17.2"],"function":["7.2","17.2","19.5","22.17","22.34","22.40","23.10","26.34"],"args":["7.2","17.2"],"controls":["7.3","7.5","17.3","17.5"],"add":["7.3","17.3"],"button1":["7.5","17.5"],"png":["8.4","18.4","22.28","26.28"],"列表宽度":["9.2"],"提示文本":["9.2","9.5"],"setting":["9.3","9.4","9.8","9.9","19.3","19.4","19.8","19.9"],"true":["9.3","9.4","9.8","9.9","13.18","13.19","13.20","13.32","19.3","19.4","19.8","19.9","24.6"],"settings":["9.3","9.4","9.9","19.3","19.4","19.9","22.14","22.16","22.18","22.24"],"subtitle":["9.3","19.3"],"01":["9.3","9.4","19.3"],"default":["9.3","11.12","13.3","13.10","13.11","13.12","13.13","13.14","13.16","13.18","13.19","13.23","13.25","13.26","13.32","19.3"],"span":["9.3"],"multi":["9.4","19.4"],"level":["9.4","13.0","19.4"],"selector":["9.4","19.4"],"value":["9.6","22.11"],"min":["9.6"],"flip":["9.8","19.1","19.8"],"slider":["9.9","19.9"],"5x":["9.9","19.9"],"icon":["9.9","19.9"],"refer":["10.0","15.0"],"to":["10.0","10.8","11.0","11.1","12.53","12.58","13.4","13.8","13.9","13.21","13.25","15.0","15.4","15.14","20.11"],"method":["10.3"],"used":["10.3","13.33","15.35","15.36","16.1","17.1","18.1","22.3"],"hover":["10.3"],"delete":["10.4"],"clear":["10.4"],"object":["10.6","26.11"],"updating":["10.8"],"show":["10.8","10.9","10.10","10.15"],"property":["10.8","10.9","10.15"],"set":["10.8","10.9","10.15"],"whether":["10.9","10.15"],"display":["10.9","17.1","22.17"],"update":["10.10"],"attribute":["10.10","10.12"],"switch":["10.11"],"toggle":["10.12","10.14"],"the":["11.0","12.45","13.1","15.0","15.5","15.12","22.8","22.25","22.26","22.37","22.43","22.45"],"want":["11.1"],"manage":["11.1"],"multiple":["11.1"],"players":["11.1"],"player":["11.2","11.3","11.4","11.7","11.11","15.28","15.29","15.37","15.38","15.39","22.5","22.12","22.21","22.25","22.26"],"options":["11.7","11.9","11.12","22.36"],"event":["11.8","12.0","19.5","22.4"],"dispatcher":["11.8"],"for":["11.9","11.11","13.23","13.33","16.1","18.1","22.3","22.6","22.40","22.50"],"type":["11.10"],"checking":["11.10"],"on":["12.0","13.24","19.6","22.20","22.27","22.43","22.44","22.45","24.18"],"canplay":["12.0"],"listen":["12.0"],"an":["12.0","20.12"],"only":["12.0","22.3","22.14","22.21","22.48"],"once":["12.0"],"first":["12.1","12.49","13.0"],"time":["12.1","12.60","24.4"],"mouse":["12.12"],"hidden":["12.37"],"file":["12.42","20.11"],"but":["12.42","15.10","15.14"],"estimates":["12.42"],"there":["12.42"],"it":["12.43","15.14","22.15","22.50"],"can":["12.43","15.38","20.11","22.11","22.40"],"play":["12.43"],"rendering":["12.44"],"when":["12.45","12.46"],"this":["12.46","22.11"],"has":["12.46","12.47","12.50","12.51","12.52","12.62"],"stopped":["12.47"],"while":["12.48","12.54"],"fetching":["12.48"],"media":["12.48"],"frame":["12.49","15.17","15.18"],"start":["12.53"],"triggered":["12.54"],"playback":["12.55","15.12","22.3","22.8"],"is":["12.58","13.6","13.7","13.10","13.11","13.14","13.16","13.17","13.18","13.19","13.22","13.26","13.32","15.14","15.16","15.37","15.38","22.2","22.5"],"trying":["12.58"],"data":["12.59","24.8","24.16"],"specified":["12.60"],"changed":["12.61"],"properties":["13.0"],"mounted":["13.0"],"in":["13.1","13.13","13.15","13.16","13.21","13.27","15.6","20.13","22.2","22.11","22.14","22.15","22.16","22.18","22.24","22.33","22.47"],"events":["13.1"],"of":["13.1","13.12","13.13","13.24","15.39","20.12","22.12","22.35"],"by":["13.1","13.3","20.13","22.45"],"text":["13.2","19.2","19.5","19.6","22.33"],"enabled":["13.3"],"milliseconds":["13.4","13.13","13.15","13.16","13.21"],"defaults":["13.4","13.21","13.31"],"pixels":["13.6","13.7"],"feature":["13.11"],"seconds":["13.12","13.27","15.5","15.6","22.33"],"with":["13.12","13.13","15.35","15.36","22.3"],"a":["13.12","13.13","13.14","13.15","15.17","15.18"],"connection":["13.14","13.15"],"error":["13.14","13.15"],"occurs":["13.14","13.15"],"measured":["13.16"],"double":["13.18","13.19"],"long":["13.23","22.45"],"pressing":["13.23","22.45"],"mobile":["13.24","22.27","22.43","22.44"],"delay":["13.24"],"and":["13.25","22.5","22.6","22.8","22.25"],"right":["13.25"],"keyboard":["13.27"],"shortcuts":["13.27"],"under":["13.31"],"mainly":["13.33"],"smooth":["13.33"],"progress":["13.33","15.12","22.6","22.8"],"ready":["14.0"],"also":["14.0","20.12"],"after":["14.0","15.4"],"remove":["15.4"],"s":["15.4","15.23","17.1","22.26"],"from":["15.8","20.8","20.9","21.2","23.8","23.11"],"performs":["15.10"],"some":["15.10","22.48"],"optimization":["15.10"],"operations":["15.10"],"will":["15.12","20.6","20.12","21.0","22.15","22.16","22.37"],"carry":["15.12"],"over":["15.12"],"previous":["15.12"],"similar":["15.14","22.4"],"does":["15.14","22.39"],"parameter":["15.16"],"which":["15.17","15.18","15.38","20.11","21.1","22.2","22.11"],"returns":["15.17","15.18"],"promise":["15.17","15.18","24.6"],"full":["15.20","22.47"],"screen":["15.20","22.47"],"before":["15.22","22.5","22.26"],"starts":["15.22"],"playing":["15.22"],"mode":["15.23"],"its":["15.25"],"size":["15.25"],"normal":["15.27"],"horizontal":["15.27"],"vertical":["15.27"],"commonly":["15.35","15.36"],"be":["15.37","22.21","22.37"],"destroyed":["15.37"],"limited":["15.38"],"within":["15.38"],"current":["15.38","20.5","23.5"],"marking":["16.1","18.1"],"class":["16.1","18.1","20.3"],"priority":["17.1"],"items":["19.1"],"playbackrate":["19.1"],"aspectratio":["19.1"],"subtitleoffset":["19.1"],"list":["19.2"],"onswitch":["19.5"],"completion":["19.6"],"onchange":["19.6"],"change":["19.6"],"install":["20.1","23.1"],"body":["20.3"],"if":["20.5","23.5"],"typeof":["20.5","23.5"],"let":["20.10"],"null":["20.10"],"parameters":["20.10"],"use":["20.11"],"legacy":["20.11"],"up":["20.11"],"all":["20.12"],"plugins":["20.12","24.14","24.18"],"provide":["20.12"],"version":["20.12","20.13"],"changing":["20.13"],"therefore":["20.13"],"starting":["20.13"],"core":["21.0"],"no":["21.0"],"longer":["21.0"],"do":["21.1"],"not":["21.1","22.2","22.39"],"require":["21.1"],"manual":["21.1"],"group":["21.2"],"import":["21.2","23.11"],"id":["21.2"],"zhtw":["21.2","25.2"],"sometimes":["22.2","22.39"],"known":["22.2"],"so":["22.2"],"quickly":["22.2"],"case":["22.2"],"you":["22.2"],"remembering":["22.3"],"initialized":["22.5"],"highlight":["22.6"],"often":["22.11"],"results":["22.11"],"black":["22.11"],"bars":["22.11"],"scrolls":["22.12"],"out":["22.12"],"currently":["22.14","22.48"],"available":["22.14"],"panel":["22.14","22.16","22.18","22.24"],"appear":["22.15","22.16"],"menu":["22.17"],"bottom":["22.17","22.18","22.20","22.43"],"control":["22.17","22.20","22.22","22.23"],"button":["22.20"],"page":["22.21"],"should":["22.21"],"one":["22.21"],"at":["22.22","22.23"],"appearing":["22.24"],"loses":["22.25"],"focus":["22.25"],"pre":["22.26"],"render":["22.26"],"required":["22.26"],"devices":["22.27"],"boolean":["22.32"],"string":["22.32","22.33"],"myplugin":["22.34","26.34"],"column":["22.35"],"columns":["22.35"],"width":["22.35","26.35"],"encoding":["22.36","26.36"],"directly":["22.37"],"written":["22.37"],"into":["22.37"],"such":["22.39"],"m3u8":["22.39"],"mkv":["22.39"],"ts":["22.39"],"however":["22.39"],"have":["22.39"],"party":["22.40"],"program":["22.40"],"processing":["22.40"],"receive":["22.40"],"en":["22.41"],"zh":["22.41","25.2"],"cn":["22.41","26.41"],"hide":["22.43"],"elements":["22.44"],"pages":["22.47"],"according":["22.47"],"browsers":["22.48"],"support":["22.48"],"or":["22.50"],"htmlvideoelement":["22.50"],"example":["22.50"],"demo":["23.3"],"meta":["23.3"],"charset":["23.3"],"utf":["23.3","26.36"],"ref":["23.4"],"时会自动导入的":["23.6"],"param":["23.10"],"getinstance":["23.10"],"可以兼容到":["23.11"],"ie":["23.11"],"和所有插件还会提供一个":["23.12"],"版本的":["23.12"],"mjs":["23.12"],"如":["23.12"],"dist":["23.12"],"globalthis":["23.13"],"custom":["23.13"],"agent":["23.13"],"全局变量":["23.13"],"plugin":["24.2","24.3","24.8","24.16"],"danmuku":["24.2","24.7","24.10","24.16"],"npm":["24.3"],"弹幕时间":["24.4"],"默认为当前播放器时间":["24.4"],"默认弹幕模式":["24.5"],"滚动":["24.5"],"顶部":["24.5"],"底部":["24.5"],"modes":["24.5"],"弹幕可见的模式":["24.5"],"fontsize":["24.5"],"danmu":["24.6","24.18"],"return":["24.6"],"resolve":["24.6"],"settimeout":["24.6"],"libs":["24.8","24.16"],"uncompiled":["24.8","24.16"],"artplayerplugindanmuku":["24.14","24.18"],"xml":["24.18"],"visible":["24.18"],"显示弹幕":["24.18"],"版本开始":["25.0"],"核心代码除了包含":["25.0"],"tw":["25.2"],"高亮元素":["26.6"],"上":["26.6"],"类似":["26.11"],"css":["26.11"],"的":["26.11"],"fit":["26.11"],"里":["26.14","26.15","26.16","26.24"],"访问到播放器所需的":["26.26"],"layer":["26.28"],"画质地址":["26.32"],"预览图列数":["26.35"],"预览图宽度":["26.35"],"height":["26.35"],"预览图高度":["26.35"],"scale":["26.35"],"字幕样式":["26.36"],"字幕编码":["26.36"],"默认":["26.36"],"所以需要特别指明":["26.39"],"元素":["26.40"],"视频地址":["26.40"],"当前实例":["26.40"],"dom元素":["26.50"]},{"0":["13.25","19.6","24.4"],"1":["3.29","9.3","13.29","19.3"],"2":["3.29","9.6","13.29","19.6","26.3"],"3":["9.6","13.23"],"4":["9.1","20.13","21.1","22.17","22.33","22.49","23.10","26.5","26.7","26.8","26.9","26.13","26.17","26.21","26.24","26.25","26.32","26.33","26.37","26.39","26.41","26.44","26.45"],"5":["13.14","13.25","13.27"],"6":["2.41","5.38","5.39","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","23.10"],"7":["5.4","5.5","5.6","5.9","5.16","5.17","5.18","5.23","5.35","5.36","12.19","12.21","12.23","12.25","12.26","15.9","15.26","26.37"],"8":["5.8","5.14","5.24","5.25","5.27","5.37","12.17","15.1","15.8","15.13","15.20","15.24","15.27","15.28","15.29","15.31","15.32","15.33","15.37","22.36","23.3","26.36"],"9":["5.10","5.12","15.10","15.22"],"10":["5.7","5.37","7.3","7.4","12.2","12.6","12.18","15.7","15.11","15.37","17.3","17.4","19.6"],"11":["15.3","15.20","20.11"],"14":["26.32"],"22":["9.9","19.9"],"25":["22.33","26.33"],"40":["3.7"],"100":["3.10"],"150":["9.4","19.4"],"300":["3.5","3.6"],"500":["3.8","3.9","3.17"],"1000":["13.15"],"3000":["13.13","13.16"],"实例":["0.0","5.0"],"artplayer":["0.1","0.3","0.5","0.6","0.8","0.9","0.10","0.12","0.14","1.1","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.17","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","5.1","5.2","5.3","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.15","5.17","5.18","5.19","5.20","5.21","5.24","5.26","5.27","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.37","5.40","5.42","5.43","9.1","9.2","9.5","10.4","10.5","10.6","10.7","10.13","10.16","11.6","12.2","12.6","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","13.5","13.8","13.9","13.17","13.22","13.28","13.29","13.30","15.2","15.21","15.26","15.34","15.37","15.40","15.42","15.43","19.2","19.5","20.2","22.4","22.38","23.2","23.13","25.1","26.10","26.19","26.33","26.38","26.39","26.46","26.49"],"container":["0.1","0.5","0.6","0.7","0.8","0.9","0.10","0.12","0.14","0.15","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","5.2","5.3","5.8","5.10","5.12","5.13","5.15","5.19","5.20","5.21","5.22","5.26","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.37","5.40","5.42","5.43","9.2","9.5","10.1","10.3","10.4","10.5","10.6","10.7","10.13","10.16","12.20","12.22","12.24","12.28","12.29","12.30","12.31","13.20","15.2","15.21","15.26","15.37","15.40","15.42","19.5","20.9","21.2","22.4","22.38","24.9","24.10","24.15","24.17","25.1","25.2","26.10","26.19","26.30","26.33","26.38","26.46","26.49"],"app":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.15","0.16","2.2","2.6","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.11","5.15","5.19","5.21","5.22","5.26","5.30","5.31","5.40","9.5","10.1","10.4","10.5","10.6","10.13","12.31","13.20","15.19","15.21","15.30","15.37","15.40","19.5","20.5","20.9","21.3","22.4","22.7","22.10","22.30","22.31","22.38","22.42","23.9","24.6","24.10","25.2","25.3","26.1","26.19","26.30","26.31","26.38","26.46"],"assets":["0.2","0.6","0.7","0.10","0.13","0.15","0.16","2.2","2.22","2.28","2.31","5.11","5.22","5.40","9.5","10.1","10.4","10.6","10.13","13.20","15.19","15.21","15.30","15.41","21.3","21.4","22.1","22.4","22.7","22.10","22.19","22.30","22.31","22.42","23.9","24.6","24.10","24.11","25.2","25.3","25.4","26.1","26.4","26.30","26.31"],"sample":["0.2","0.6","0.13","0.15","0.16","2.2","2.28","5.11","5.22","9.5","9.7","10.1","10.4","10.6","10.13","13.20","15.11","15.19","15.21","15.30","15.41","19.7","21.4","22.1","22.4","22.7","22.10","22.19","22.30","22.31","22.42","22.46","23.9","24.6","24.11","24.12","25.2","25.4","26.4","26.30","26.31"],"video":["0.2","0.13","0.15","0.16","5.11","7.4","8.4","9.5","9.7","10.4","10.6","10.13","13.20","15.19","15.21","15.41","17.4","18.4","19.7","21.4","22.1","22.7","22.10","22.19","22.28","22.30","22.31","22.42","22.46","22.47","22.50","24.6","24.11","24.12","25.2","25.4","26.4","26.28","26.29","26.31","26.42"],"mp4":["0.2","0.13","0.16","5.11","5.41","6.2","7.4","8.4","9.5","9.7","10.2","10.4","15.11","15.15","15.19","15.21","15.30","15.41","16.2","17.4","18.4","19.7","21.4","22.1","22.4","22.7","22.10","22.19","22.28","22.29","22.30","22.31","22.42","22.46","24.6","24.11","24.12","24.13","25.2","25.4","26.4","26.28","26.29","26.42"],"console":["0.2","0.4","1.6","7.2","10.2","11.6","15.15","17.2","22.34","26.34"],"info":["0.2","0.4","1.1","7.2","10.2","11.6","15.15","17.2","22.34","26.34"],"queryselector":["0.3","5.37","10.3","15.37","22.1","24.16","26.1"],"art":["0.3","0.8","0.9","0.11","0.12","0.14","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.5","3.6","3.7","3.30","5.1","5.2","5.3","5.5","5.6","5.7","5.8","5.9","5.13","5.14","5.16","5.17","5.18","5.20","5.23","5.24","5.25","5.27","5.28","5.29","5.31","5.32","5.33","5.34","5.42","5.43","9.1","9.2","10.4","10.5","10.6","10.7","10.13","10.16","12.2","12.3","12.4","12.6","12.7","12.8","12.9","12.10","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.39","12.40","12.41","15.1","15.2","15.3","15.7","15.9","15.13","15.22","15.26","15.28","15.29","15.31","15.32","15.33","15.34","15.42","15.43","19.2","19.5","21.2","22.4","22.34","22.38","22.49","24.7","24.9","24.10","24.15","24.17","26.5","26.7","26.10","26.17","26.32","26.33","26.39","26.49"],"new":["0.3","0.5","0.8","0.9","0.10","0.11","0.12","0.14","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.30","5.1","5.2","5.3","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.15","5.16","5.17","5.18","5.19","5.20","5.21","5.24","5.25","5.26","5.27","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.42","5.43","9.1","9.2","9.5","10.4","10.5","10.6","10.7","10.13","10.16","12.2","12.6","12.7","12.8","12.10","12.16","12.17","12.18","12.20","12.21","12.22","12.23","12.24","12.26","12.28","12.29","12.30","12.31","13.20","15.1","15.2","15.7","15.22","15.26","15.31","15.32","15.34","15.40","15.42","15.43","19.2","19.5","20.13","21.2","22.4","22.38","24.9","24.10","24.15","24.17","25.1","25.2","26.7","26.10","26.19","26.33","26.38","26.39","26.46","26.49"],"url":["0.6","0.7","0.9","0.10","0.13","0.15","0.16","2.2","2.18","2.22","2.24","2.28","2.29","2.30","2.31","5.19","5.22","5.30","5.40","8.4","9.5","10.1","10.4","10.6","10.13","13.20","15.19","15.21","15.30","15.40","18.4","19.5","21.3","21.4","22.1","22.4","22.7","22.10","22.30","22.31","22.40","22.42","23.9","24.6","24.10","24.11","25.2","25.3","25.4","26.1","26.4","26.30","26.31","26.38","26.46"],"js":["0.11","1.6","3.1","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","5.4","5.5","5.6","5.14","5.23","5.27","5.35","5.36","5.38","5.39","9.2","10.3","10.7","10.16","11.6","12.1","12.2","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.19","12.21","12.22","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","13.30","15.3","15.6","15.7","15.8","15.9","15.10","15.12","15.13","15.17","15.18","15.20","15.22","15.24","15.25","15.27","15.28","15.29","15.31","15.32","15.33","15.37","15.43","19.2","19.5","21.1","22.17","22.33","22.41","22.49","24.8","26.3","26.5","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.26","26.27","26.32","26.37","26.39","26.41","26.43","26.44","26.45","26.47","26.48"],"var":["0.11","1.1","2.41","3.5","3.6","3.7","3.17","3.30","5.1","5.5","5.6","5.7","5.8","5.9","5.10","5.12","5.14","5.16","5.17","5.18","5.20","5.23","5.24","5.25","5.27","5.35","5.36","5.37","5.39","5.43","9.1","9.2","10.3","10.4","10.6","10.7","10.13","10.16","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.32","12.33","12.34","12.35","12.36","12.38","12.39","12.40","12.41","13.30","15.1","15.3","15.7","15.8","15.9","15.13","15.20","15.22","15.24","15.26","15.27","15.28","15.29","15.31","15.32","15.33","15.34","15.37","15.42","15.43","19.2","19.5","21.1","21.2","22.4","22.33","22.38","22.49","24.7","24.15","24.16","24.17","26.3","26.5","26.7","26.17","26.24","26.32","26.33","26.39","26.49"],"function":["0.13","6.5","16.5","17.1","20.10","26.36"],"构造函数":["1.0"],"code":["1.11","9.6","10.3","12.1","13.2","13.3","13.4","13.6","13.7","13.10","13.11","13.12","13.13","13.14","13.16","13.18","13.19","13.21","13.23","13.26","13.28","13.31","13.32","13.33","15.5","15.6","15.10","15.12","15.14","15.16","15.17","15.18","15.22","15.23","15.25","15.35","15.36","15.39","19.1","19.2","20.11","22.3","22.6","22.8","22.9","22.13","22.17","22.20","22.22","22.23","22.24","22.27","22.32","22.33","22.37","22.39","22.41","22.44","23.11","26.6","26.11","26.14","26.15","26.16","26.26","26.35","26.40","26.50"],"once":["2.0"],"不必停下来进一步缓冲内容":["2.42"],"media":["2.46","2.47","12.43","12.58"],"已经加载完成":["2.46"],"操作完成":["2.56"],"操作开始":["2.57"],"agent":["2.58","20.13"],"的":["3.0"],"false":["3.3","13.31","20.5","23.5","24.5","24.14"],"add":["4.0","6.3","8.3","14.0","24.2"],"例如我想写一个在视频暂停后":["4.0"],"显示一个图片广告的插件":["4.0"],"on":["5.11","13.0","15.11","15.15","15.30"],"document":["5.37","10.3","15.37","24.16","26.1"],"default":["5.41","7.5","13.1","13.15","13.27","15.41","17.5","23.10"],"true":["5.41","7.5","9.7","15.4","15.41","17.5","19.7","22.4","22.29","22.46","24.5","26.4","26.29","26.36"],"html":["5.41","6.1","6.2","6.3","6.4","6.5","7.3","7.5","8.1","8.2","8.3","8.5","9.8","15.41","16.1","16.2","16.3","16.4","16.5","17.3","17.5","18.1","18.2","18.3","18.5","19.8","22.28","22.29","22.36","23.13","24.14","26.28","26.29","26.36"],"sd":["5.41","15.41"],"480p":["5.41"],"组件索引":["6.1","8.1"],"用于显示的优先级":["6.1","8.1"],"contextmenu":["6.2","6.3","16.2","16.3"],"name":["6.2","6.3","6.4","7.3","7.4","8.2","8.3","8.4","8.5","9.8","16.2","16.3","16.4","17.3","17.4","18.2","18.3","18.4","18.5","19.8","22.28","22.34","26.28","26.34"],"your":["6.2","6.3","6.4","6.5","7.3","16.2","16.3","16.4","16.5","17.3","22.46","26.42"],"menu":["6.2","6.3","6.4","6.5","16.2","16.3","16.4","16.5","22.14","22.15","22.16"],"click":["6.4","6.5","16.4","16.5","17.1","24.14"],"args":["6.5","16.5"],"组件的":["7.1"],"dom":["7.1","17.1","22.40","22.50"],"元素":["7.1"],"style":["7.1","8.2","8.3","8.5","17.1","18.2","18.3","18.5","19.3","20.4","22.28"],"object":["7.1","17.1"],"mounted":["7.2","17.2"],"subtitle":["7.2","7.5","17.2","17.5"],"button1":["7.3","7.4","17.3","17.4"],"index":["7.3","7.4","17.3","17.4","24.8"],"position":["7.3","15.19","17.3","24.13","24.14"],"left":["7.3","17.3"],"controls":["7.4","15.19","17.4","24.13","24.14"],"right":["7.5","15.19","17.5","24.14"],"selector":["7.5","17.5","22.29","26.29"],"01":["7.5","17.5","19.4"],"layers":["8.2","8.3","8.4","8.5","18.2","18.3","18.4","18.5"],"potser":["8.2","8.3","8.5","26.28"],"width":["8.2","8.3","8.5","9.4","9.9","18.2","18.3","18.5","19.4","19.9","22.28"],"100px":["8.2","8.3","8.5","18.2","18.3","18.5","22.28"],"src":["8.2","8.5","9.9","18.2","18.5","19.9"],"color":["9.3","19.3"],"red":["9.3","19.3"],"srt":["9.3","19.3"],"id":["9.3","19.3","22.46"],"yellow":["9.3","19.3"],"02":["9.3"],"setting":["9.5","9.7","19.7","22.29","26.29"],"max":["9.6","19.6"],"step":["9.6"],"div":["9.6","10.3","10.12","10.14","11.1","11.2","11.3","11.4","11.5","11.7","11.8","11.10","11.11","13.1","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.25","13.27","13.31","13.33","15.4","15.14","15.35","15.36","19.1","20.5","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.17","22.18","22.20","22.22","22.23","22.25","22.32","22.35","22.37","22.39","22.43","22.44","22.45","22.48","22.50","23.3","23.5","26.11","26.35"],"classname":["9.6","10.3","10.14","11.1","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.4","13.6","13.7","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.25","13.26","13.27","13.31","13.33","15.12","15.14","15.16","15.17","15.18","15.35","15.36","19.1","22.3","22.5","22.6","22.8","22.12","22.14","22.16","22.17","22.18","22.20","22.22","22.23","22.24","22.25","22.27","22.32","22.37","22.39","22.43","22.44","22.45","22.48","26.11","26.35","26.40"],"run":["9.6","10.3","11.1","11.2","11.3","11.4","11.5","11.8","11.9","11.10","11.12","13.2","13.3","13.4","13.6","13.7","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.25","13.26","13.27","13.31","13.32","13.33","15.5","15.10","15.12","15.14","15.16","15.17","15.18","15.23","15.35","15.36","15.39","19.1","22.3","22.5","22.6","22.8","22.12","22.14","22.16","22.17","22.18","22.20","22.22","22.23","22.24","22.25","22.27","22.32","22.37","22.39","22.43","22.44","22.48","26.11","26.26","26.35","26.40"],"settings":["9.8","19.8","22.15"],"slider":["9.8","19.8"],"tooltip":["9.8","19.8"],"5x":["9.8","19.8"],"icon":["9.8","19.8"],"img":["9.9","19.9"],"height":["9.9","19.9","22.35"],"state":["9.9","19.9"],"svg":["9.9","19.9"],"secondary":["10.0"],"attributes":["10.0"],"custom":["10.3"],"test":["10.4"],"foo":["10.4"],"bar":["10.4","22.18","22.20","22.43"],"const":["10.4","20.8","23.8"],"whether":["10.8","10.10","22.36"],"display":["10.8","10.15","16.1","18.1"],"all":["10.8","10.9","10.10","10.15"],"or":["10.8","12.46","12.48"],"not":["10.8","12.42","15.14"],"toggle":["10.8","10.9","10.10","10.15"],"of":["10.9","10.14","12.49"],"set":["10.10","22.2"],"options":["10.11"],"texttrack":["10.11"],"get":["10.11"],"track":["10.11"],"activecues":["10.11"],"currently":["10.11"],"items":["10.15"],"first":["11.0"],"level":["11.0"],"at":["11.1","22.21"],"the":["11.1","12.54","20.3"],"same":["11.1","15.38"],"time":["11.1","22.8","22.21"],"is":["12.42","12.44","13.1","13.15","13.23","13.25","22.25"],"enough":["12.42"],"value":["12.45","19.6"],"been":["12.46","12.50","12.51"],"completely":["12.46"],"loaded":["12.46","24.18"],"because":["12.47"],"data":["12.48","23.10"],"started":["12.52"],"following":["12.53"],"a":["12.53","20.13","22.21"],"rate":["12.55"],"frame":["12.56","12.57"],"fetch":["12.58"],"loading":["12.59"],"by":["12.60"],"stopped":["12.62"],"constructor":["13.0"],"property":["13.0"],"turned":["13.1"],"off":["13.1"],"long":["13.24"],"press":["13.24"],"acceleration":["13.24"],"effects":["13.33"],"for":["14.0"],"example":["14.0"],"primary":["15.0"],"destruction":["15.4"],"which":["15.4"],"defaults":["15.4"],"ready":["15.11","15.15","15.30"],"seek":["15.11"],"settimeout":["15.11"],"trigger":["15.14"],"additional":["15.14"],"events":["15.14"],"timeupdate":["15.35","15.36"],"event":["15.35","15.36"],"prevent":["15.38"],"errors":["15.38"],"due":["15.38"],"having":["15.38"],"priority":["16.1","18.1"],"element":["16.1","18.1","22.37","22.40","22.50"],"poster":["18.2","18.3","18.5","22.28"],"span":["19.3"],"min":["19.6"],"yarn":["20.1","23.1","24.2"],"npm":["20.2","23.2"],"dist":["20.2","20.12","23.2","24.3"],"warning":["20.3","22.46"],"player":["20.3"],"s":["20.3"],"size":["20.3","22.47"],"option":["20.4","23.4"],"return":["20.5","22.34","23.5","23.10","26.34"],"destroy":["20.5","23.5"],"ref":["20.5","23.5"],"automatically":["20.6","22.11"],"param":["20.10"],"getinstance":["20.10"],"properties":["20.10"],"ie":["20.11"],"import":["20.11","21.1"],"from":["20.11"],"group":["20.11","23.11"],"bash":["20.11","23.11"],"jsdelivr":["20.11","23.11"],"net":["20.11","23.11"],"mjs":["20.12"],"such":["20.12"],"as":["20.12"],"we":["20.13"],"added":["20.13"],"globalthis":["20.13"],"user":["20.13"],"include":["21.0"],"other":["21.0"],"languages":["21.0"],"besides":["21.0"],"simplified":["21.0"],"chinese":["21.0"],"and":["21.0","22.14","22.15","22.16","22.47"],"english":["21.0"],"zh":["21.2"],"tw":["21.2"],"you":["22.1"],"may":["22.1"],"can":["22.2","22.26"],"asynchronously":["22.2"],"autoplayback":["22.3"],"muted":["22.4","26.4"],"it":["22.5","22.39"],"starts":["22.5"],"playing":["22.5","22.25"],"elements":["22.6"],"adjust":["22.11"],"to":["22.11","22.21","22.36"],"hide":["22.11"],"browser":["22.12"],"viewport":["22.12","22.47"],"context":["22.14","22.15","22.16"],"panel":["22.15"],"control":["22.18","22.43"],"description":["22.19"],"allowed":["22.21"],"play":["22.21","26.42"],"bottom":["22.22","22.23"],"mounts":["22.26"],"access":["22.26"],"setting01":["22.29","26.29"],"scale":["22.35"],"utf":["22.36"],"escape":["22.36","26.36"],"boolean":["22.36","26.36"],"tags":["22.36"],"correct":["22.39"],"so":["22.39"],"needs":["22.39"],"be":["22.39"],"specifically":["22.39"],"stated":["22.39"],"three":["22.40"],"parameters":["22.40"],"lang":["22.42","26.42"],"devices":["22.44","22.45"],"mobile":["22.45"],"this":["22.48"],"feature":["22.48"],"an":["22.50"],"existing":["22.50"],"body":["23.3"],"class":["23.3"],"属性":["23.10"],"export":["23.10"],"https":["23.11"],"plugin":["23.12"],"danmuku":["23.12","24.3","24.8"],"head":["23.13"],"title":["23.13"],"mode":["24.4"],"弹幕模式":["24.4"],"滚动":["24.4"],"弹幕字体大小":["24.5"],"antioverlap":["24.5"],"弹幕是否防重叠":["24.5"],"synchronousplayback":["24.5"],"是否同步播放速度":["24.5"],"mount":["24.5"],"undefined":["24.5"],"弹幕发射器挂载点":["24.5"],"默认为播放器控制栏中部":["24.5"],"heatmap":["24.5"],"plugins":["24.6","24.11","24.12","24.13"],"xml":["24.6","24.13","24.14"],"这是用户在输入框输入弹幕文本":["24.6"],"然后点击发送按钮后触发的函数":["24.6"],"artplayerplugindanmuku":["24.11","24.12","24.13"],"emitter":["24.14"],"重载":["24.14"],"danmu":["24.16"],"danmus":["24.18"],"加载弹幕":["24.18"],"length":["24.18"],"简体中文":["25.0"],"和":["25.0"],"英文":["25.0"],"有时候":["26.2"],"地址没那么快知道":["26.2"],"这时候你可以异步设置":["26.2"],"cover":["26.11"],"预览图缩放":["26.35"],"是否转义":["26.36"],"标签":["26.36"],"默认为":["26.36"],"onvttload":["26.36"],"用于修改":["26.36"]},{"0":["15.11","23.9"],"1":["3.25","9.9","19.9","24.4"],"2":["3.26","9.3","19.3","22.3","24.4"],"3":["3.28","13.28","19.6","26.1"],"4":["3.28","13.28","19.1","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.16","22.18","22.20","22.22","22.23","22.24","22.25","22.27","22.32","22.35","22.37","22.39","22.41","22.44","22.48","26.6","26.11","26.12","26.14","26.15","26.16","26.18","26.20","26.22","26.23","26.27","26.35","26.36","26.40","26.43","26.47","26.48","26.50"],"5":["3.23","3.29","9.9","13.29","19.9","22.7"],"6":["3.29","12.1","13.29","15.39","20.10","22.2","26.2"],"7":["15.5","15.6","15.16","15.17","15.18","15.23","15.35","15.36","22.37","26.26"],"8":["15.14","15.25","22.35","23.13","26.35","26.40"],"9":["15.12","22.28"],"10":["3.12","3.14","3.27","5.11","9.9","19.9"],"12":["24.13"],"14":["22.32"],"20":["3.11"],"22":["9.5"],"40":["13.7"],"50":["24.13"],"100":["13.10"],"300":["13.5","13.6"],"500":["3.21","13.8","13.9","13.17"],"512":["24.5"],"1000":["13.24"],"2000":["3.22","3.24","13.22"],"3000":["3.15","15.11"],"5000":["3.4","3.13","3.16"],"的":["0.0","0.4","1.0","5.0"],"url":["0.1","0.3","0.5","0.8","0.12","0.14","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.30","5.1","5.2","5.3","5.7","5.8","5.12","5.13","5.14","5.15","5.16","5.17","5.18","5.20","5.21","5.24","5.26","5.27","5.28","5.29","5.31","5.32","5.33","5.34","5.42","5.43","9.1","9.2","9.6","10.3","10.5","10.7","10.16","12.2","12.6","12.7","12.8","12.10","12.16","12.17","12.18","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.28","12.29","12.30","12.31","15.1","15.2","15.3","15.7","15.8","15.13","15.22","15.26","15.27","15.28","15.29","15.31","15.32","15.33","15.34","15.37","15.42","15.43","19.2","20.5","20.9","21.2","22.17","22.33","22.38","22.49","24.9","24.15","24.17","25.1","26.7","26.10","26.19","26.33","26.39","26.49"],"assets":["0.1","0.3","0.5","0.8","0.9","0.11","0.12","0.14","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","3.30","5.2","5.3","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.15","5.17","5.18","5.19","5.20","5.21","5.24","5.26","5.27","5.28","5.29","5.30","5.31","5.32","5.33","5.34","5.42","5.43","9.1","9.2","9.6","10.3","10.5","10.7","10.16","12.2","12.6","12.17","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","15.2","15.13","15.22","15.26","15.29","15.31","15.32","15.34","15.37","15.40","15.42","15.43","19.2","19.5","20.9","21.2","22.17","22.33","22.38","22.39","24.9","24.15","24.17","25.1","26.10","26.19","26.32","26.33","26.38","26.39","26.46","26.49"],"sample":["0.1","0.3","0.5","0.7","0.8","0.9","0.10","0.11","0.12","0.14","2.6","2.11","2.12","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.29","2.30","2.31","2.39","5.2","5.3","5.8","5.10","5.12","5.13","5.14","5.15","5.17","5.18","5.19","5.20","5.21","5.26","5.27","5.28","5.29","5.30","5.31","5.32","5.33","5.40","5.42","5.43","9.2","9.6","10.3","10.5","10.7","10.16","12.2","12.18","12.20","12.22","12.24","12.28","12.29","12.30","12.31","15.2","15.22","15.26","15.31","15.37","15.40","15.42","19.2","19.5","20.9","21.2","21.3","22.17","22.33","22.38","22.39","24.9","24.10","24.15","24.17","25.3","26.1","26.10","26.19","26.32","26.33","26.38","26.39","26.46","26.49"],"video":["0.1","0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.12","0.14","2.2","2.6","2.12","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.28","2.29","2.30","2.31","5.2","5.3","5.8","5.10","5.12","5.13","5.15","5.19","5.21","5.22","5.26","5.28","5.29","5.30","5.32","5.33","5.40","5.42","9.2","9.6","10.1","10.3","10.5","10.7","10.16","12.2","12.22","12.24","12.28","12.29","12.30","12.31","15.26","15.37","15.40","15.42","19.2","19.5","20.9","21.2","21.3","22.38","23.9","24.9","24.10","24.15","24.17","25.3","26.1","26.10","26.19","26.30","26.33","26.38","26.39","26.46"],"mp4":["0.3","0.5","0.6","0.7","0.8","0.9","0.10","0.15","2.2","2.17","2.18","2.20","2.22","2.24","2.28","2.29","2.30","2.31","5.15","5.19","5.21","5.22","5.26","5.29","5.30","5.31","5.40","5.42","9.2","10.1","10.3","10.5","10.6","10.7","10.13","10.16","12.28","12.29","12.31","13.20","15.22","15.26","15.37","15.40","19.2","19.5","20.9","21.2","21.3","22.38","23.9","24.9","24.10","24.17","25.3","26.1","26.10","26.19","26.30","26.31","26.33","26.38","26.46"],"warning":["0.4","10.2","10.4","11.6","15.11","15.15","15.19","15.30","20.4","22.7","22.10","25.0"],"提示":["0.4"],"默认所有播放器实例都是共享同一个":["0.4"],"localstorage":["0.4"],"而且默认的":["0.4"],"是":["0.4"],"settings":["0.4","9.2","9.5","19.5"],"如果你想不同的播放器使用不同的":["0.4"],"console":["0.6","0.13","0.16","6.2","6.3","6.4","6.5","9.3","9.4","10.1","10.4","10.5","10.6","10.13","11.1","16.2","16.3","16.4","16.5","19.3","19.4","22.29"],"info":["0.6","0.13","0.16","1.6","6.2","6.3","6.4","6.5","9.3","9.4","10.1","10.4","10.6","10.13","11.1","16.2","16.3","16.4","16.5","19.3","19.4","22.29"],"play":["0.6","10.6","22.42","26.4"],"on":["0.7","0.8","0.9","0.10","2.2","2.22","5.30","5.40","7.5","8.5","9.9","10.0","10.13","11.0","15.0","15.40","17.5","18.5","19.9","20.3","21.0"],"ready":["0.9","0.10","2.2","5.11","5.40","7.5","10.13","17.5"],"artplayer":["0.11","1.6","2.41","5.4","5.5","5.6","5.16","5.23","5.25","5.35","5.36","5.38","5.39","9.6","10.3","10.9","10.15","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.3","13.4","13.6","13.7","13.10","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.25","13.26","13.27","13.31","13.32","13.33","15.1","15.3","15.6","15.7","15.8","15.9","15.10","15.12","15.13","15.17","15.18","15.20","15.22","15.23","15.24","15.25","15.27","15.28","15.29","15.31","15.32","15.33","19.1","19.6","20.13","21.1","22.17","22.24","22.26","22.32","22.33","22.39","22.41","22.49","26.3","26.5","26.7","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.24","26.25","26.32","26.35","26.37","26.41","26.44","26.45"],"container":["0.11","1.1","2.1","2.3","2.4","2.14","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.29","3.30","5.1","5.4","5.5","5.6","5.7","5.9","5.14","5.16","5.17","5.18","5.23","5.24","5.25","5.27","5.35","5.36","5.38","5.39","9.1","9.6","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.30","15.1","15.3","15.7","15.8","15.9","15.10","15.12","15.13","15.17","15.18","15.20","15.22","15.24","15.27","15.28","15.29","15.31","15.32","15.33","15.34","15.43","19.2","19.6","20.3","21.1","22.17","22.24","22.32","22.33","22.39","22.41","22.49","24.7","24.16","26.5","26.7","26.17","26.24","26.26","26.32","26.37","26.39","26.41"],"app":["0.11","0.12","0.14","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.30","5.1","5.2","5.3","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.16","5.17","5.18","5.20","5.24","5.25","5.27","5.28","5.29","5.32","5.33","5.34","5.37","5.42","5.43","9.1","9.2","9.6","10.3","10.7","10.16","12.2","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.39","12.40","12.41","13.30","15.1","15.2","15.3","15.7","15.8","15.9","15.10","15.12","15.13","15.20","15.22","15.26","15.27","15.28","15.29","15.31","15.32","15.33","15.34","15.42","15.43","19.2","21.2","22.17","22.33","22.39","22.49","23.3","23.5","24.7","24.9","24.15","24.16","24.17","25.1","26.7","26.10","26.17","26.24","26.26","26.32","26.33","26.39","26.49"],"hotkeyevent":["0.13","10.13"],"event":["0.13","9.3","9.4","10.13","12.46","17.1","19.4"],"click":["0.13","6.2","6.3","7.1","7.3","10.13","15.19","15.21","16.2","16.3","17.3","22.30","24.12"],"true":["0.15","2.28","3.1","3.20","3.31","3.33","7.2","9.2","9.5","17.2","19.2","19.5","22.10","22.36"],"flip":["0.15"],"playbackrate":["0.15"],"aspectratio":["0.15"],"function":["0.16","6.2","6.3","6.4","7.1","7.3","9.4","10.13","10.16","15.19","15.21","16.2","16.3","16.4","17.3","19.4","22.29","22.30","22.36","24.12","24.14","26.29"],"myplugin":["0.16","10.16"],"art":["1.1","3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.18","3.21","3.22","3.23","3.24","3.27","3.28","3.29","3.32","3.33","5.4","5.35","5.36","5.37","5.38","5.39","9.6","10.3","10.9","10.14","10.15","12.1","12.5","12.11","12.12","12.32","12.33","12.34","12.35","12.36","12.37","12.38","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.29","13.30","15.5","15.6","15.8","15.14","15.16","15.17","15.18","15.20","15.23","15.24","15.25","15.27","15.35","15.36","15.37","15.39","19.1","19.6","20.8","21.1","22.9","22.13","22.17","22.24","22.27","22.32","22.33","22.39","22.40","22.41","23.8","24.8","24.16","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.27","26.35","26.37","26.41","26.43","26.44","26.45","26.47","26.48","26.50"],"new":["1.1","3.3","3.6","3.7","3.8","3.9","3.10","3.11","3.17","3.22","3.28","3.29","3.33","5.4","5.5","5.6","5.23","5.35","5.36","5.37","5.38","5.39","9.6","10.3","10.9","10.15","12.1","12.3","12.4","12.5","12.9","12.11","12.12","12.13","12.14","12.15","12.19","12.25","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.8","13.9","13.17","13.29","13.30","15.3","15.5","15.6","15.8","15.9","15.10","15.12","15.13","15.14","15.16","15.17","15.18","15.20","15.23","15.24","15.25","15.27","15.28","15.29","15.33","15.37","15.39","19.1","19.6","21.1","22.9","22.13","22.17","22.24","22.32","22.33","22.39","22.41","22.49","24.7","24.8","24.16","26.3","26.5","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.17","26.18","26.20","26.21","26.22","26.23","26.24","26.25","26.27","26.32","26.35","26.37","26.41","26.43","26.44","26.45","26.47","26.48","26.50"],"js":["1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","3.2","10.8","10.9","10.10","10.12","10.14","10.15","11.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.5","15.14","15.16","15.23","15.35","15.36","15.39","19.1","20.2","22.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.22","22.23","22.24","22.25","22.27","22.32","22.35","22.37","22.39","22.43","22.44","22.45","22.48","23.2","24.3","26.6","26.11","26.35","26.36","26.40","26.50"],"手动触发事件":["2.0"],"subtitle":["2.28","2.29","2.30","2.31"],"或者部分加载完成":["2.46"],"则发送此事件":["2.46"],"已经到达结束点":["2.47"],"正在尝试获取媒体数据":["2.58"],"一级属性":["3.0"],"var":["3.1","3.3","3.4","3.8","3.9","3.10","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.29","3.31","3.32","3.33","5.4","5.38","9.6","10.9","10.12","10.14","10.15","12.1","12.11","12.37","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","15.5","15.6","15.10","15.12","15.14","15.16","15.17","15.18","15.23","15.25","15.35","15.36","15.39","19.1","19.6","22.3","22.9","22.13","22.17","22.24","22.27","22.32","22.35","22.37","22.39","22.41","24.8","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.26","26.27","26.35","26.37","26.40","26.41","26.43","26.44","26.45","26.47","26.48","26.50"],"false":["3.18","3.19","3.32","6.5","13.3","16.5"],"adsplugin":["4.0","14.0"],"option":["4.0","14.0","24.18"],"layers":["4.0","14.0"],"ads":["4.0","14.0"],"html":["4.0","7.4","8.4","9.7","14.0","15.19","15.21","17.4","18.4","19.7","20.13","22.30","22.31","24.11","24.12","24.13","26.30","26.31"],"img":["4.0","9.5","9.8","14.0","19.8","22.38","26.38"],"style":["4.0","6.1","7.3","8.1","8.4","14.0","16.1","17.3","18.1","18.4","23.4","26.28"],"width":["4.0","8.4","9.5","9.8","14.0","18.4","19.8","24.5","26.28"],"100px":["4.0","8.4","14.0","18.4","26.28"],"src":["4.0","8.3","8.4","9.8","18.3","18.4","19.8","22.28","26.28"],"display":["4.0"],"none":["4.0"],"position":["4.0","5.19","7.4","8.2","8.3","8.5","15.21","17.4","18.2","18.3","18.5","22.28","22.31","24.11","24.12","26.28","26.31"],"absolute":["4.0","8.2","8.3","8.5","18.2","18.3","18.5","22.28","26.28"],"top":["4.0","8.2","8.3","8.5","18.2","18.3","18.5","22.28","26.28"],"20px":["4.0","22.28","26.28"],"right":["4.0","7.2","7.4","8.2","8.5","15.21","17.2","17.4","18.2","18.5","22.28","24.11","24.12","24.13"],"seek":["5.11"],"settimeout":["5.11","7.5","17.5","22.2"],"controls":["5.19","5.21","15.21","24.11","24.12"],"jpg":["5.22"],"hd":["5.41","15.41"],"720p":["5.41","15.41"],"element":["6.1","8.1"],"组件的":["6.1","8.1"],"dom":["6.1","8.1","9.4","16.1","18.1","19.4"],"元素":["6.1","8.1"],"args":["6.2","6.3","6.4","16.2","16.3","16.4","22.29","22.30","26.29"],"show":["6.5","9.7","9.9","16.4","16.5","19.7","19.9"],"组件样式对象":["7.1"],"组件点击事件":["7.1"],"mounted":["7.1","10.0","11.0","15.0","17.1"],"selector":["7.2","17.2"],"default":["7.2","10.4","17.2","20.10","21.4","25.4"],"span":["7.2","17.2"],"01":["7.2","17.2","22.29","26.29"],"button":["7.3","7.4","17.3","17.4"],"tooltip":["7.3","7.4","8.2","8.3","17.1","17.3","17.4","18.2","18.3","22.31"],"color":["7.3","17.3"],"red":["7.3","17.3"],"your":["7.4","15.30","17.4","21.0","22.30","22.31","26.30","26.31","26.46"],"02":["7.5","9.4","17.5","19.3","19.4","22.29","26.29"],"update":["7.5"],"the":["7.5","12.48","17.5","21.4","25.4"],"tip":["8.2","8.3","18.2","18.3"],"50px":["8.2","8.3","8.5","18.2","18.3","18.5"],"potser":["8.4"],"setting":["9.2","19.2","19.5"],"item":["9.3","9.4","19.4"],"onselect":["9.4","19.4","22.29","26.29"],"pip":["9.5","19.5"],"mode":["9.5","19.5"],"close":["9.5","19.5"],"height":["9.5","9.8","19.8"],"add":["9.7","20.1","23.1"],"slider":["9.7","19.7"],"state":["9.8","19.8"],"range":["9.9","19.9","24.13"],"to":["10.2","12.42","12.43","12.62","14.0","21.0","22.1"],"easily":["10.2"],"distinguish":["10.2"],"between":["10.2"],"by":["10.4","22.46"],"all":["10.4","13.0"],"zh":["10.6"],"cn":["10.6"],"div":["10.8","10.9","10.10","10.11","10.15","13.24","15.38","19.6","22.21","22.26","22.36","22.40","22.47","26.36"],"classname":["10.8","10.9","10.10","10.11","10.12","10.15","13.1","13.24","15.4","15.38","19.6","22.15","22.21","22.26","22.35","22.36","22.40","22.47","22.50","26.36"],"run":["10.8","10.9","10.10","10.11","10.12","10.14","10.15","11.7","11.11","13.1","13.24","15.4","15.38","19.6","22.15","22.21","22.26","22.35","22.36","22.40","22.45","22.47","22.50","26.36"],"code":["10.8","10.9","10.10","10.12","10.14","10.15","11.1","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.1","13.15","13.24","13.25","13.27","15.4","15.38","19.6","22.5","22.12","22.14","22.15","22.16","22.18","22.21","22.25","22.26","22.35","22.36","22.40","22.43","22.45","22.47","22.48","22.50","26.36"],"switch":["10.10","15.11","15.19"],"visibility":["10.10"],"active":["10.11"],"list":["10.11","11.6"],"cues":["10.11"],"full":["11.6"],"manually":["12.0"],"trigger":["12.0"],"data":["12.42","12.58","20.10"],"through":["12.42","12.43","22.26"],"of":["12.45","20.3","22.1"],"partially":["12.46"],"media":["12.47","12.49"],"resource":["12.48"],"type":["12.48","24.13"],"loaded":["12.50"],"paused":["12.51","14.0"],"pause":["12.53"],"or":["12.53"],"delay":["12.53"],"browser":["12.54"],"has":["12.55","12.59"],"skipping":["12.56","12.57"],"operation":["12.56","12.57"],"but":["12.58"],"due":["12.62"],"names":["13.0"],"are":["13.0"],"in":["13.0"],"devices":["13.20"],"a":["13.20","14.0","15.15"],"tap":["13.20"],"toggles":["13.20"],"i":["14.0","24.6"],"want":["14.0","22.10"],"write":["14.0"],"that":["14.0"],"displays":["14.0"],"an":["14.0"],"image":["14.0"],"advertisement":["14.0"],"t":["15.11"],"and":["15.11"],"note":["15.15"],"some":["15.15"],"videos":["15.15"],"do":["15.15"],"not":["15.15"],"have":["15.15"],"resize":["15.30"],"class":["15.38"],"name":["15.38"],"480p":["15.41"],"object":["16.1","18.1","22.11"],"triggered":["17.1"],"after":["17.1"],"is":["17.1"],"poster":["18.4"],"step":["19.6","24.13"],"unpkg":["20.2","20.11","23.2","24.3"],"depends":["20.3"],"get":["20.4","23.4"],"instance":["20.4","22.40"],"getinstance":["20.4"],"import":["20.6","21.0"],"useref":["20.8","23.8"],"export":["20.10"],"return":["20.10"],"https":["20.11"],"cdn":["20.11","23.11"],"npm":["20.11","23.11"],"dist":["20.11","23.11"],"com":["20.11","24.3"],"plugin":["20.12"],"danmuku":["20.12"],"doctype":["20.12","23.12"],"global":["20.13"],"variable":["20.13"],"head":["20.13"],"title":["20.13"],"demo":["20.13","23.13"],"meta":["20.13","23.13"],"you":["21.0","22.10"],"need":["21.0","22.1"],"required":["21.0"],"change":["21.4","25.4"],"initialize":["22.1"],"size":["22.1"],"like":["22.1"],"css":["22.1","22.11","26.1"],"this":["22.4","26.4"],"equivalent":["22.4"],"will":["22.7"],"cache":["22.7"],"muted":["22.10"],"if":["22.10","24.6"],"similar":["22.11"],"s":["22.11"],"fit":["22.11"],"increase":["22.19"],"volume":["22.19","23.9"],"decrease":["22.19"],"fast":["22.19"],"forward":["22.19"],"rewind":["22.19"],"opacity":["22.28"],"left":["22.31","26.31"],"something":["22.34","26.34"],"dosomething":["22.34","26.34"],"onvttload":["22.36"],"modify":["22.36"],"text":["22.36","24.6","24.12"],"loading":["22.38","26.38"],"address":["22.40"],"current":["22.40"],"modifying":["22.42"],"existing":["22.42"],"because":["22.46"],"player":["22.46"],"uses":["22.46"],"as":["22.46"],"key":["22.46"],"dimensions":["22.47"],"d":["23.6"],"选项":["23.10"],"lang":["23.12","25.2","25.3"],"charset":["23.13"],"utf":["23.13"],"默认":["24.4"],"顶部":["24.4"],"底部":["24.4"],"是否开启热力图":["24.5"],"当播放器宽度小于此值时":["24.5"],"弹幕发射器置于播放器底部":["24.5"],"points":["24.5"],"热力图数据":["24.5"],"filter":["24.5"],"弹幕载入前的过滤器":["24.5"],"只支持返回布尔值":["24.5"],"beforeemit":["24.5"],"弹幕发送前的过滤器":["24.5"],"支持返回":["24.5"],"你可以对弹幕做合法校验":["24.6"],"或者做存库处理":["24.6"],"当返回true后才表示把弹幕加入到弹幕队列":["24.6"],"async":["24.6"],"const":["24.6"],"isdirty":["24.6"],"fuck":["24.6"],"test":["24.6"],"plugins":["24.10"],"artplayerplugindanmuku":["24.10"],"xml":["24.11","24.12"],"隐藏弹幕":["24.11"],"发送弹幕":["24.12"],"弹幕大小":["24.13"],"input":["24.13"],"min":["24.13"],"max":["24.13"],"重新加载当前弹幕库":["24.14"],"切换":["24.14"],"error":["24.18"],"加载错误":["24.18"],"config":["24.18"],"配置变化":["24.18"],"外":["25.0"],"不再捆绑其它多国语言":["25.0"],"需要自行导入需要的语言":["25.0"],"language":["25.4"],"您可能需要初始化容器元素的大小":["26.1"],"如":["26.1"],"等同于":["26.4"],"document":["26.26"],"queryselector":["26.26"],"menu":["26.30"],"control":["26.31"],"文本的函数":["26.36"],"修改现有的语言":["26.42"],"id":["26.46"]},{"0":["5.11","20.5","20.9"],"1":["9.8","13.25","19.8","24.13"],"2":["13.26"],"3":["22.1"],"4":["22.15","22.21","22.36","22.40","22.43","22.45","22.47","22.50"],"5":["9.8","13.23","19.8","20.9","23.9"],"6":["15.38"],"7":["15.4","22.26"],"8":["12.0","20.13","22.40","23.12"],"9":["26.28"],"10":["9.8","13.12","13.14","13.27","19.8"],"11":["22.42","26.42"],"12":["22.36","26.36"],"20":["13.11"],"22":["9.2","9.6","9.7","19.2","19.5","19.7"],"25":["24.13"],"32":["0.13","10.13"],"60":["22.33","26.33"],"120":["26.33"],"150":["9.3","19.3"],"200":["24.5"],"404":["2.11","12.11"],"500":["13.21"],"1000":["22.2"],"2000":["13.24"],"3000":["5.11","13.15"],"5000":["13.4","13.13","13.16"],"二级属性":["0.0"],"mp4":["0.1","0.11","0.12","0.14","2.1","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.19","2.21","2.23","2.25","2.26","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.29","3.30","5.1","5.2","5.3","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.16","5.17","5.18","5.20","5.24","5.27","5.28","5.32","5.33","5.34","5.37","5.43","9.1","9.6","10.8","10.9","10.10","10.15","12.2","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.30","12.39","12.41","13.30","15.1","15.2","15.3","15.7","15.8","15.9","15.10","15.12","15.13","15.17","15.18","15.20","15.24","15.27","15.28","15.29","15.31","15.32","15.33","15.34","15.42","15.43","19.6","20.5","22.17","22.32","22.33","22.49","23.5","24.15","24.16","25.1","26.7","26.24","26.32","26.35","26.49"],"console":["0.1","0.3","0.5","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.2","5.8","5.13","5.14","5.15","5.22","5.26","5.27","5.28","5.29","5.31","5.32","5.33","5.40","7.3","8.2","8.3","10.3","10.16","13.2","15.26","15.31","15.37","15.40","17.3","18.2","18.3","22.28","22.30","22.31","26.28","26.29","26.30"],"info":["0.1","0.3","0.5","1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.12","5.8","5.13","5.15","5.22","5.26","5.28","5.29","5.31","5.32","5.33","7.3","8.2","8.3","10.3","10.5","10.16","15.26","15.31","15.37","17.3","18.2","18.3","22.28","22.30","26.28","26.29","26.30"],"warning":["0.2","1.6","5.11","10.1","10.5","10.6","15.21","15.37","21.0","22.2","22.4","22.17","22.19","22.39","23.3","23.4","26.10","26.39","26.46","26.49"],"提示":["0.2","5.11","23.3","26.46"],"为了方便区别":["0.2"],"元素和普通对象":["0.2"],"播放器里的所有":["0.2"],"click":["0.3","5.19","5.21","6.1","8.1","8.2","8.3","10.3","15.37","16.1","18.1","18.2","18.3","22.28","22.31","24.10","24.11","26.28","26.30","26.31"],"event":["0.3","16.1","18.1","24.11"],"你可以修改":["0.4"],"即可":["0.4"],"zh":["0.6"],"cn":["0.6","21.4","25.4"],"your":["0.6","10.6","20.3","21.3","21.4","22.3","25.3","25.4","26.3"],"ready":["0.7","0.8","0.11","0.12","0.13","0.14","0.15","2.6","2.18","2.22","2.24","5.8","5.10","5.12","5.13","5.14","5.15","5.17","5.18","5.22","5.26","5.27","5.28","5.29","5.30","5.31","5.32","5.33","5.41","5.42","6.5","8.5","9.9","10.7","10.9","10.10","12.2","12.18","12.22","12.24","15.8","15.10","15.13","15.22","15.26","15.28","15.29","15.31","15.32","15.33","15.40","15.41","15.42","16.5","18.5","19.9"],"html":["0.8","0.9","0.10","5.19","5.21","24.10"],"some":["0.8","0.9","0.10","15.37"],"text":["0.8","0.9","0.10","17.1"],"position":["0.9","5.21","5.34","7.1","8.4","14.0","17.1","18.4","24.10"],"video":["0.11","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.5","3.6","3.7","3.28","3.29","3.30","5.1","5.5","5.6","5.7","5.9","5.14","5.16","5.17","5.18","5.20","5.23","5.24","5.25","5.27","5.34","5.37","5.43","9.1","10.8","10.9","10.10","10.15","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.38","12.39","12.40","12.41","13.5","15.20","15.27","15.28","15.29","15.33","15.34","15.43","19.6","20.5","22.17","22.24","22.32","22.33","22.35","22.41","22.49","23.5","24.7","24.16","25.1","26.7","26.17","26.24","26.32","26.35","26.49"],"on":["0.11","0.12","0.13","0.14","0.15","2.6","2.11","2.12","2.18","2.24","5.7","5.8","5.9","5.10","5.12","5.13","5.14","5.15","5.17","5.18","5.20","5.22","5.26","5.27","5.28","5.29","5.31","5.32","5.33","5.41","5.42","6.4","6.5","7.4","10.7","10.9","10.10","12.2","12.6","12.18","12.22","12.24","15.7","15.8","15.10","15.12","15.13","15.22","15.26","15.27","15.28","15.29","15.31","15.32","15.33","15.41","15.42","16.4","16.5","17.4","22.4"],"subtitleoffset":["0.15"],"return":["0.16","9.3","9.4","10.16","15.11","19.3","19.4","24.9","24.12"],"name":["0.16","10.16"],"something":["0.16"],"dosomething":["0.16"],"一级属性":["1.0","5.0"],"app":["1.1","3.3","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.22","3.23","3.28","3.29","3.33","5.4","5.5","5.6","5.23","5.35","5.36","5.38","5.39","10.8","10.9","10.10","10.12","10.14","10.15","12.1","12.3","12.4","12.5","12.11","12.14","12.32","12.33","12.34","12.35","12.36","12.37","12.38","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","15.5","15.6","15.14","15.16","15.17","15.18","15.23","15.24","15.25","15.35","15.36","15.39","19.1","19.6","20.13","21.1","22.9","22.13","22.24","22.26","22.32","22.35","22.36","22.37","22.41","24.8","26.5","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.27","26.35","26.36","26.37","26.40","26.41","26.43","26.44","26.45","26.47","26.48","26.50"],"url":["1.1","3.6","3.7","3.8","3.9","3.10","3.17","3.22","3.28","3.29","5.4","5.5","5.6","5.23","5.25","5.35","5.36","5.37","5.38","5.39","10.8","10.9","10.10","10.12","10.14","10.15","12.1","12.3","12.4","12.5","12.9","12.11","12.12","12.13","12.14","12.15","12.19","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.28","13.29","13.30","15.5","15.6","15.12","15.14","15.16","15.17","15.18","15.20","15.23","15.24","15.25","15.35","15.36","15.39","19.1","19.6","21.1","22.24","22.41","23.5","24.7","24.8","24.16","26.3","26.5","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.24","26.25","26.37","26.41","26.44","26.45","26.50"],"assets":["1.1","2.1","2.3","2.4","2.14","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","5.1","5.4","5.5","5.6","5.16","5.23","5.25","5.35","5.36","5.37","5.38","5.39","10.8","10.9","10.10","10.12","10.14","10.15","12.1","12.3","12.4","12.5","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.6","13.7","13.28","13.29","13.30","15.1","15.3","15.5","15.6","15.7","15.8","15.9","15.10","15.12","15.14","15.16","15.17","15.18","15.20","15.23","15.24","15.25","15.27","15.28","15.33","19.1","19.6","21.1","22.24","22.32","22.35","22.41","22.49","24.7","24.8","24.16","26.5","26.7","26.17","26.24","26.35","26.36","26.37","26.41"],"全部工具函数请参考以下地址":["1.6"],"js":["1.11","10.11","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.1","13.2","13.24","15.38","22.11","22.21","22.26","22.36","22.40","22.47","22.50"],"emit":["2.0","12.0"],"focus":["2.0","12.0"],"移除事件":["2.0"],"sample":["2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.19","2.27","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","3.5","3.6","3.7","3.8","3.9","3.10","3.17","3.28","3.29","3.30","5.1","5.5","5.6","5.7","5.9","5.16","5.23","5.24","5.25","5.34","5.35","5.36","5.37","5.38","9.1","10.8","10.9","10.10","10.12","10.14","10.15","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.19","12.21","12.23","12.25","12.26","12.27","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.5","13.29","13.30","15.1","15.3","15.7","15.8","15.9","15.10","15.12","15.13","15.14","15.17","15.18","15.20","15.24","15.27","15.28","15.29","15.32","15.33","15.34","15.43","19.1","19.6","21.1","22.24","22.32","22.35","22.41","22.49","24.7","24.16","25.1","26.5","26.7","26.17","26.24","26.35","26.36","26.37","26.41"],"true":["2.16","2.17","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.39","3.30","5.2","5.3","5.20","6.2","6.4","6.5","9.1","9.6","10.15","12.17","12.20","12.28","13.1","13.31","13.33","15.2","15.20","16.2","16.4","16.5","19.6","22.17","24.16","26.10","26.32","26.46"],"setting":["2.17","2.20","2.28","3.30","9.1","9.6","12.20","13.30","19.6"],"fullscreen":["2.22"],"srt":["2.28","2.29","2.30","2.31","12.31"],"并调用":["2.46"],"但数据意外未出现":["2.58"],"属性名字全部都是大写的形式":["3.0"],"未来容易发生变动":["3.0"],"new":["3.1","3.4","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","10.8","10.10","10.11","10.12","10.14","11.1","13.3","13.4","13.6","13.7","13.10","13.11","13.12","13.13","13.18","13.19","13.21","13.22","13.23","13.26","13.28","13.31","13.32","13.33","15.4","15.35","15.36","15.38","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.27","22.34","22.35","22.36","22.37","22.40","22.43","22.44","22.45","22.47","22.48","22.50","23.9","26.6","26.11","26.34","26.36","26.40"],"container":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.28","3.31","3.32","3.33","10.8","10.9","10.10","10.11","10.12","10.14","10.15","12.1","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","15.4","15.5","15.6","15.14","15.16","15.23","15.25","15.35","15.36","15.39","19.1","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.22","22.23","22.25","22.26","22.27","22.35","22.36","22.37","22.43","22.44","22.48","22.50","23.3","23.10","24.8","26.3","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.27","26.35","26.36","26.40","26.43","26.44","26.45","26.47","26.48","26.50"],"log":["3.2","5.40","15.40"],"art":["3.14","3.15","3.16","3.19","3.20","3.25","3.26","3.31","10.8","10.10","10.11","10.12","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.22","13.23","13.25","13.26","13.27","13.28","13.31","13.32","13.33","15.4","15.38","20.9","22.3","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.35","22.36","22.37","22.43","22.44","22.45","22.47","22.48","22.50","23.9","26.11","26.26","26.36"],"show":["4.0","6.2","6.3","6.4","14.0","16.2","16.3","22.28","22.30"],"block":["4.0","14.0"],"hide":["4.0","14.0"],"controls":["4.0","5.34","14.0","15.34","24.10"],"tooltip":["4.0","7.1","9.7","19.7","26.31"],"muted":["5.2","5.3","5.24","15.2","15.3","26.10"],"seek":["5.10","5.12"],"t":["5.11"],"right":["5.19","5.21","8.3","8.4","14.0","17.1","18.3","18.4","24.10","26.28"],"switch":["5.19"],"function":["5.19","5.21","6.1","8.1","8.2","8.3","16.1","18.1","18.2","18.3","22.28","22.31","24.9","24.11","24.13","26.28","26.30"],"theme":["5.40","15.40"],"settimeout":["5.41","6.5","8.5","9.9","10.13","15.41","16.5","18.5","19.9","26.2"],"subtitle":["5.43","12.29","12.30"],"object":["6.1","8.1"],"组件样式对象":["6.1","8.1"],"false":["6.2","6.3","6.4","9.5","13.18","13.19","13.32","16.2","16.3","16.4","19.5","22.30","24.6"],"update":["6.5","8.5","9.9","16.5","19.9"],"组件挂载后触发":["7.1"],"组件的提示文本":["7.1"],"yellow":["7.2","17.2"],"02":["7.2","17.2"],"onselect":["7.2","17.2"],"item":["7.2","9.5","17.2"],"dom":["7.2","17.2"],"args":["7.3","8.2","8.3","17.3","18.2","18.3","22.28","22.31","26.28","26.30"],"mounted":["7.3","8.2","8.3","17.3","18.2","18.3","24.13"],"style":["7.4","17.4","20.5","22.31","23.5","24.13","26.31"],"color":["7.4","17.4","22.31","24.4","26.31"],"red":["7.4","17.4"],"control":["7.5","17.1","17.5"],"by":["7.5","8.5","9.9","17.5","18.5","19.9","22.10"],"absolute":["8.4","14.0","18.4"],"top":["8.4","14.0","18.4"],"50px":["8.4","18.4"],"the":["8.5","9.9","18.5","19.9","22.10"],"button":["9.2"],"img":["9.2","9.6","9.7","19.2","19.5","19.7"],"height":["9.2","9.6","19.2","19.5","20.5","22.1","23.5","26.1"],"src":["9.2","9.5","14.0","19.2","19.5","22.38","26.38"],"quality":["9.3","19.3"],"1080p":["9.3","19.3"],"state":["9.5","22.38","24.6","26.38"],"svg":["9.5","9.8","19.5","19.8"],"settings":["9.6","10.4","19.2","19.6"],"slider":["9.6"],"5x":["9.6","9.7","19.6","19.7"],"width":["9.6","9.7","19.5","19.7","20.5","22.1","23.5","26.1"],"icon":["9.7","19.7"],"range":["9.8","19.8"],"instance":["10.0","23.4"],"which":["10.0","11.0","15.0"],"reminder":["10.1"],"if":["10.1","10.4","15.37","20.11","22.46","24.11","24.12"],"you":["10.1","10.4","15.30","15.37"],"directly":["10.1"],"and":["10.2","10.4","12.46","17.1"],"plain":["10.2"],"objects":["10.2"],"in":["10.2"],"are":["10.2","15.15"],"mouseenter":["10.3"],"instances":["10.4"],"share":["10.4"],"same":["10.4","15.11"],"localstorage":["10.4"],"want":["10.4"],"different":["10.4"],"players":["10.4"],"use":["10.4","22.1"],"loading":["10.5","12.54"],"this":["10.5","22.39"],"using":["10.6"],"can":["10.6","22.39"],"only":["10.6","22.39"],"var":["10.8","10.10","10.11","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.38","22.5","22.6","22.8","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.26","22.34","22.36","22.40","22.43","22.44","22.45","22.47","22.48","22.50","26.11","26.34","26.36"],"artplayer":["10.8","10.10","10.11","10.12","10.14","11.1","13.1","13.24","15.4","15.5","15.14","15.16","15.35","15.36","15.38","15.39","22.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.22","22.23","22.25","22.27","22.34","22.35","22.36","22.37","22.43","22.44","22.45","22.48","22.50","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.27","26.34","26.36","26.40","26.43","26.47","26.48","26.50"],"code":["10.11","22.11"],"flip":["10.15"],"playbackrate":["10.15"],"aspectratio":["10.15"],"constructor":["11.0"],"please":["11.6"],"refer":["11.6"],"remove":["12.0"],"end":["12.42","12.43"],"without":["12.42","12.43"],"duration":["12.45"],"is":["12.46","12.48","12.54","15.30"],"sent":["12.46"],"reached":["12.47"],"not":["12.48","15.30","20.4"],"has":["12.49","12.56","12.57"],"due":["12.53","15.19","15.21","22.17"],"changed":["12.55"],"unexpectedly":["12.58"],"been":["12.59"],"currenttime":["12.60"],"attribute":["12.60"],"temporarily":["12.62"],"uppercase":["13.0"],"subject":["13.0"],"change":["13.0"],"defaults":["13.20"],"display":["14.0","24.13"],"none":["14.0"],"20px":["14.0"],"have":["15.11","20.3"],"functionality":["15.11"],"however":["15.11"],"method":["15.11"],"a":["15.11","20.3","21.0"],"promise":["15.11","24.5"],"such":["15.15"],"as":["15.15"],"that":["15.15"],"being":["15.15"],"live":["15.15"],"streamed":["15.15"],"or":["15.15","22.1"],"note":["15.19","22.2"],"to":["15.19","15.21","20.5","23.5"],"browser":["15.19","15.21","22.17"],"security":["15.19","15.21"],"mechanisms":["15.19","15.21"],"before":["15.19"],"triggering":["15.19"],"jpg":["15.22"],"json":["15.26"],"stringify":["15.26"],"but":["15.30","22.46"],"do":["15.30"],"know":["15.30"],"exact":["15.30"],"property":["15.30"],"tip":["15.37","20.11","22.19"],"need":["15.37","20.11"],"left":["17.1"],"pnpm":["20.1","23.1","24.2"],"com":["20.2","23.2","23.11"],"so":["20.3"],"must":["20.3"],"responsive":["20.4"],"modifying":["20.4"],"path":["20.5","23.5"],"600px":["20.5","23.5"],"400px":["20.5","22.1","26.1"],"margin":["20.5"],"60px":["20.5"],"auto":["20.5"],"d":["20.6"],"null":["20.8","23.8"],"volume":["20.9"],"options":["20.10"],"option":["20.10","23.10"],"lang":["20.12","21.2","21.3"],"en":["20.12","23.12"],"head":["20.12","23.12"],"meta":["20.12","23.12"],"charset":["20.12","20.13","23.12"],"utf":["20.12","20.13","23.12"],"body":["20.13","23.13"],"div":["20.13","22.11","23.13"],"class":["20.13","23.13"],"own":["21.0"],"when":["21.0","22.7"],"cannot":["21.0"],"be":["21.0"],"matched":["21.0"],"script":["21.2","25.2"],"i18n":["21.3","25.0","25.3"],"play":["21.4","22.19","25.4"],"300px":["22.1","26.1"],"support":["22.2"],"for":["22.2"],"three":["22.2"],"file":["22.2"],"formats":["22.2"],"size":["22.7"],"last":["22.7"],"upon":["22.10"],"entering":["22.10"],"cover":["22.11"],"classname":["22.11"],"run":["22.11"],"space":["22.19"],"toggle":["22.19"],"pause":["22.19"],"these":["22.19"],"document":["22.26"],"queryselector":["22.26"],"setting02":["22.29","26.29"],"green":["22.31","26.31"],"one":["22.33","26.33"],"more":["22.33","26.33"],"chance":["22.33","26.33"],"gif":["22.38","26.38"],"recognition":["22.39"],"extensions":["22.39"],"player":["22.39"],"parse":["22.39"],"cache":["22.46"],"progress":["22.46"],"of":["22.46"],"播放器的尺寸依赖于容器":["23.3"],"的尺寸":["23.3"],"getinstance":["23.4"],"ts":["23.6"],"types":["23.10"],"const":["23.10"],"unpkg":["23.11"],"title":["23.12"],"ffffff":["24.4"],"弹幕颜色":["24.4"],"默认为白色":["24.4"],"beforevisible":["24.5"],"弹幕显示前的过滤器":["24.5"],"visible":["24.5"],"弹幕层是否可见":["24.5"],"emitter":["24.5"],"是否开启弹幕发射器":["24.5"],"maxlength":["24.5"],"弹幕输入框最大长度":["24.5"],"await":["24.6"],"这里是所有弹幕的过滤器":["24.6"],"包含来自服务端的和来自用户输入的":["24.6"],"plugins":["24.9","24.15","24.16","24.17"],"artplayerplugindanmuku":["24.9","24.15","24.16","24.17"],"xml":["24.10"],"隐藏弹幕":["24.10"],"prompt":["24.12"],"请输入弹幕文本":["24.12"],"弹幕测试文本":["24.12"],"trim":["24.12"],"value":["24.13"],"flex":["24.13"],"alignitems":["24.13"],"center":["24.13"],"切换到新的弹幕库":["24.14"],"config":["24.14"],"v2":["24.14"],"fullscreenweb":["24.16"],"stop":["24.18"],"弹幕停止":["24.18"],"start":["24.18"],"弹幕开始":["24.18"],"当无法匹配到语言时":["25.0"],"会默认显示英文":["25.0"],"或者使用":["26.1"],"aspect":["26.1"],"热键":["26.19"],"描述":["26.19"],"增加音量":["26.19"],"降低音量":["26.19"],"innerhtml":["26.26"],"opacity":["26.28"],"sd":["26.32"],"ploading":["26.38"],"后缀的识别":["26.39"],"播放器只能解析这种后缀":["26.39"],"因为播放器默认使用":["26.46"]},{"0":["23.5"],"2":["5.28"],"4":["22.11"],"5":["5.7","5.8","5.14","15.7","26.7"],"8":["2.0","20.12"],"9":["5.29","22.1"],"10":["5.10","5.12","15.10","15.12"],"16":["5.29","15.29","22.1","24.12","26.1"],"22":["19.6"],"60":["22.35","24.5","26.35"],"120":["22.33"],"180":["22.33","26.33"],"200":["24.6"],"240":["26.33"],"360":["9.3"],"720":["9.3","19.3"],"1000":["0.8","0.9","0.10","0.15","10.8","10.9","24.5","26.2"],"1080":["9.3","19.3"],"5000":["0.13","10.13"],"比较少用":["0.0"],"warning":["0.1","0.5","0.6","0.7","0.8","5.15","5.19","5.21","5.26","5.30","5.37","10.3","10.7","10.9","10.13","15.26","20.5","20.13","22.28","22.29","22.30","22.31","22.38","22.41","22.49","23.13","26.2","26.4","26.7","26.17","26.19","26.30","26.31","26.38","26.41"],"提示":["0.1","5.15","5.19","5.21","5.30","26.2","26.7","26.10","26.17"],"假如直接修改这个":["0.1"],"元素都是以":["0.2"],"开头命名的":["0.2"],"这是所有":["0.2"],"元素的定义":["0.2"],"mouseenter":["0.3"],"mouseleave":["0.3","10.3"],"loading":["0.5","12.49"],"这是所有图标的定义":["0.5"],"types":["0.5","1.6","25.0","26.49"],"使用":["0.6","24.9"],"只能更新实例化之后的":["0.6"],"to":["0.7","11.6","22.2","22.30","22.31"],"play":["0.7","4.0","5.2","10.7","15.2","21.3","22.2","25.3"],"如果想马上隐藏":["0.7"],"settimeout":["0.8","0.9","0.10","0.12","0.13","0.14","0.15","5.2","5.3","5.7","5.10","5.12","5.20","6.4","7.4","8.4","9.8","10.8","10.9","10.10","10.15","15.2","15.7","15.10","15.12","16.4","17.4","18.4","19.8"],"false":["0.8","0.9","0.10","0.14","0.15","10.8","10.9","10.10","10.15","22.28","24.4","26.28","26.30"],"left":["0.9","7.1","10.9"],"true":["0.10","0.12","2.19","3.5","3.6","3.7","3.28","3.29","5.1","5.13","5.24","5.31","6.3","10.10","12.16","12.19","12.21","12.22","12.23","12.24","12.25","12.26","12.39","13.5","13.6","13.7","13.28","13.29","13.30","15.1","15.3","15.24","15.31","16.3","19.1","22.24","22.32","26.17","26.24"],"srt":["0.11","5.43","12.28","12.29","12.30","15.43"],"on":["0.16","2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.13","2.14","2.15","2.16","2.17","2.19","2.20","2.21","2.23","2.25","2.26","2.27","2.28","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.8","3.9","3.10","3.17","5.1","5.2","5.3","5.4","5.5","5.6","5.16","5.23","5.24","5.25","5.35","5.36","5.43","8.4","9.8","10.8","10.11","10.12","10.14","10.15","12.1","12.3","12.4","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.17","12.19","12.20","12.21","12.23","12.25","12.26","12.27","12.28","12.29","12.30","12.31","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.8","13.9","13.10","13.17","15.1","15.2","15.3","15.5","15.6","15.9","15.14","15.16","15.17","15.18","15.20","15.21","15.23","15.24","15.25","15.35","15.36","15.43","18.4","19.8","24.15","24.17","26.4"],"非常少使用":["1.0"],"sample":["1.1","3.1","3.3","3.4","3.11","3.12","3.13","3.18","3.21","3.22","3.23","3.24","3.27","3.31","3.32","3.33","5.4","5.39","10.11","11.1","12.1","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.17","13.21","13.22","13.28","13.33","15.4","15.5","15.6","15.16","15.23","15.25","15.35","15.36","15.38","15.39","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.22","22.23","22.25","22.27","22.34","22.36","22.37","22.40","22.43","22.44","22.45","22.48","22.50","23.10","24.8","26.6","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.27","26.34","26.40","26.43","26.44","26.45","26.47","26.48","26.50"],"video":["1.1","3.8","3.9","3.10","3.11","3.12","3.13","3.17","3.21","3.22","3.23","3.24","3.31","3.33","5.4","5.38","10.11","10.12","10.14","11.1","12.1","12.37","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","15.4","15.23","15.38","19.1","20.10","21.1","22.9","22.27","23.10","24.8","26.5","26.6","26.8","26.9","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.27","26.36","26.37","26.41","26.43","26.44","26.45","26.47","26.48"],"mp4":["1.1","3.8","3.9","3.10","3.17","3.22","3.28","5.4","5.5","5.6","5.23","5.25","5.35","5.36","5.38","5.39","10.11","10.12","10.14","12.1","12.3","12.4","12.5","12.11","12.14","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.40","13.5","13.6","13.7","13.8","13.9","13.10","13.17","13.22","13.28","13.29","15.4","15.5","15.6","15.14","15.16","15.23","15.25","15.35","15.36","15.38","15.39","19.1","20.10","21.1","22.5","22.14","22.16","22.24","22.35","22.36","22.37","22.41","23.10","24.7","24.8","26.5","26.8","26.9","26.13","26.14","26.15","26.16","26.17","26.21","26.25","26.36","26.37","26.41","26.44","26.45","26.50"],"artplayer":["1.2","1.3","1.4","1.5","1.7","1.8","1.9","1.10","1.11","1.12","3.2","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","13.2","22.11","22.21","22.40","22.47"],"d":["1.6"],"info":["1.11","2.12","5.14","5.27","5.37","5.38","9.5","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","15.8","15.13","15.14","15.22","15.27","15.28","15.29","15.32","15.33","19.5","22.31","24.17","26.31"],"const":["2.0","5.17","5.18","9.5","12.0","15.17","15.18","19.5","20.10","24.13"],"onready":["2.0","12.0"],"console":["2.1","2.3","2.4","2.5","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","2.15","2.16","2.17","2.18","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.29","2.30","2.31","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.40","2.41","5.24","5.37","5.38","5.39","9.5","11.2","11.3","11.4","11.5","11.7","11.8","11.9","11.10","11.11","11.12","12.7","12.8","12.9","12.10","12.12","12.13","12.15","12.27","12.31","12.41","15.8","15.13","15.14","15.22","15.27","15.28","15.29","15.32","15.33","15.39","19.5","20.5","23.5","24.17","26.31"],"event":["2.5","2.7","2.8","2.9","2.10","2.12","2.13","2.22","2.41","5.37","9.2","9.5","12.5","12.7","12.8","12.9","12.10","12.12","12.13","12.22"],"reconnecttime":["2.11","12.11"],"state":["2.12","2.15","2.16","2.21","2.23","2.24","2.25","2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","9.2","9.6","9.7","12.12","12.15","12.21","12.23","12.24","12.25","12.32","12.33","12.34","12.35","12.36","12.38","19.2","19.7"],"height":["2.18","9.7","19.6","19.7"],"datauri":["2.26","12.26"],"currenttime":["2.27","12.27"],"offset":["2.28"],"cues":["2.29","2.30","2.31","12.29","12.30","12.31"],"option":["2.31","12.31"],"load":["2.46","12.46"],"方法重新加载它":["2.46"],"基本上用不到":["3.0"],"app":["3.1","3.4","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.24","3.25","3.26","3.27","3.31","3.32","10.11","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.38","20.10","22.3","22.5","22.6","22.8","22.11","22.12","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.27","22.34","22.40","22.43","22.44","22.45","22.47","22.48","22.50","23.10","23.13","26.3","26.11","26.34"],"url":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.22","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.4","15.38","20.10","22.3","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.27","22.34","22.37","22.43","22.44","22.45","22.47","22.48","22.50","23.10","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.26","26.27","26.34","26.43","26.47","26.48"],"assets":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.22","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","10.11","11.1","13.3","13.4","13.8","13.9","13.10","13.11","13.12","13.13","13.17","13.21","13.22","13.23","13.31","13.32","13.33","15.4","15.35","15.36","15.38","15.39","20.10","22.5","22.6","22.8","22.9","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.21","22.22","22.23","22.25","22.27","22.34","22.36","22.37","22.40","22.43","22.44","22.45","22.47","22.48","22.50","23.10","26.3","26.6","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.21","26.22","26.23","26.25","26.26","26.27","26.34","26.40","26.43","26.44","26.45","26.47","26.48","26.50"],"loop":["3.5","3.6","3.7","13.5","13.6","13.7"],"flip":["3.5","3.6","3.7","13.5"],"dblclick":["3.17"],"setting":["3.28","3.29","12.17","12.28","13.28","13.29","19.1","24.13"],"playbackrate":["3.28","13.28"],"contextmenu":["3.28","3.29","3.30","13.29","13.30"],"aspectratio":["3.29","13.29"],"show":["3.29","3.30","9.8","13.30","19.8","24.11","24.18","26.28","26.30"],"click":["4.0","5.34","5.37","14.0","15.34"],"marginright":["4.0","14.0"],"比较常用":["5.0"],"muted":["5.1","15.1","15.24"],"ready":["5.2","5.3","5.5","5.6","5.7","5.9","5.16","5.20","5.23","5.24","5.25","6.4","7.4","8.4","9.8","10.8","10.11","10.12","10.14","10.15","12.0","12.6","15.2","15.3","15.7","15.9","15.12","15.14","15.16","15.17","15.18","15.20","15.24","15.27","16.4","17.4","18.4","19.8","24.17"],"seek":["5.7","15.7","15.10","15.12"],"switch":["5.11"],"和":["5.11","7.1","24.5"],"的功能是一样的":["5.11"],"只是":["5.11"],"有的视频是没有时长的":["5.15"],"async":["5.17","5.18","15.17","15.18"],"await":["5.17","5.18","15.17","15.18"],"t":["5.22"],"json":["5.26"],"stringify":["5.26"],"resize":["5.30","24.15"],"当你的容器只有宽度":["5.30"],"playsinline":["5.31","15.31","26.37"],"m3u8":["5.32","22.2","26.40"],"000":["5.33"],"right":["5.34","7.1","15.34"],"html":["5.34","10.8","10.9","10.10","15.34","20.1","23.1"],"green":["5.40","15.40"],"1080p":["5.41","15.41"],"png":["5.42","15.42","22.35","22.38","26.35","26.38"],"组件点击事件":["6.1","8.1"],"mounted":["6.1","8.1","16.1","18.1","22.28","26.28"],"组件挂载后触发":["6.1","8.1"],"get":["6.2","6.3","7.2","7.3","8.2","8.3","16.2","16.3","17.2","17.3","18.2","18.3"],"the":["6.2","6.3","6.4","6.5","7.2","7.3","7.4","8.2","8.3","8.4","9.8","16.2","16.3","16.4","16.5","17.2","17.3","17.4","18.2","18.3","18.4","19.8","22.19","22.30"],"element":["6.2","6.3","7.2","7.3","8.2","8.3","16.2","16.3","17.2","17.3","18.2","18.3"],"of":["6.2","6.3","7.2","7.3","8.2","8.3","12.53","15.37","16.2","16.3","17.2","17.3","18.2","18.3","22.38"],"by":["6.2","6.3","6.4","6.5","7.2","7.4","8.4","16.2","16.3","16.4","16.5","17.2","17.4","18.4","21.0"],"delete":["6.4","7.4","8.4","9.8"],"控制控制器出现的左右位置":["7.1"],"selector":["7.1","17.1"],"array":["7.1","17.1"],"return":["7.2","17.2"],"control":["7.2","7.3","7.4","17.2","17.3","17.4"],"200px":["8.5","18.5"],"svg":["9.2","9.6","9.7","19.2","19.6","19.7"],"item":["9.2","9.6","19.5"],"720p":["9.3","19.3"],"360p":["9.3","19.3"],"nextstate":["9.5","19.5"],"src":["9.6","9.7","19.6","19.7"],"pip":["9.9","19.9"],"mode":["9.9","19.9"],"close":["9.9","19.9"],"are":["10.0","11.0","15.0"],"less":["10.0"],"commonly":["10.0","15.0"],"modify":["10.1","10.4","20.11","20.13"],"this":["10.1"],"object":["10.1"],"named":["10.2"],"starting":["10.2"],"with":["10.2","20.12","23.12"],"a":["10.2","12.48","15.21"],"here":["10.2"],"is":["10.2","10.5","16.1","18.1","22.7","22.46"],"definition":["10.2","10.5","22.38"],"if":["10.3","10.6","22.2","22.4","22.17"],"you":["10.3","10.6","20.3","22.46"],"need":["10.3","20.13","22.2","22.46"],"some":["10.3","10.8","10.9","10.10"],"only":["10.3","10.13","15.37","22.19"],"exist":["10.3","15.37"],"during":["10.3","15.37"],"lifecycle":["10.3"],"can":["10.4","15.11","20.3"],"accordingly":["10.4"],"after":["10.6","10.13","16.1","18.1","22.19"],"instantiation":["10.6"],"want":["10.6"],"before":["10.6","20.13"],"please":["10.6","20.11","22.29","22.30"],"immediately":["10.7"],"hide":["10.7","24.18"],"text":["10.8","10.9","10.10","24.7","24.9"],"position":["10.9","15.34"],"shortcut":["10.13"],"keys":["10.13"],"will":["10.13","20.4","22.19"],"work":["10.13","22.19"],"subtitleoffset":["10.15"],"something":["10.16"],"dosomething":["10.16"],"very":["11.0","15.30"],"rarely":["11.0"],"container":["11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","15.38","20.10","22.3","22.21","22.34","22.40","22.45","22.47","26.34"],"following":["11.6","20.11"],"address":["11.6","22.17"],"off":["12.0"],"fullscreen":["12.22"],"having":["12.42"],"stop":["12.42"],"for":["12.42","12.43","21.0","22.10","22.49"],"stopping":["12.43"],"content":["12.43"],"property":["12.45"],"changes":["12.45"],"method":["12.46"],"called":["12.46"],"end":["12.47"],"point":["12.47"],"supported":["12.48"],"finished":["12.49"],"lack":["12.53"],"resources":["12.54"],"completed":["12.56"],"started":["12.57"],"has":["12.58","12.60"],"not":["12.58"],"suspended":["12.59"],"missing":["12.62"],"future":["13.0"],"and":["13.0","20.11"],"new":["13.1","13.14","13.15","13.16","13.24","13.25","13.27","20.8","20.9","22.11","22.26","23.8","26.26"],"log":["13.2","20.5","23.5"],"art":["13.24","22.11","22.26"],"tooltip":["14.0"],"quite":["15.0"],"when":["15.11"],"it":["15.11","15.30","15.37","20.13"],"resolves":["15.11"],"indicates":["15.11"],"that":["15.11"],"played":["15.11"],"been":["15.15"],"fully":["15.15"],"decoded":["15.15"],"in":["15.15","20.4"],"which":["15.15"],"page":["15.19","22.10"],"must":["15.19","22.10"],"have":["15.19"],"had":["15.19"],"an":["15.19","17.1","22.4"],"user":["15.21"],"interaction":["15.21"],"e":["15.21"],"g":["15.21"],"useful":["15.30"],"as":["15.30","22.2","22.7"],"s":["15.30"],"lifespan":["15.37"],"triggered":["16.1","18.1"],"context":["16.4"],"controller":["17.1"],"objects":["17.1"],"selection":["17.1"],"list":["17.1"],"onselect":["17.1"],"img":["19.6"],"width":["19.6"],"tip":["20.3","20.9","23.3","23.9","23.11"],"find":["20.3"],"more":["20.3","22.41"],"examples":["20.3"],"at":["20.3"],"directly":["20.4"],"non":["20.5"],"responsive":["20.5"],"ts":["20.6"],"current":["20.8","23.8"],"complete":["20.9"],"typescript":["20.9","23.9"],"support":["20.11"],"even":["20.11"],"older":["20.11"],"configuration":["20.11","22.28","22.30","22.31"],"then":["20.11","22.46"],"title":["20.12"],"import":["20.12","23.12"],"map":["20.12","23.12"],"displayed":["21.0"],"default":["21.0"],"i18n":["21.0"],"usage":["21.0"],"lang":["21.1","25.1"],"window":["21.2","25.2"],"imported":["21.4","25.4"],"aspect":["22.1"],"ratio":["22.1","26.1"],"ogg":["22.2","26.2"],"webm":["22.2","26.2"],"other":["22.2"],"such":["22.2","22.7"],"or":["22.2"],"inside":["22.4"],"callback":["22.4"],"refers":["22.4"],"instance":["22.4"],"but":["22.4","22.39"],"arrow":["22.4"],"initialized":["22.7"],"next":["22.7"],"time":["22.7"],"refreshing":["22.7"],"be":["22.10"],"set":["22.10"],"var":["22.11"],"security":["22.17"],"mechanisms":["22.17"],"source":["22.17"],"player":["22.19"],"gains":["22.19"],"focus":["22.19"],"innerhtml":["22.26"],"component":["22.28","22.30","22.31"],"refer":["22.30","22.31"],"sd":["22.32"],"480p":["22.32","26.32"],"谁でもいいはずなのに":["22.33","26.33"],"夏の想い出がまわる":["22.33","26.33"],"all":["22.38"],"cannot":["22.39"],"zh":["22.42","26.42"],"cn":["22.42","26.42"],"same":["22.46"],"different":["22.46"],"reference":["22.49"],"syntax":["22.49"],"所以你的容器":["23.3"],"必须是有尺寸的":["23.3"],"以下链接可以看到更多的使用例子":["23.3"],"非响应式":["23.4"],"在":["23.4"],"400px":["23.5"],"margin":["23.5"],"60px":["23.5"],"auto":["23.5"],"全部":["23.9"],"定义":["23.9"],"volume":["23.10"],"假如你要兼容更古老的浏览器时":["23.11"],"请修改以下配置然后自行构建":["23.11"],"body":["23.12"],"border":["24.4"],"弹幕是否有描边":["24.4"],"默认为":["24.4"],"locktime":["24.5"],"输入框锁定时间":["24.5"],"theme":["24.5"],"dark":["24.5","24.16"],"弹幕主题":["24.5"],"支持":["24.5"],"length":["24.6"],"这是弹幕即将显示的时触发的函数":["24.6"],"当返回true后才表示可以马上发送到播放器里":["24.6"],"弹幕已经出现在播放器里":["24.6"],"你可以访问到弹幕的dom元素里":["24.6"],"plugins":["24.7","24.8"],"artplayerplugindanmuku":["24.7","24.8"],"promise":["24.9"],"resovle":["24.9"],"function":["24.10","26.31"],"target":["24.11"],"innertext":["24.11"],"else":["24.11"],"color":["24.12"],"math":["24.12"],"floor":["24.12"],"random":["24.12"],"0xffffff":["24.12"],"tostring":["24.12"],"queryselector":["24.13"],"addeventlistener":["24.13"],"追加":["24.14"],"追加新的弹幕库":["24.14"],"参数类型和option":["24.14"],"danmuku相同":["24.14"],"xml":["24.15","24.17"],"弹幕隐藏":["24.18"],"弹幕显示":["24.18"],"写法参考":["25.0","26.49"],"默认支持三种视频文件格式":["26.2"],"播放器会缓存最后一次音量的大小":["26.7"],"假如希望默认进入页面就能自动播放视频":["26.10"],"必需为":["26.10"],"视频快进":["26.19"],"视频快退":["26.19"],"space":["26.19"],"切换播放":["26.19"],"暂停":["26.19"],"subtitle":["26.24"],"组件配置":["26.30"],"args":["26.31"],"hd":["26.32"],"webkit":["26.37"],"全部图标的定义":["26.38"],"但无法解析这种后缀":["26.39"],"作为":["26.46"],"key":["26.46"],"来缓存播放进度的":["26.46"],"但假如你的同一个视频的":["26.46"]},{"0":["5.9","5.10","5.12","5.15","5.22","15.9","15.10","15.12","15.15","15.22","20.10","23.10"],"1":["5.43","9.7","15.43","19.7","24.7","24.9"],"2":["5.7","15.7","15.28"],"5":["5.5","5.6","9.7","15.5","15.6","15.8","15.14","19.7","20.10","23.10"],"9":["15.29","26.1"],"10":["5.42","9.7","15.42","19.7","22.35","26.35"],"60":["5.42","15.42"],"240":["22.33"],"300":["22.33","26.33"],"360":["19.3"],"404":["3.14","3.15","13.14","13.15"],"1000":["0.12","0.14","10.10","10.12","10.14","10.15"],"3000":["5.2","5.3","5.7","5.10","5.12","5.20","5.41","6.4","6.5","7.4","7.5","8.4","8.5","9.8","9.9","15.2","15.3","15.7","15.10","15.12","15.20","15.41","16.4","16.5","17.4","17.5","18.4","18.5","19.8","19.9"],"对象":["0.1"],"播放器不会马上做出响应":["0.1"],"types":["0.2","2.0","10.2","10.5","11.6","20.9","21.0","22.38","22.49","23.9","26.38"],"d":["0.2","0.5","2.0","10.2","10.5","11.6","12.0","21.0","22.38","22.49","25.0","26.38","26.49"],"ts":["0.2","0.5","1.6","2.0","10.2","10.5","11.6","12.0","21.0","22.38","22.49","25.0","26.38","26.49"],"warning":["0.3","0.9","0.10","0.13","0.15","2.0","10.8","10.10","10.15","12.0","22.1","22.35","22.42","23.5","26.1","26.28","26.29","26.35","26.42"],"提示":["0.3","0.13","5.26","5.37","23.13","26.1","26.4","26.19"],"假如你需要一些":["0.3","5.37"],"事件只存在于播放器的生命周期上时":["0.3","5.37"],"强烈建议使用这些函数":["0.3"],"以避免造成内存泄漏":["0.3","5.37"],"your":["0.4","5.16","10.4","15.16"],"假如想在实例化之前更新":["0.6"],"请使用基础选项的":["0.6"],"来更新":["0.6"],"的显示":["0.7"],"组件配置":["0.8","0.9","0.10","26.28","26.31"],"请参考以下地址":["0.8","0.9","0.10","0.15","26.28","26.29","26.30","26.31"],"component":["0.8","0.9","0.10","0.15","10.8","10.9","10.10","10.15","22.29","26.28","26.29","26.30","26.31"],"color":["0.11","10.11","22.36","26.36"],"red":["0.11","10.11"],"false":["0.12","5.20","9.9","10.12","10.14","15.20","19.9","22.44","26.44"],"只在播放器获得焦点后":["0.13","26.19"],"如点击了播放器后":["0.13","26.19"],"这些快捷键才会生效":["0.13","26.19"],"true":["0.14","3.11","3.12","3.13","3.21","3.22","3.23","3.24","5.23","10.12","10.14","13.11","13.12","13.13","13.21","13.22","13.23","13.24","15.13","15.23","22.8","22.9","22.11","22.12","22.13","22.14","22.15","22.16","22.18","22.20","22.22","22.23","22.25","22.26","22.37","22.43","22.45","22.47","22.48","24.12","26.8","26.9","26.11","26.12","26.13","26.14","26.15","26.16","26.18","26.20","26.22","26.23","26.25","26.26","26.37","26.43","26.45","26.47","26.48"],"设置面板":["0.15"],"html":["0.15","10.15","22.41","22.42","24.2","26.41","26.42"],"ready":["0.16","2.0","5.1","5.4","5.43","10.16","15.1","15.4","15.5","15.6","15.23","15.25","15.43"],"off":["2.0"],"全部事件请参考以下地址":["2.0"],"events":["2.0"],"info":["2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.13","2.14","2.15","2.16","2.17","2.18","2.19","2.20","2.21","2.22","2.23","2.24","2.25","2.26","2.27","2.28","2.29","2.30","2.31","5.17","5.18","5.24","5.35","5.36","5.39","9.2","9.6","12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","12.15","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.27","12.28","12.29","12.30","12.31","15.17","15.18","15.24","15.35","15.36","15.38","15.39","19.2","19.6"],"console":["2.2","2.6","2.19","2.28","2.39","3.8","3.9","3.10","3.17","5.17","5.18","5.35","5.36","9.2","9.6","12.1","12.2","12.3","12.4","12.5","12.6","12.11","12.14","12.16","12.17","12.18","12.19","12.20","12.21","12.22","12.23","12.24","12.25","12.26","12.28","12.29","12.30","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","13.8","13.9","13.10","13.17","15.17","15.18","15.24","15.35","15.36","15.38","19.2","19.6"],"log":["2.32","2.33","2.34","2.35","2.36","2.37","2.38","2.39","2.40","2.41","3.8","3.9","3.10","3.17","12.32","12.33","12.34","12.35","12.36","12.37","12.38","12.39","12.40","12.41","13.8","13.9","13.10","13.17"],"video":["3.1","3.3","3.4","3.16","3.18","3.19","3.20","3.25","3.26","3.27","3.32","13.3","13.4","13.11","13.12","13.13","13.16","13.18","13.19","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","22.3","22.6","22.8","22.11","22.12","22.18","22.20","22.21","22.22","22.23","22.25","22.26","22.34","22.43","22.48","26.3","26.11","26.26","26.34"],"mp4":["3.1","3.3","3.4","3.11","3.12","3.13","3.14","3.15","3.16","3.18","3.19","3.20","3.21","3.23","3.24","3.25","3.26","3.27","3.31","3.32","3.33","11.1","13.1","13.3","13.4","13.11","13.12","13.13","13.14","13.15","13.16","13.18","13.19","13.21","13.23","13.24","13.25","13.26","13.27","13.31","13.32","13.33","22.3","22.6","22.8","22.9","22.11","22.12","22.13","22.15","22.18","22.20","22.21","22.22","22.23","22.25","22.26","22.27","22.34","22.43","22.44","22.45","22.47","22.48","22.50","26.3","26.6","26.11","26.12","26.18","26.20","26.22","26.23","26.26","26.27","26.34","26.43","26.47","26.48"],"playbackrate":["3.5","3.6","3.7","13.5","13.6","13.7"],"aspectratio":["3.5","3.6","3.7","13.5","13.6","13.7"],"autoplayback":["3.11","3.12","3.13","13.11","13.12","13.13"],"sample":["3.14","3.15","3.16","3.19","3.20","3.25","3.26","13.1","13.3","13.4","13.14","13.15","13.16","13.18","13.19","13.23","13.24","13.25","13.26","13.27","13.31","13.32","22.3","22.11","22.21","22.26","22.47","26.3","26.26"],"autoorientation":["3.21","13.21"],"show":["3.22","3.28","13.22","13.28","13.29"],"fastforward":["3.23","3.24","13.23","13.24"],"fullscreenweb":["3.31","13.31"],"miniprogressbar":["3.33","13.33"],"pause":["4.0","14.0"],"layer":["4.0","14.0"],"png":["4.0","14.0"],"t":["5.9","5.10","5.12","15.9","15.10","15.12","15.22"],"方法会返回":["5.11"],"promise":["5.11"],"当":["5.11"],"resolve":["5.11"],"时表示新地址是可以播放":["5.11"],"reject":["5.11"],"时表示新地址加载错误":["5.11"],"例如直播中的视频或者没被解码完成的视频":["5.15"],"这个时候获取的时长会是":["5.15"],"name":["5.16"],"由于浏览器安全机制":["5.19","5.21","26.17"],"触发窗口全屏前":["5.19"],"页面必须先存在交互":["5.19","5.21"],"例如用户点击过页面":["5.19","5.21"],"触发画中画前":["5.21"],"尺寸和坐标信息是通过":["5.26"],"getboundingclientrect":["5.26","15.26"],"获取的":["5.26"],"但不知道具体高度时":["5.30"],"这个属性很有用":["5.30"],"它能自动计算出视频的高度":["5.30"],"但你需要确定设置这个属性的时机":["5.30"],"强烈建议使用该函数":["5.37"],"4k":["5.41","15.41"],"number":["5.42","15.42","24.13"],"column":["5.42","15.42"],"tooltip":["6.1","8.1","16.1","18.1"],"组件的提示文本":["6.1","8.1"],"remove":["6.4","7.4","8.4","9.8","16.4","17.4","18.4","19.8"],"选择列表的对象数组":["7.1"],"onselect":["7.1"],"选择列表的元素被点击时触发的函数":["7.1"],"by":["7.3","8.2","8.3","9.8","17.3","18.2","18.3","19.8"],"left":["8.5","18.5","22.2"],"return":["9.2","9.5","9.6","19.2","19.5","19.6"],"switchquality":["9.3","19.3"],"open":["9.5","19.5"],"event":["9.6"],"x":["9.6","19.6"],"range":["9.7","19.7"],"switch":["9.9","19.9"],"used":["10.0","11.0","15.0","22.4"],"will":["10.1","15.15","20.5","22.4"],"not":["10.1","13.0","20.5","22.4"],"respond":["10.1"],"immediately":["10.1"],"of":["10.3","10.7","12.0"],"it":["10.3","12.46","20.11","22.7"],"strongly":["10.3"],"recommended":["10.3","15.37"],"use":["10.3","10.6","15.37","22.39"],"these":["10.3"],"functions":["10.3"],"avoid":["10.3","15.37"],"causing":["10.3","15.37"],"memory":["10.3","15.37"],"leaks":["10.3","15.37"],"from":["10.6","17.1"],"basic":["10.6"],"options":["10.6","22.1"],"for":["10.6","12.0","20.13","22.4"],"configuration":["10.8","10.9","10.10"],"please":["10.8","10.9","10.10","10.15","12.0","22.2","22.10","22.28"],"refer":["10.8","10.9","10.10","10.15","12.0","20.11","21.0","22.2","22.28","22.29"],"following":["10.8","10.9","10.10","10.15","12.0","22.28","22.29","22.30","22.31"],"address":["10.8","10.9","10.10","12.0","22.28","22.29","22.30","22.31"],"srt":["10.11","22.24","26.24"],"settimeout":["10.12","10.14","15.3","15.20"],"has":["10.13"],"gained":["10.13"],"focus":["10.13"],"e":["10.13","15.19"],"g":["10.13","15.19"],"clicking":["10.13","22.19"],"link":["10.15","20.3"],"on":["10.16","15.4","15.19","22.2","22.19","24.6"],"a":["12.0"],"full":["12.0"],"list":["12.0"],"state":["12.37","12.39"],"further":["12.42"],"buffering":["12.42","12.43"],"to":["12.46","15.30","22.28","22.29"],"reload":["12.46"],"format":["12.48"],"data":["12.53","12.62"],"appeared":["12.58"],"changed":["12.60"],"basically":["13.0"],"needed":["13.0"],"assets":["13.1","13.14","13.15","13.16","13.18","13.19","13.24","13.25","13.26","13.27","22.3","22.11","22.26"],"flip":["13.6","13.7"],"dblclick":["13.17"],"contextmenu":["13.28"],"play":["14.0"],"rejects":["15.11"],"there":["15.11"],"was":["15.11"],"an":["15.11"],"error":["15.11"],"loading":["15.11"],"case":["15.15"],"obtained":["15.15","15.26"],"be":["15.15"],"interaction":["15.19"],"user":["15.19"],"clicked":["15.19","17.1"],"page":["15.21","22.7"],"must":["15.21"],"occur":["15.21","22.17"],"before":["15.21"],"triggering":["15.21"],"coordinates":["15.26"],"are":["15.26","22.17"],"via":["15.26"],"need":["15.30"],"make":["15.30"],"sure":["15.30"],"m3u8":["15.32","22.40","26.2"],"000":["15.33"],"highly":["15.37"],"this":["15.37","22.7"],"text":["16.1","18.1"],"when":["17.1"],"item":["17.1","19.6"],"script":["20.1","23.1","24.2"],"below":["20.3"],"packages":["20.3","20.9","23.3","23.9"],"template":["20.3","23.3"],"change":["20.4","20.5","24.13"],"the":["20.4","20.5","22.28","22.29","22.31"],"player":["20.4","20.12","23.12"],"in":["20.5"],"directly":["20.5"],"modifying":["20.5"],"definitions":["20.9"],"volume":["20.10"],"art8":["20.10","23.10"],"new":["20.10","23.10"],"yourself":["20.11"],"scripts":["20.11","23.11"],"documentation":["20.11"],"browserslist":["20.11","23.11"],"body":["20.12"],"div":["20.12","23.12"],"id":["20.12","23.12"],"import":["20.13"],"take":["20.13"],"effect":["20.13"],"or":["21.1","25.1"],"tip":["22.1"],"among":["22.1"],"all":["22.1"],"only":["22.1"],"is":["22.1"],"mandatory":["22.1"],"flv":["22.2","26.2"],"third":["22.2"],"party":["22.2"],"libraries":["22.2"],"side":["22.2"],"point":["22.4"],"jpg":["22.5","26.5"],"ffad00":["22.6","26.6"],"read":["22.7","22.10"],"cached":["22.7"],"value":["22.7"],"more":["22.10","22.42"],"information":["22.10"],"policy":["22.10","26.10"],"changes":["22.10","26.10"],"url":["22.11","22.26"],"setting":["22.14","22.15","22.16","22.24","26.14","26.15","26.16","26.24"],"website":["22.17"],"cross":["22.17"],"origin":["22.17"],"failure":["22.17"],"may":["22.17"],"such":["22.19"],"as":["22.19"],"hd":["22.32"],"720p":["22.32","26.32"],"こんなとこにあるはずもないのに":["22.33","26.33"],"终わり":["22.33","26.33"],"online":["22.35"],"generation":["22.35"],"tool":["22.35","26.35"],"03a9f4":["22.36","26.36"],"font":["22.36","24.5","26.36"],"size":["22.36","24.5","26.36"],"30px":["22.36","26.36"],"webkit":["22.37"],"playsinline":["22.37"],"therefore":["22.39"],"if":["22.39"],"you":["22.39"],"best":["22.39"],"well":["22.39"],"settings":["22.41","22.42"],"start":["22.41","22.42","26.41","26.42"],"i18n":["22.41","26.41"],"tw":["22.42","26.42"],"identify":["22.46"],"unique":["22.46"],"document":["22.50","26.50"],"createelement":["22.50","26.50"],"里直接修改":["23.4","23.5"],"是不会改变播放器的":["23.4","23.5"],"非响应式":["23.5"],"在":["23.5"],"构建配置":["23.11"],"build":["23.11"],"参考文档":["23.11"],"你需要在引入":["23.13"],"依赖前来修改它才会生效":["23.13"],"style":["24.4"],"弹幕自定义样式":["24.4"],"默认为空对象":["24.4"],"light":["24.5"],"只在自定义挂载时生效":["24.5"],"不透明度配置项":["24.5"],"弹幕字号配置项":["24.5"],"显示区域配置项":["24.5"],"弹幕速度配置项":["24.5"],"颜色列表配置项":["24.5"],"ref":["24.6"],"innerhtml":["24.6"],"ଘ":["24.6"],"੭ˊᵕˋ":["24.6"],"੭":["24.6"],"使用数组":["24.7"],"time":["24.7","24.9"],"异步返回":["24.9"],"显示弹幕":["24.10","24.11"],"hide":["24.11"],"border":["24.12"],"fontsize":["24.13"],"const":["24.14"],"target":["24.14"],"xml":["24.16"],"也可以手动挂载":["24.16"],"reset":["24.18"],"弹幕重置":["24.18"],"destroy":["24.18"],"弹幕销毁":["24.18"],"全部选项里":["26.1"],"只有":["26.1"],"是必填的":["26.1"],"如需要播放":["26.2"],"或者":["26.2"],"等其它格式":["26.2"],"请参考左侧的":["26.2"],"第三方库":["26.2"],"回调函数里的":["26.4"],"就是播放器实例":["26.4"],"但回调函数假如使用了箭头函数":["26.4"],"则不会指向播放器实例":["26.4"],"下次初始化时":["26.7"],"如刷新页面":["26.7"],"播放器会读取该缓存值":["26.7"],"更多信息请阅读":["26.10"],"假如视频源地址和网站是跨域的":["26.17"],"可能会出现截图失败":["26.17"],"在线生成预览图":["26.35"],"thumbnail":["26.35"],"所以假如你使用了":["26.39"],"最好同时要指明":["26.39"],"function":["26.40"],"更多的语言设置":["26.41","26.42"],"是不同的话":["26.46"],"那么你需要使用":["26.46"],"来标识视频的唯一":["26.46"]}]'},t={"0.0":{t:"# 高级属性",p:`这里的 高级属性 是指挂载在 实例 的 二级属性,比较少用
-`,l:"advanced/built-in.html",a:"高级属性"},"0.1":{t:"`option`",p:`播放器的选项
-<div className="run-code">▶ Run Code< ...`,l:"advanced/built-in.html#option",a:"option"},"0.2":{t:"`template`",p:`管理播放器所有的 DOM 元素
-<div className="run-code">▶ Ru ...`,l:"advanced/built-in.html#template",a:"template"},"0.3":{t:"`events`",p:"管理播放器所有的 DOM 事件,实质上是代理了 addEventListener 和 removeEventListener ...",l:"advanced/built-in.html#events",a:"events"},"0.4":{t:"`storage`",p:`管理播放器的本地存储
-
-name 属性用于设置缓存的 key
-set 方法用于设置缓存
-get 方法用于获取缓存
-del 方 ...`,l:"advanced/built-in.html#storage",a:"storage"},"0.5":{t:"`icons`",p:`管理播放器所有的 svg 图标
-<div className="run-code">▶ Ru ...`,l:"advanced/built-in.html#icons",a:"icons"},"0.6":{t:"`i18n`",p:`管理播放器的 i18n
-
-get 方法用于获取 i18n 的值
-update 方法用于更新 i18n 对象
-
-<div ...`,l:"advanced/built-in.html#i18n",a:"i18n"},"0.7":{t:"`notice`",p:`管理播放器的提示语,只有一个 show 属性用于显示提示语
-<div className="run-code ...`,l:"advanced/built-in.html#notice",a:"notice"},"0.8":{t:"`layers`",p:`管理播放器的层
-
-add 方法用于动态添加层
-remove 方法用于动态删除层
-update 方法用于动态更新层
-show  ...`,l:"advanced/built-in.html#layers",a:"layers"},"0.9":{t:"`controls`",p:`管理播放器的控制器
-
-add 方法用于动态添加控制器
-remove 方法用于动态删除控制器
-update 方法用于动态更新控 ...`,l:"advanced/built-in.html#controls",a:"controls"},"0.10":{t:"`contextmenu`",p:`管理播放器的右键菜单
-
-add 方法用于动态添加菜单
-remove 方法用于动态删除菜单
-update 方法用于动态更新菜单 ...`,l:"advanced/built-in.html#contextmenu",a:"contextmenu"},"0.11":{t:"`subtitle`",p:`管理播放器的字幕功能
-
-url 属性设置和返回当前字幕地址
-style 方法设置当前字幕的样式
-switch 方法设置当前字 ...`,l:"advanced/built-in.html#subtitle",a:"subtitle"},"0.12":{t:"`loading`",p:`管理播放器的加载层
-
-show 属性用于设置是否显示加载层
-toggle 属性用于切换是否显示加载层
-
-<div cl ...`,l:"advanced/built-in.html#loading",a:"loading"},"0.13":{t:"`hotkey`",p:`管理播放器的快捷键功能
-
-add 方法用于添加快捷键
-remove 方法用于删除快捷键
-
-<div className ...`,l:"advanced/built-in.html#hotkey",a:"hotkey"},"0.14":{t:"`mask`",p:`管理播放器的遮罩层
-
-show 属性用于设置是否显示遮罩层
-toggle 属性用于切换是否显示遮罩层
-
-<div cl ...`,l:"advanced/built-in.html#mask",a:"mask"},"0.15":{t:"`setting`",p:`管理播放器的设置面板
-
-add 方法用于动态添加设置项
-remove 方法用于动态删除设置项
-update 方法用于动态更新 ...`,l:"advanced/built-in.html#setting",a:"setting"},"0.16":{t:"`plugins`",p:`管理播放器的插件功能,只有一个方法 add 用于动态添加插件
-<div className="run-cod ...`,l:"advanced/built-in.html#plugins",a:"plugins"},"1.0":{t:"# 静态属性",p:`这里的 静态属性 是指挂载在 构造函数 的 一级属性,非常少使用
-`,l:"advanced/class.html",a:"静态属性"},"1.1":{t:"`instances`",p:`返回全部播放器实例的数组,假如你想同时管理多个播放器的时候,可以用到该属性
-<div className=" ...`,l:"advanced/class.html#instances",a:"instances"},"1.2":{t:"`version`",p:`返回播放器的版本信息
-<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#version",a:"version"},"1.3":{t:"`env`",p:`返回播放器的环境变量
-<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#env",a:"env"},"1.4":{t:"`build`",p:`返回播放器的打包时间
-<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#build",a:"build"},"1.5":{t:"`config`",p:`返回视频的默认配置
-<div className="run-code">▶ Run Code ...`,l:"advanced/class.html#config",a:"config"},"1.6":{t:"`utils`",p:`返回播放器的工具函数集合
-<div className="run-code">▶ Run C ...`,l:"advanced/class.html#utils",a:"utils"},"1.7":{t:"`scheme`",p:`返回播放器选项的校验方案
-<div className="run-code">▶ Run C ...`,l:"advanced/class.html#scheme",a:"scheme"},"1.8":{t:"`Emitter`",p:`返回事件分发器的构造函数
-<div className="run-code">▶ Run C ...`,l:"advanced/class.html#emitter",a:"emitter"},"1.9":{t:"`validator`",p:`返回选项的校验函数
-<div className="run-code">▶ Run Code ...`,l:"advanced/class.html#validator",a:"validator"},"1.10":{t:"`kindOf`",p:`返回类型检测的函数工具
-<div className="run-code">▶ Run Co ...`,l:"advanced/class.html#kindof",a:"kindof"},"1.11":{t:"`html`",p:`返回播放器所需的 html 字符串
-<div className="run-code">▶  ...`,l:"advanced/class.html#html",a:"html"},"1.12":{t:"`option`",p:`返回播放器的默认选项
-<div className="run-code">▶ Run Cod ...`,l:"advanced/class.html#option",a:"option"},"2.0":{t:"# 实例事件",p:`播放器的事件分为两种,一种视频的 原生事件 (前缀 video:),另外一种是 自定义事件
-监听事件:
-<div cl ...`,l:"advanced/event.html",a:"实例事件"},"2.1":{t:"`ready`",p:`当播放器首次可以播放器时触发
-<div className="run-code">▶ Run ...`,l:"advanced/event.html#ready",a:"ready"},"2.2":{t:"`restart`",p:`当播放器切换地址后并可以播放时触发
-<div className="run-code">▶  ...`,l:"advanced/event.html#restart",a:"restart"},"2.3":{t:"`pause`",p:`当播放器暂停时触发
-<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#pause",a:"pause"},"2.4":{t:"`play`",p:`当播放器播放时触发
-<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#play",a:"play"},"2.5":{t:"`hotkey`",p:`当播放器热键被按下时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#hotkey",a:"hotkey"},"2.6":{t:"`destroy`",p:`当播放器销毁时触发
-<div className="run-code">▶ Run Code ...`,l:"advanced/event.html#destroy",a:"destroy"},"2.7":{t:"`focus`",p:`当播放器获得焦点时触发
-<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#focus",a:"focus"},"2.8":{t:"`blur`",p:`当播放器失去焦点时触发
-<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#blur",a:"blur"},"2.9":{t:"`dblclick`",p:`当播放器被双击时触发
-<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#dblclick",a:"dblclick"},"2.10":{t:"`click`",p:`当播放器被单击时触发
-<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#click",a:"click"},"2.11":{t:"`error`",p:`当播放器加载视频发生错误时触发
-<div className="run-code">▶ Ru ...`,l:"advanced/event.html#error",a:"error"},"2.12":{t:"`hover`",p:`当播放器被鼠标移出或者移入时触发
-<div className="run-code">▶ R ...`,l:"advanced/event.html#hover",a:"hover"},"2.13":{t:"`mousemove`",p:`当播放器被鼠标经过时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#mousemove",a:"mousemove"},"2.14":{t:"`resize`",p:`当播放器尺寸变化时触发
-<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#resize",a:"resize"},"2.15":{t:"`view`",p:`当播放器出现在视口时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#view",a:"view"},"2.16":{t:"`lock`",p:`在移动端,当锁定的状态发生变化时触发
-<div className="run-code">▶ ...`,l:"advanced/event.html#lock",a:"lock"},"2.17":{t:"`aspectRatio`",p:`当播放器长宽比变化时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#aspectratio",a:"aspectratio"},"2.18":{t:"`autoHeight`",p:`当播放器自动设置高度时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#autoheight",a:"autoheight"},"2.19":{t:"`autoSize`",p:`当播放器自动设置尺寸时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#autosize",a:"autosize"},"2.20":{t:"`flip`",p:`当播放器发生翻转时触发
-<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#flip",a:"flip"},"2.21":{t:"`fullscreen`",p:`当播放器发生窗口全屏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#fullscreen",a:"fullscreen"},"2.22":{t:"`fullscreenError`",p:`当播放器发生窗口全屏错误时触发
-<div className="run-code">▶ Ru ...`,l:"advanced/event.html#fullscreenerror",a:"fullscreenerror"},"2.23":{t:"`fullscreenWeb`",p:`当播放器发生网页全屏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#fullscreenweb",a:"fullscreenweb"},"2.24":{t:"`mini`",p:`当播放器进入迷你模式时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#mini",a:"mini"},"2.25":{t:"`pip`",p:`当播放器进入画中画时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#pip",a:"pip"},"2.26":{t:"`screenshot`",p:`当播放器被截图时触发
-<div className="run-code">▶ Run Cod ...`,l:"advanced/event.html#screenshot",a:"screenshot"},"2.27":{t:"`seek`",p:`当播放器发生时间跳转时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#seek",a:"seek"},"2.28":{t:"`subtitleOffset`",p:`当播放器发生字幕偏移时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#subtitleoffset",a:"subtitleoffset"},"2.29":{t:"`subtitleBeforeUpdate`",p:`当字幕更新前触发
-<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitlebeforeupdate",a:"subtitlebeforeupdate"},"2.30":{t:"`subtitleAfterUpdate`",p:`当字幕更新后触发
-<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitleafterupdate",a:"subtitleafterupdate"},"2.31":{t:"`subtitleLoad`",p:`当字幕加载时触发
-<div className="run-code">▶ Run Code& ...`,l:"advanced/event.html#subtitleload",a:"subtitleload"},"2.32":{t:"`info`",p:`当信息面板显示或隐藏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#info",a:"info"},"2.33":{t:"`layer`",p:`当自定义层显示或隐藏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#layer",a:"layer"},"2.34":{t:"`loading`",p:`当加载器显示或隐藏时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#loading",a:"loading"},"2.35":{t:"`mask`",p:`当遮罩层显示或隐藏时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#mask",a:"mask"},"2.36":{t:"`subtitle`",p:`当字幕层显示或隐藏时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#subtitle",a:"subtitle"},"2.37":{t:"`contextmenu`",p:`当右键菜单显示或隐藏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#contextmenu",a:"contextmenu"},"2.38":{t:"`control`",p:`当控制器显示或隐藏时触发
-<div className="run-code">▶ Run C ...`,l:"advanced/event.html#control",a:"control"},"2.39":{t:"`setting`",p:`当设置面板显示或隐藏时触发
-<div className="run-code">▶ Run  ...`,l:"advanced/event.html#setting",a:"setting"},"2.40":{t:"`muted`",p:`当静音的状态变化时触发
-<div className="run-code">▶ Run Co ...`,l:"advanced/event.html#muted",a:"muted"},"2.41":{t:"`keydown`",p:`监听来自 document 的 keydown 事件
-<div className="run-code&qu ...`,l:"advanced/event.html#keydown",a:"keydown"},"2.42":{t:"`video:canplay`",p:`浏览器可以播放媒体文件了,但估计没有足够的数据来支撑播放到结束,不必停下来进一步缓冲内容
-`,l:"advanced/event.html#video-canplay",a:"video-canplay"},"2.43":{t:"`video:canplaythrough`",p:`浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束
-`,l:"advanced/event.html#video-canplaythrough",a:"video-canplaythrough"},"2.44":{t:"`video:complete`",p:`OfflineAudioContext 渲染完成
-`,l:"advanced/event.html#video-complete",a:"video-complete"},"2.45":{t:"`video:durationchange`",p:`duration 属性的值改变时触发
-`,l:"advanced/event.html#video-durationchange",a:"video-durationchange"},"2.46":{t:"`video:emptied`",p:"媒体内容变为空;例如,当这个 media 已经加载完成(或者部分加载完成),则发送此事件,并调用 load() 方法重新加载 ...",l:"advanced/event.html#video-emptied",a:"video-emptied"},"2.47":{t:"`video:ended`",p:`视频停止播放,因为 media 已经到达结束点
-`,l:"advanced/event.html#video-ended",a:"video-ended"},"2.48":{t:"`video:error`",p:`获取媒体数据时出错,或者资源类型不是受支持的媒体格式
-`,l:"advanced/event.html#video-error",a:"video-error"},"2.49":{t:"`video:loadeddata`",p:`media 中的首帧已经完成加载
-`,l:"advanced/event.html#video-loadeddata",a:"video-loadeddata"},"2.50":{t:"`video:loadedmetadata`",p:`已加载元数据
-`,l:"advanced/event.html#video-loadedmetadata",a:"video-loadedmetadata"},"2.51":{t:"`video:pause`",p:`播放已暂停
-`,l:"advanced/event.html#video-pause",a:"video-pause"},"2.52":{t:"`video:play`",p:`播放已开始
-`,l:"advanced/event.html#video-play",a:"video-play"},"2.53":{t:"`video:playing`",p:`由于缺乏数据而暂停或延迟后,播放准备开始
-`,l:"advanced/event.html#video-playing",a:"video-playing"},"2.54":{t:"`video:progress`",p:`在浏览器加载资源时周期性触发
-`,l:"advanced/event.html#video-progress",a:"video-progress"},"2.55":{t:"`video:ratechange`",p:`播放速率发生变化
-`,l:"advanced/event.html#video-ratechange",a:"video-ratechange"},"2.56":{t:"`video:seeked`",p:`跳帧(seek)操作完成
-`,l:"advanced/event.html#video-seeked",a:"video-seeked"},"2.57":{t:"`video:seeking`",p:`跳帧(seek)操作开始
-`,l:"advanced/event.html#video-seeking",a:"video-seeking"},"2.58":{t:"`video:stalled`",p:`用户代理(user agent)正在尝试获取媒体数据,但数据意外未出现
-`,l:"advanced/event.html#video-stalled",a:"video-stalled"},"2.59":{t:"`video:suspend`",p:`媒体数据加载已暂停
-`,l:"advanced/event.html#video-suspend",a:"video-suspend"},"2.60":{t:"`video:timeupdate`",p:`currentTime 属性指定的时间发生变化
-`,l:"advanced/event.html#video-timeupdate",a:"video-timeupdate"},"2.61":{t:"`video:volumechange`",p:`音量发生变化
-`,l:"advanced/event.html#video-volumechange",a:"video-volumechange"},"2.62":{t:"`video:waiting`",p:`由于暂时缺少数据,播放已停止
-`,l:"advanced/event.html#video-waiting",a:"video-waiting"},"3.0":{t:"# 全局属性",p:`这里的 全局属性 也是指挂载在 构造函数 的 一级属性,属性名字全部都是大写的形式,未来容易发生变动,基本上用不到
-`,l:"advanced/global.html",a:"全局属性"},"3.1":{t:"DEBUG",p:`是否开始 debug 模式,可以打印出视频全部的内置事件,默认关闭
-<div className="run- ...`,l:"advanced/global.html#debug",a:"debug"},"3.2":{t:"STYLE",p:`返回播放器样式文本
-<div className="run-code">▶ Run Code ...`,l:"advanced/global.html#style",a:"style"},"3.3":{t:"CONTEXTMENU",p:`是否开启右键菜单,默认开启
-<div className="run-code">▶ Run  ...`,l:"advanced/global.html#contextmenu",a:"contextmenu"},"3.4":{t:"NOTICE_TIME",p:`提示信息的显示时长,单位为毫秒,默认为 2000
-<div className="run-code" ...`,l:"advanced/global.html#notice-time",a:"notice-time"},"3.5":{t:"SETTING_WIDTH",p:`设置面板的默认宽度,单位为像素,默认为 250
-<div className="run-code" ...`,l:"advanced/global.html#setting-width",a:"setting-width"},"3.6":{t:"SETTING_ITEM_WIDTH",p:`设置面板的设置项的默认宽度,单位为像素,默认为 200
-<div className="run-code&q ...`,l:"advanced/global.html#setting-item-width",a:"setting-item-width"},"3.7":{t:"SETTING_ITEM_HEIGHT",p:`设置面板的设置项的默认高度,单位为像素,默认为 35
-<div className="run-code&qu ...`,l:"advanced/global.html#setting-item-height",a:"setting-item-height"},"3.8":{t:"RESIZE_TIME",p:`resize 事件的节流时间,单位为毫秒,默认为 200
-<div className="run-code& ...`,l:"advanced/global.html#resize-time",a:"resize-time"},"3.9":{t:"SCROLL_TIME",p:`scroll 事件的节流时间,单位为毫秒,默认为 200
-<div className="run-code& ...`,l:"advanced/global.html#scroll-time",a:"scroll-time"},"3.10":{t:"SCROLL_GAP",p:`view 事件的边界容差距离,单位为像素,默认为 50
-<div className="run-code&q ...`,l:"advanced/global.html#scroll-gap",a:"scroll-gap"},"3.11":{t:"AUTO_PLAYBACK_MAX",p:`自动回放功能的最大记录数,默认为 10
-<div className="run-code"> ...`,l:"advanced/global.html#auto-playback-max",a:"auto-playback-max"},"3.12":{t:"AUTO_PLAYBACK_MIN",p:`自动回放功能的最小记录时长,单位为秒,默认为 5
-<div className="run-code" ...`,l:"advanced/global.html#auto-playback-min",a:"auto-playback-min"},"3.13":{t:"AUTO_PLAYBACK_TIMEOUT",p:`自动回放功能的隐藏延迟时长,单位为毫秒,默认为 3000
-<div className="run-code& ...`,l:"advanced/global.html#auto-playback-timeout",a:"auto-playback-timeout"},"3.14":{t:"RECONNECT_TIME_MAX",p:`发生连接错误时,自动连接的最大次数,默认为 5
-<div className="run-code" ...`,l:"advanced/global.html#reconnect-time-max",a:"reconnect-time-max"},"3.15":{t:"RECONNECT_SLEEP_TIME",p:`发生连接错误时,自动连接的延迟时间,单位为毫秒,默认为 1000
-<div className="run-c ...`,l:"advanced/global.html#reconnect-sleep-time",a:"reconnect-sleep-time"},"3.16":{t:"CONTROL_HIDE_TIME",p:`底部控制栏的自动隐藏的延迟时间,单位为毫秒,默认为 3000
-<div className="run-cod ...`,l:"advanced/global.html#control-hide-time",a:"control-hide-time"},"3.17":{t:"DBCLICK_TIME",p:`双击事件的延迟事件,单位为毫秒,默认为 300
-<div className="run-code" ...`,l:"advanced/global.html#dbclick-time",a:"dbclick-time"},"3.18":{t:"DBCLICK_FULLSCREEN",p:`在桌面端,是否双击切换全屏,默认为 true
-<div className="run-code"& ...`,l:"advanced/global.html#dbclick-fullscreen",a:"dbclick-fullscreen"},"3.19":{t:"MOBILE_DBCLICK_PLAY",p:`在移动端,是否双击切换播放暂停,默认为 true
-<div className="run-code" ...`,l:"advanced/global.html#mobile-dbclick-play",a:"mobile-dbclick-play"},"3.20":{t:"MOBILE_CLICK_PLAY",p:`在移动端,是否单击切换播放暂停,默认为 false
-<div className="run-code&quo ...`,l:"advanced/global.html#mobile-click-play",a:"mobile-click-play"},"3.21":{t:"AUTO_ORIENTATION_TIME",p:`在移动端,自动旋屏的延迟时间,单位为毫秒,默认为 200
-<div className="run-code& ...`,l:"advanced/global.html#auto-orientation-time",a:"auto-orientation-time"},"3.22":{t:"INFO_LOOP_TIME",p:`信息面板的刷新时间,单位为毫秒,默认为 1000
-<div className="run-code" ...`,l:"advanced/global.html#info-loop-time",a:"info-loop-time"},"3.23":{t:"FAST_FORWARD_VALUE",p:`在移动端,长按加速的速率倍数,默认为 3
-<div className="run-code"> ...`,l:"advanced/global.html#fast-forward-value",a:"fast-forward-value"},"3.24":{t:"FAST_FORWARD_TIME",p:`在移动端,长按加速的延迟时间,单位为毫秒,默认为 1000
-<div className="run-code ...`,l:"advanced/global.html#fast-forward-time",a:"fast-forward-time"},"3.25":{t:"TOUCH_MOVE_RATIO",p:`在移动端,左右滑动进度的速率倍数,默认为 0.5
-<div className="run-code" ...`,l:"advanced/global.html#touch-move-ratio",a:"touch-move-ratio"},"3.26":{t:"VOLUME_STEP",p:`快捷键调节音量的幅度比例,默认为 0.1
-<div className="run-code"> ...`,l:"advanced/global.html#volume-step",a:"volume-step"},"3.27":{t:"SEEK_STEP",p:`快捷键调节播放进度的幅度,单位为秒,默认为 5
-<div className="run-code" ...`,l:"advanced/global.html#seek-step",a:"seek-step"},"3.28":{t:"PLAYBACK_RATE",p:`内置播放速率的列表,默认为 [0.5, 0.75, 1, 1.25, 1.5, 2]
-<div className=& ...`,l:"advanced/global.html#playback-rate",a:"playback-rate"},"3.29":{t:"ASPECT_RATIO",p:`内置视频长宽比的列表,默认为 ['default', '4:3', '16:9']
-<div className=&q ...`,l:"advanced/global.html#aspect-ratio",a:"aspect-ratio"},"3.30":{t:"FLIP",p:`内置视频翻转的列表,默认为 ['normal', 'horizontal', 'vertical']
-<div cla ...`,l:"advanced/global.html#flip",a:"flip"},"3.31":{t:"FULLSCREEN_WEB_IN_BODY",p:`网页全屏时,是否把播放器挂在在 body 元素下,默认为 false
-<div className="run ...`,l:"advanced/global.html#fullscreen-web-in-body",a:"fullscreen-web-in-body"},"3.32":{t:"LOG_VERSION",p:`设置是否打印播放器版本,默认为 true
-<div className="run-code"> ...`,l:"advanced/global.html#log-version",a:"log-version"},"3.33":{t:"USE_RAF",p:`设置是否使用 requestAnimationFrame ,默认为 false,目前主要用于进度条的平滑效果
-<div ...`,l:"advanced/global.html#use-raf",a:"use-raf"},"4.0":{t:"# 编写插件",p:`但你已经知道播放器的属性, 方法和事件后,再编写插件是非常简单的事
-可以在实例化的时候加载插件的函数
-<div cla ...`,l:"advanced/plugin.html",a:"编写插件"},"5.0":{t:"# 实例属性",p:`这里的 实例属性 是指挂载在 实例 的 一级属性,比较常用
-`,l:"advanced/property.html",a:"实例属性"},"5.1":{t:"`play`",p:`
-Type: Function
-
-播放视频
-<div className="run-code"&g ...`,l:"advanced/property.html#play",a:"play"},"5.2":{t:"`pause`",p:`
-Type: Function
-
-暂停视频
-<div className="run-code"&g ...`,l:"advanced/property.html#pause",a:"pause"},"5.3":{t:"`toggle`",p:`
-Type: Function
-
-切换视频的播放和暂停
-<div className="run-code&q ...`,l:"advanced/property.html#toggle",a:"toggle"},"5.4":{t:"`destroy`",p:`
-Type: Function
-Parameter: Boolean
-
-销毁播放器,接受一个参数表示是否销毁后同时移除播放器 ...`,l:"advanced/property.html#destroy",a:"destroy"},"5.5":{t:"`seek`",p:`
-Type: Setter
-Parameter: Number
-
-视频时间跳转,单位秒
-<div className= ...`,l:"advanced/property.html#seek",a:"seek"},"5.6":{t:"`forward`",p:`
-Type: Setter
-Parameter: Number
-
-视频时间快进,单位秒
-<div className= ...`,l:"advanced/property.html#forward",a:"forward"},"5.7":{t:"`backward`",p:`
-Type: Setter
-Parameter: Number
-
-视频时间快退,单位秒
-<div className= ...`,l:"advanced/property.html#backward",a:"backward"},"5.8":{t:"`volume`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-设置和获取视频音量,范围在:[0, 1]
-& ...`,l:"advanced/property.html#volume",a:"volume"},"5.9":{t:"`url`",p:`
-Type: Setter/Getter
-Parameter: String
-
-设置和获取视频地址
-<div clas ...`,l:"advanced/property.html#url",a:"url"},"5.10":{t:"`switch`",p:`
-Type: Setter
-Parameter: String
-
-设置视频地址,设置时和 art.url 类似,但会执行一些 ...`,l:"advanced/property.html#switch",a:"switch"},"5.11":{t:"`switchUrl`",p:`
-Type: Function
-Parameter: String
-
-设置视频地址,设置时和 art.url 类似,但会执行 ...`,l:"advanced/property.html#switchurl",a:"switchurl"},"5.12":{t:"`switchQuality`",p:`
-Type: Function
-Parameter: String
-
-设置视频画质地址,和 art.switchUrl 类似 ...`,l:"advanced/property.html#switchquality",a:"switchquality"},"5.13":{t:"`muted`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-设置和获取视频是否静音
-<div c ...`,l:"advanced/property.html#muted",a:"muted"},"5.14":{t:"`currentTime`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-设置和获取视频当前时间,设置时间时和 see ...`,l:"advanced/property.html#currenttime",a:"currenttime"},"5.15":{t:"`duration`",p:`
-Type: Getter
-
-获取视频时长
-<div className="run-code"&g ...`,l:"advanced/property.html#duration",a:"duration"},"5.16":{t:"`screenshot`",p:`
-Type: Function
-
-下载当前视频帧的截图, 可选参数为截图名字
-<div className=" ...`,l:"advanced/property.html#screenshot",a:"screenshot"},"5.17":{t:"`getDataURL`",p:`
-Type: Function
-
-获取当前视频帧的截图的base64地址,返回的是一个 Promise
-<div cl ...`,l:"advanced/property.html#getdataurl",a:"getdataurl"},"5.18":{t:"`getBlobUrl`",p:`
-Type: Function
-
-获取当前视频帧的截图的blob地址,返回的是一个 Promise
-<div clas ...`,l:"advanced/property.html#getbloburl",a:"getbloburl"},"5.19":{t:"`fullscreen`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-设置和获取播放器窗口全屏
-<div  ...`,l:"advanced/property.html#fullscreen",a:"fullscreen"},"5.20":{t:"`fullscreenWeb`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-设置和获取播放器网页全屏
-<div  ...`,l:"advanced/property.html#fullscreenweb",a:"fullscreenweb"},"5.21":{t:"`pip`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-设置和获取播放器画中画模式
-<div ...`,l:"advanced/property.html#pip",a:"pip"},"5.22":{t:"`poster`",p:`
-Type: Setter/Getter
-Parameter: String
-
-设置和获取视频海报,只有在视频播放前才能看到 ...`,l:"advanced/property.html#poster",a:"poster"},"5.23":{t:"`mini`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-设置和获取播放器迷你模式
-<div  ...`,l:"advanced/property.html#mini",a:"mini"},"5.24":{t:"`playing`",p:`
-Type: Getter
-Parameter: Boolean
-
-获取视频是否正在播放中
-<div classNam ...`,l:"advanced/property.html#playing",a:"playing"},"5.25":{t:"`autoSize`",p:`
-Type: Function
-
-设置视频是否自适应尺寸
-<div className="run-code& ...`,l:"advanced/property.html#autosize",a:"autosize"},"5.26":{t:"`rect`",p:`
-Type: Getter
-
-获取播放器的尺寸和坐标信息
-<div className="run-code& ...`,l:"advanced/property.html#rect",a:"rect"},"5.27":{t:"`flip`",p:`
-Type: Setter/Getter
-Parameter: String
-
-设置和获取播放器翻转,支持normal,   ...`,l:"advanced/property.html#flip",a:"flip"},"5.28":{t:"`playbackRate`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-设置和获取播放器播放速度
-<div c ...`,l:"advanced/property.html#playbackrate",a:"playbackrate"},"5.29":{t:"`aspectRatio`",p:`
-Type: Setter/Getter
-Parameter: String
-
-设置和获取播放器长宽比
-<div cl ...`,l:"advanced/property.html#aspectratio",a:"aspectratio"},"5.30":{t:"`autoHeight`",p:`
-Type: Function
-
-当容器只有宽度,该属性可以自动计算出并设置视频的高度
-<div className= ...`,l:"advanced/property.html#autoheight",a:"autoheight"},"5.31":{t:"`attr`",p:`
-Type: Function
-Parameter: String
-
-动态获取和设置 video 元素的属性
-<div ...`,l:"advanced/property.html#attr",a:"attr"},"5.32":{t:"`type`",p:`
-Type: Setter/Getter
-Parameter: String
-
-动态获取和设置视频类型
-<div cl ...`,l:"advanced/property.html#type",a:"type"},"5.33":{t:"`theme`",p:`
-Type: Setter/Getter
-Parameter: String
-
-动态获取和设置播放器主题颜色
-<div ...`,l:"advanced/property.html#theme",a:"theme"},"5.34":{t:"`airplay`",p:`
-Type: Function
-
-开启隔空播放
-<div className="run-code" ...`,l:"advanced/property.html#airplay",a:"airplay"},"5.35":{t:"`loaded`",p:`
-Type: Getter
-
-视频缓存的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用
-&l ...`,l:"advanced/property.html#loaded",a:"loaded"},"5.36":{t:"`played`",p:`
-Type: Getter
-
-视频播放的比例,范围是 [0, 1],常配合 video:timeupdate 事件使用
-&l ...`,l:"advanced/property.html#played",a:"played"},"5.37":{t:"`proxy`",p:`
-Type: Function
-
-DOM 事件的代理函数,实质上代理了 addEventListener 和 removeE ...`,l:"advanced/property.html#proxy",a:"proxy"},"5.38":{t:"`query`",p:`
-Type: Function
-
-DOM 的查询函数,类似 document.querySelector,但被查询的对象局限 ...`,l:"advanced/property.html#query",a:"query"},"5.39":{t:"`video`",p:`
-Type: Element
-
-快捷返回播放器的 video 元素
-<div className="run- ...`,l:"advanced/property.html#video",a:"video"},"5.40":{t:"`cssVar`",p:`
-Type: Function
-
-动态获取或设置 css 变量
-<div className="run-co ...`,l:"advanced/property.html#cssvar",a:"cssvar"},"5.41":{t:"`quality`",p:`
-Type: Setter
-Parameter: Array
-
-动态设置画质列表
-<div className=&qu ...`,l:"advanced/property.html#quality",a:"quality"},"5.42":{t:"`thumbnails`",p:`
-Type: Setter/Getter
-Parameter: Object
-
-动态设置缩略图
-<div classN ...`,l:"advanced/property.html#thumbnails",a:"thumbnails"},"5.43":{t:"`subtitleOffset`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-动态设置字幕偏移
-<div class ...`,l:"advanced/property.html#subtitleoffset",a:"subtitleoffset"},"6.0":{t:"# 右键菜单",p:"",l:"component/contextmenu.html",a:"右键菜单"},"6.1":{t:"配置",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-disable
-Boolean
-是否禁用组件
-
-
-name
-String
-组件唯一名称,用于 ...`,l:"component/contextmenu.html#配置",a:"配置"},"6.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#创建",a:"创建"},"6.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#添加",a:"添加"},"6.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#删除",a:"删除"},"6.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/contextmenu.html#更新",a:"更新"},"7.0":{t:"# 控制器",p:"",l:"component/controls.html",a:"控制器"},"7.1":{t:"配置",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-disable
-Boolean
-是否禁用组件
-
-
-name
-String
-组件唯一名称,用于 ...`,l:"component/controls.html#配置",a:"配置"},"7.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#创建",a:"创建"},"7.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#添加",a:"添加"},"7.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#删除",a:"删除"},"7.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/controls.html#更新",a:"更新"},"8.0":{t:"# 业务层",p:"",l:"component/layers.html",a:"业务层"},"8.1":{t:"配置",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-disable
-Boolean
-是否禁用组件
-
-
-name
-String
-组件唯一名称,用于 ...`,l:"component/layers.html#配置",a:"配置"},"8.2":{t:"创建",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#创建",a:"创建"},"8.3":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#添加",a:"添加"},"8.4":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#删除",a:"删除"},"8.5":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/layers.html#更新",a:"更新"},"9.0":{t:"# 设置面板",p:"",l:"component/setting.html",a:"设置面板"},"9.1":{t:"内置",p:"须先打开设置面板,然后自带四个内置项:flip, playbackRate, aspectRatio, subtitleOf ...",l:"component/setting.html#内置",a:"内置"},"9.2":{t:"创建 - 按钮",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-html
-String, Element
-元素的 DOM
-
-
-icon
-String, El ...`,l:"component/setting.html#创建-按钮",a:"创建-按钮"},"9.3":{t:"创建 - 选择列表",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-html
-String, Element
-元素的 DOM
-
-
-icon
-String, El ...`,l:"component/setting.html#创建-选择列表",a:"创建-选择列表"},"9.4":{t:"创建 - 列表嵌套",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#创建-列表嵌套",a:"创建-列表嵌套"},"9.5":{t:"创建 - 切换按钮",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-html
-String, Element
-元素的 DOM 元素
-
-
-icon
-String, ...`,l:"component/setting.html#创建-切换按钮",a:"创建-切换按钮"},"9.6":{t:"创建 - 范围滑块",p:`
-
-
-属性
-类型
-描述
-
-
-
-
-html
-String, Element
-元素的 DOM 元素
-
-
-icon
-String, ...`,l:"component/setting.html#创建-范围滑块",a:"创建-范围滑块"},"9.7":{t:"添加",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#添加",a:"添加"},"9.8":{t:"删除",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#删除",a:"删除"},"9.9":{t:"更新",p:"<div className="run-code">▶ Run Code</div&g ...",l:"component/setting.html#更新",a:"更新"},"10.0":{t:"# Advanced Properties",p:"The advanced properties here refer to the secondary attributes ...",l:"en/advanced/built-in.html",a:"advanced-properties"},"10.1":{t:"`option`",p:`Options for the player
-<div className="run-code"& ...`,l:"en/advanced/built-in.html#option",a:"option"},"10.2":{t:"`template`",p:`Manages all of the DOM elements of the player
-<div classNam ...`,l:"en/advanced/built-in.html#template",a:"template"},"10.3":{t:"`events`",p:"Manages all DOM events in the player, which is essentially a p ...",l:"en/advanced/built-in.html#events",a:"events"},"10.4":{t:"`storage`",p:`Manages the local storage of the player
-
-The name attribute is ...`,l:"en/advanced/built-in.html#storage",a:"storage"},"10.5":{t:"`icons`",p:`Manage all the svg icons of the player
-<div className=" ...`,l:"en/advanced/built-in.html#icons",a:"icons"},"10.6":{t:"`i18n`",p:`Manage the player's i18n
-
-The get method is used to retrieve t ...`,l:"en/advanced/built-in.html#i18n",a:"i18n"},"10.7":{t:"`notice`",p:"Manage the player's notices, there's only one show property us ...",l:"en/advanced/built-in.html#notice",a:"notice"},"10.8":{t:"`layers`",p:`Manage the layers of the player
-
-The add method is used for dy ...`,l:"en/advanced/built-in.html#layers",a:"layers"},"10.9":{t:"`controls`",p:`Manage the player's controllers
-
-add method is used to dynamic ...`,l:"en/advanced/built-in.html#controls",a:"controls"},"10.10":{t:"`contextmenu`",p:`Manage the right-click context menu of the player
-
-The add met ...`,l:"en/advanced/built-in.html#contextmenu",a:"contextmenu"},"10.11":{t:"`subtitle`",p:`Manage the subtitle features of the player
-
-url property sets  ...`,l:"en/advanced/built-in.html#subtitle",a:"subtitle"},"10.12":{t:"`loading`",p:`Manage the loading layer of the player
-
-show property is used  ...`,l:"en/advanced/built-in.html#loading",a:"loading"},"10.13":{t:"`hotkey`",p:`Manage the hotkey functionality of the player
-
-The add method  ...`,l:"en/advanced/built-in.html#hotkey",a:"hotkey"},"10.14":{t:"`mask`",p:`Manage the player's mask layer
-
-show property is used to set w ...`,l:"en/advanced/built-in.html#mask",a:"mask"},"10.15":{t:"`setting`",p:`Manage the player's settings panel
-
-add method is used to dyna ...`,l:"en/advanced/built-in.html#setting",a:"setting"},"10.16":{t:"`plugins`",p:"Manage the player's plugin features, with only one method add  ...",l:"en/advanced/built-in.html#plugins",a:"plugins"},"11.0":{t:"# Static Properties",p:"Here, Static Properties refer to the first-level properties mo ...",l:"en/advanced/class.html",a:"static-properties"},"11.1":{t:"`instances`",p:"Returns an array of all player instances. You can use this pro ...",l:"en/advanced/class.html#instances",a:"instances"},"11.2":{t:"`version`",p:`Returns the version information of the player.
-<div classNa ...`,l:"en/advanced/class.html#version",a:"version"},"11.3":{t:"`env`",p:`Returns the environment variables of the player.
-<div class ...`,l:"en/advanced/class.html#env",a:"env"},"11.4":{t:"`build`",p:`Returns the build time of the player
-<div className="r ...`,l:"en/advanced/class.html#build",a:"build"},"11.5":{t:"`config`",p:`Returns the default configuration of the video
-<div classNa ...`,l:"en/advanced/class.html#config",a:"config"},"11.6":{t:"`utils`",p:`Returns a collection of utility functions for the player
-<d ...`,l:"en/advanced/class.html#utils",a:"utils"},"11.7":{t:"`scheme`",p:`Returns the validation scheme for the player options
-<div c ...`,l:"en/advanced/class.html#scheme",a:"scheme"},"11.8":{t:"`Emitter`",p:`Returns the constructor for the event dispatcher
-<div class ...`,l:"en/advanced/class.html#emitter",a:"emitter"},"11.9":{t:"`validator`",p:`Returns the validation function for options
-<div className= ...`,l:"en/advanced/class.html#validator",a:"validator"},"11.10":{t:"`kindOf`",p:`Returns the function tool for type checking
-<div className= ...`,l:"en/advanced/class.html#kindof",a:"kindof"},"11.11":{t:"`html`",p:`Returns the html string required for the player
-<div classN ...`,l:"en/advanced/class.html#html",a:"html"},"11.12":{t:"`option`",p:`Returns the player's default options
-<div className="r ...`,l:"en/advanced/class.html#option",a:"option"},"12.0":{t:"# Example Events",p:"Player events are divided into two types, one is the video's n ...",l:"en/advanced/event.html",a:"example-events"},"12.1":{t:"`ready`",p:`Triggered when the player is able to play for the first time
-& ...`,l:"en/advanced/event.html#ready",a:"ready"},"12.2":{t:"`restart`",p:"Triggered when the player switches the address and is able to  ...",l:"en/advanced/event.html#restart",a:"restart"},"12.3":{t:"`pause`",p:`Triggered when the player is paused
-<div className="ru ...`,l:"en/advanced/event.html#pause",a:"pause"},"12.4":{t:"`play`",p:`Triggered when the player starts playing
-<div className=&qu ...`,l:"en/advanced/event.html#play",a:"play"},"12.5":{t:"`hotkey`",p:`Triggered when a hotkey on the player is pressed
-<div class ...`,l:"en/advanced/event.html#hotkey",a:"hotkey"},"12.6":{t:"`destroy`",p:`Triggered when the player is destroyed
-<div className=" ...`,l:"en/advanced/event.html#destroy",a:"destroy"},"12.7":{t:"`focus`",p:`Triggered when the player gains focus
-<div className=" ...`,l:"en/advanced/event.html#focus",a:"focus"},"12.8":{t:"`blur`",p:`Triggered when the player loses focus
-<div className=" ...`,l:"en/advanced/event.html#blur",a:"blur"},"12.9":{t:"`dblclick`",p:`Triggered when the player is double-clicked
-<div className= ...`,l:"en/advanced/event.html#dblclick",a:"dblclick"},"12.10":{t:"`click`",p:`Triggered when the player is clicked
-<div className="r ...`,l:"en/advanced/event.html#click",a:"click"},"12.11":{t:"`error`",p:"Triggered when an error occurs while the player is loading the ...",l:"en/advanced/event.html#error",a:"error"},"12.12":{t:"`hover`",p:"Triggered when the player is hovered or unhovered by the mouse ...",l:"en/advanced/event.html#hover",a:"hover"},"12.13":{t:"`mousemove`",p:`Triggered when the mouse moves over the player
-<div classNa ...`,l:"en/advanced/event.html#mousemove",a:"mousemove"},"12.14":{t:"`resize`",p:`Triggered when the player size changes
-<div className=" ...`,l:"en/advanced/event.html#resize",a:"resize"},"12.15":{t:"`view`",p:`Triggered when the player appears in the viewport
-<div clas ...`,l:"en/advanced/event.html#view",a:"view"},"12.16":{t:"`lock`",p:`On mobile, triggered when the locked state changes
-<div cla ...`,l:"en/advanced/event.html#lock",a:"lock"},"12.17":{t:"`aspectRatio`",p:`Triggered when the aspect ratio of the player changes
-<div  ...`,l:"en/advanced/event.html#aspectratio",a:"aspectratio"},"12.18":{t:"`autoHeight`",p:`Triggered when the player automatically sets the height
-<di ...`,l:"en/advanced/event.html#autoheight",a:"autoheight"},"12.19":{t:"`autoSize`",p:`Triggered when the player automatically sets the size
-<div  ...`,l:"en/advanced/event.html#autosize",a:"autosize"},"12.20":{t:"`flip`",p:`Triggered when the player flips
-<div className="run-co ...`,l:"en/advanced/event.html#flip",a:"flip"},"12.21":{t:"`fullscreen`",p:`Triggered when the player goes into full screen
-<div classN ...`,l:"en/advanced/event.html#fullscreen",a:"fullscreen"},"12.22":{t:"`fullscreenError`",p:`Triggered when the player goes into full screen error
-<div  ...`,l:"en/advanced/event.html#fullscreenerror",a:"fullscreenerror"},"12.23":{t:"`fullscreenWeb`",p:`Triggered when the player enters web fullscreen
-<div classN ...`,l:"en/advanced/event.html#fullscreenweb",a:"fullscreenweb"},"12.24":{t:"`mini`",p:`Triggered when the player enters mini mode
-<div className=& ...`,l:"en/advanced/event.html#mini",a:"mini"},"12.25":{t:"`pip`",p:`Triggered when the player enters Picture-in-Picture mode
-<d ...`,l:"en/advanced/event.html#pip",a:"pip"},"12.26":{t:"`screenshot`",p:`Triggered when the player takes a screenshot
-<div className ...`,l:"en/advanced/event.html#screenshot",a:"screenshot"},"12.27":{t:"`seek`",p:`Triggered when the player jumps in time
-<div className=&quo ...`,l:"en/advanced/event.html#seek",a:"seek"},"12.28":{t:"`subtitleOffset`",p:`Triggered when the subtitle offset occurs in the player
-<di ...`,l:"en/advanced/event.html#subtitleoffset",a:"subtitleoffset"},"12.29":{t:"`subtitleBeforeUpdate`",p:`Triggered before subtitles are updated
-<div className=" ...`,l:"en/advanced/event.html#subtitlebeforeupdate",a:"subtitlebeforeupdate"},"12.30":{t:"`subtitleAfterUpdate`",p:`Triggered when the subtitles are updated
-<div className=&qu ...`,l:"en/advanced/event.html#subtitleafterupdate",a:"subtitleafterupdate"},"12.31":{t:"`subtitleLoad`",p:`Triggered when the subtitle loads
-<div className="run- ...`,l:"en/advanced/event.html#subtitleload",a:"subtitleload"},"12.32":{t:"`info`",p:`Triggered when the information panel is shown or hidden
-<di ...`,l:"en/advanced/event.html#info",a:"info"},"12.33":{t:"`layer`",p:`Triggered when a custom layer is shown or hidden
-<div class ...`,l:"en/advanced/event.html#layer",a:"layer"},"12.34":{t:"`loading`",p:`Triggered when a loader is shown or hidden
-<div className=& ...`,l:"en/advanced/event.html#loading",a:"loading"},"12.35":{t:"`mask`",p:`Triggered when a mask layer is shown or hidden
-<div classNa ...`,l:"en/advanced/event.html#mask",a:"mask"},"12.36":{t:"`subtitle`",p:`Triggered when the subtitle layer is shown or hidden
-<div c ...`,l:"en/advanced/event.html#subtitle",a:"subtitle"},"12.37":{t:"`contextmenu`",p:`Triggered when the right-click menu is shown or hidden
-<div ...`,l:"en/advanced/event.html#contextmenu",a:"contextmenu"},"12.38":{t:"`control`",p:`Triggered when the controller is shown or hidden
-<div class ...`,l:"en/advanced/event.html#control",a:"control"},"12.39":{t:"`setting`",p:`Triggered when the settings panel is shown or hidden
-<div c ...`,l:"en/advanced/event.html#setting",a:"setting"},"12.40":{t:"`muted`",p:`Triggered when the muted state changes
-<div className=" ...`,l:"en/advanced/event.html#muted",a:"muted"},"12.41":{t:"`keydown`",p:`Listen to the keydown event from document
-<div className=&q ...`,l:"en/advanced/event.html#keydown",a:"keydown"},"12.42":{t:"`video:canplay`",p:"The browser can play the media file, but estimates there is no ...",l:"en/advanced/event.html#video-canplay",a:"video-canplay"},"12.43":{t:"`video:canplaythrough`",p:"The browser estimates it can play the media through to the end ...",l:"en/advanced/event.html#video-canplaythrough",a:"video-canplaythrough"},"12.44":{t:"`video:complete`",p:`OfflineAudioContext rendering is complete
-`,l:"en/advanced/event.html#video-complete",a:"video-complete"},"12.45":{t:"`video:durationchange`",p:`Triggered when the value of the duration property changes
-`,l:"en/advanced/event.html#video-durationchange",a:"video-durationchange"},"12.46":{t:"`video:emptied`",p:"The media content becomes empty; for example, when this media  ...",l:"en/advanced/event.html#video-emptied",a:"video-emptied"},"12.47":{t:"`video:ended`",p:`The video has stopped because the media reached the end point
-`,l:"en/advanced/event.html#video-ended",a:"video-ended"},"12.48":{t:"`video:error`",p:"An error occurred while fetching media data, or the resource t ...",l:"en/advanced/event.html#video-error",a:"video-error"},"12.49":{t:"`video:loadeddata`",p:`The first frame of the media has finished loading
-`,l:"en/advanced/event.html#video-loadeddata",a:"video-loadeddata"},"12.50":{t:"`video:loadedmetadata`",p:`Metadata has been loaded
-`,l:"en/advanced/event.html#video-loadedmetadata",a:"video-loadedmetadata"},"12.51":{t:"`video:pause`",p:`Playback has been paused
-`,l:"en/advanced/event.html#video-pause",a:"video-pause"},"12.52":{t:"`video:play`",p:`Playback has started
-`,l:"en/advanced/event.html#video-play",a:"video-play"},"12.53":{t:"`video:playing`",p:"Playback is ready to start following a pause or delay due to l ...",l:"en/advanced/event.html#video-playing",a:"video-playing"},"12.54":{t:"`video:progress`",p:`Periodically triggered while the browser is loading resources
-`,l:"en/advanced/event.html#video-progress",a:"video-progress"},"12.55":{t:"`video:ratechange`",p:`The playback rate has changed
-`,l:"en/advanced/event.html#video-ratechange",a:"video-ratechange"},"12.56":{t:"`video:seeked`",p:`A seek (frame skipping) operation has completed
-`,l:"en/advanced/event.html#video-seeked",a:"video-seeked"},"12.57":{t:"`video:seeking`",p:`A seek (frame skipping) operation has started
-`,l:"en/advanced/event.html#video-seeking",a:"video-seeking"},"12.58":{t:"`video:stalled`",p:"The user agent is trying to fetch media data, but the data une ...",l:"en/advanced/event.html#video-stalled",a:"video-stalled"},"12.59":{t:"`video:suspend`",p:`Media data loading has been suspended
-`,l:"en/advanced/event.html#video-suspend",a:"video-suspend"},"12.60":{t:"`video:timeupdate`",p:`The time specified by the currentTime attribute has changed
-`,l:"en/advanced/event.html#video-timeupdate",a:"video-timeupdate"},"12.61":{t:"`video:volumechange`",p:`Volume changed
-`,l:"en/advanced/event.html#video-volumechange",a:"video-volumechange"},"12.62":{t:"`video:waiting`",p:`Playback has stopped due to temporarily missing data
-`,l:"en/advanced/event.html#video-waiting",a:"video-waiting"},"13.0":{t:"# Global Attributes",p:"Here, Global Attributes refer to the first-level properties mo ...",l:"en/advanced/global.html",a:"global-attributes"},"13.1":{t:"DEBUG",p:"Whether to start debug mode, which can print out all built-in  ...",l:"en/advanced/global.html#debug",a:"debug"},"13.2":{t:"STYLE",p:`Returns the player style text
-<div className="run-code ...`,l:"en/advanced/global.html#style",a:"style"},"13.3":{t:"CONTEXTMENU",p:"Whether to enable the right-click context menu, enabled by def ...",l:"en/advanced/global.html#contextmenu",a:"contextmenu"},"13.4":{t:"NOTICE_TIME",p:"The display duration of the notification message, in milliseco ...",l:"en/advanced/global.html#notice-time",a:"notice-time"},"13.5":{t:"SETTING_WIDTH",p:"The default width of the settings panel, in pixels, defaults t ...",l:"en/advanced/global.html#setting-width",a:"setting-width"},"13.6":{t:"SETTING_ITEM_WIDTH",p:"Set the default width of the settings items in the panel, in p ...",l:"en/advanced/global.html#setting-item-width",a:"setting-item-width"},"13.7":{t:"SETTING_ITEM_HEIGHT",p:"Set the default height of the settings items in the panel, in  ...",l:"en/advanced/global.html#setting-item-height",a:"setting-item-height"},"13.8":{t:"RESIZE_TIME",p:"Throttle time for the resize event, in milliseconds, defaults  ...",l:"en/advanced/global.html#resize-time",a:"resize-time"},"13.9":{t:"SCROLL_TIME",p:"Throttle time for the scroll event, in milliseconds, defaults  ...",l:"en/advanced/global.html#scroll-time",a:"scroll-time"},"13.10":{t:"SCROLL_GAP",p:"The boundary tolerance distance for the view event, in pixels, ...",l:"en/advanced/global.html#scroll-gap",a:"scroll-gap"},"13.11":{t:"AUTO_PLAYBACK_MAX",p:"The maximum number of records for the automatic playback featu ...",l:"en/advanced/global.html#auto-playback-max",a:"auto-playback-max"},"13.12":{t:"AUTO_PLAYBACK_MIN",p:"The minimum duration for the auto playback feature, in seconds ...",l:"en/advanced/global.html#auto-playback-min",a:"auto-playback-min"},"13.13":{t:"AUTO_PLAYBACK_TIMEOUT",p:"The delay duration for hiding the auto playback feature, in mi ...",l:"en/advanced/global.html#auto-playback-timeout",a:"auto-playback-timeout"},"13.14":{t:"RECONNECT_TIME_MAX",p:"The maximum number of automatic reconnection attempts when a c ...",l:"en/advanced/global.html#reconnect-time-max",a:"reconnect-time-max"},"13.15":{t:"RECONNECT_SLEEP_TIME",p:"The delay time for the automatic reconnection attempt when a c ...",l:"en/advanced/global.html#reconnect-sleep-time",a:"reconnect-sleep-time"},"13.16":{t:"CONTROL_HIDE_TIME",p:`...
-Auto-hide delay time for the bottom control bar, measured  ...`,l:"en/advanced/global.html#control-hide-time",a:"control-hide-time"},"13.17":{t:"DBCLICK_TIME",p:"Double-click event delay time, measured in milliseconds, defau ...",l:"en/advanced/global.html#dbclick-time",a:"dbclick-time"},"13.18":{t:"DBCLICK_FULLSCREEN",p:"On desktop, whether to switch to fullscreen on double click, d ...",l:"en/advanced/global.html#dbclick-fullscreen",a:"dbclick-fullscreen"},"13.19":{t:"MOBILE_DBCLICK_PLAY",p:"On mobile, whether to toggle play/pause on double click, defau ...",l:"en/advanced/global.html#mobile-dbclick-play",a:"mobile-dbclick-play"},"13.20":{t:"MOBILE_CLICK_PLAY",p:"On mobile, whether to play/pause on single click, default is f ...",l:"en/advanced/global.html#mobile-click-play",a:"mobile-click-play"},"13.21":{t:"AUTO_ORIENTATION_TIME",p:"On mobile devices, the delay time for auto-rotation, in millis ...",l:"en/advanced/global.html#auto-orientation-time",a:"auto-orientation-time"},"13.22":{t:"INFO_LOOP_TIME",p:"Info panel refresh time, unit in milliseconds, default is 1000 ...",l:"en/advanced/global.html#info-loop-time",a:"info-loop-time"},"13.23":{t:"FAST_FORWARD_VALUE",p:"On mobile, the multiplier rate of the speed when long-pressing ...",l:"en/advanced/global.html#fast-forward-value",a:"fast-forward-value"},"13.24":{t:"FAST_FORWARD_TIME",p:"The time, in milliseconds, to fast-forward when double-tapped, ...",l:"en/advanced/global.html#fast-forward-time",a:"fast-forward-time"},"13.25":{t:"TOUCH_MOVE_RATIO",p:"On mobile, the ratio of the speed of sliding left and right to ...",l:"en/advanced/global.html#touch-move-ratio",a:"touch-move-ratio"},"13.26":{t:"VOLUME_STEP",p:"The step ratio of adjusting volume with shortcuts, default is  ...",l:"en/advanced/global.html#volume-step",a:"volume-step"},"13.27":{t:"SEEK_STEP",p:"The increment by which the playback progress is adjusted via k ...",l:"en/advanced/global.html#seek-step",a:"seek-step"},"13.28":{t:"PLAYBACK_RATE",p:"The list of built-in playback speeds, by default [0.5, 0.75, 1 ...",l:"en/advanced/global.html#playback-rate",a:"playback-rate"},"13.29":{t:"ASPECT_RATIO",p:"Built-in list of video aspect ratios, default is ['default', ' ...",l:"en/advanced/global.html#aspect-ratio",a:"aspect-ratio"},"13.30":{t:"FLIP",p:"Built-in list of video flips, defaults to ['normal', 'horizont ...",l:"en/advanced/global.html#flip",a:"flip"},"13.31":{t:"FULLSCREEN_WEB_IN_BODY",p:"When in web fullscreen, whether to mount the player under the  ...",l:"en/advanced/global.html#fullscreen-web-in-body",a:"fullscreen-web-in-body"},"13.32":{t:"LOG_VERSION",p:"Setting whether to print the player version, the default is tr ...",l:"en/advanced/global.html#log-version",a:"log-version"},"13.33":{t:"USE_RAF",p:"Setting whether to use requestAnimationFrame, the default is f ...",l:"en/advanced/global.html#use-raf",a:"use-raf"},"14.0":{t:"# Writing Plugins",p:"Once you know the player's properties, methods, and events, wr ...",l:"en/advanced/plugin.html",a:"writing-plugins"},"15.0":{t:"# Instance Properties",p:"Here, instance properties refer to the primary properties moun ...",l:"en/advanced/property.html",a:"instance-properties"},"15.1":{t:"`play`",p:`
-Type: Function
-
-Play video
-<div className="run-code&q ...`,l:"en/advanced/property.html#play",a:"play"},"15.2":{t:"`pause`",p:`
-Type: Function
-
-Pause video
-<div className="run-code& ...`,l:"en/advanced/property.html#pause",a:"pause"},"15.3":{t:"`toggle`",p:`
-Type: Function
-
-Toggle the play and pause state of the video
- ...`,l:"en/advanced/property.html#toggle",a:"toggle"},"15.4":{t:"`destroy`",p:`
-Type: Function
-Parameter: Boolean
-
-Destroy the player. Accept ...`,l:"en/advanced/property.html#destroy",a:"destroy"},"15.5":{t:"`seek`",p:`
-Type: Setter
-Parameter: Number
-
-Jump to a specific time in th ...`,l:"en/advanced/property.html#seek",a:"seek"},"15.6":{t:"`forward`",p:`
-Type: Setter
-Parameter: Number
-
-Fast forward the video time,  ...`,l:"en/advanced/property.html#forward",a:"forward"},"15.7":{t:"`backward`",p:`
-Type: Setter
-Parameter: Number
-
-Video rewind time in seconds
- ...`,l:"en/advanced/property.html#backward",a:"backward"},"15.8":{t:"`volume`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-Sets and gets the vide ...`,l:"en/advanced/property.html#volume",a:"volume"},"15.9":{t:"`url`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Set and retrieve the v ...`,l:"en/advanced/property.html#url",a:"url"},"15.10":{t:"`switch`",p:`
-Type: Setter
-Parameter: String
-
-Set the video address, which  ...`,l:"en/advanced/property.html#switch",a:"switch"},"15.11":{t:"`switchUrl`",p:`
-Type: Function
-Parameter: String
-
-Set the video address, simi ...`,l:"en/advanced/property.html#switchurl",a:"switchurl"},"15.12":{t:"`switchQuality`",p:`
-Type: Function
-Parameter: String
-
-Set video quality address,  ...`,l:"en/advanced/property.html#switchquality",a:"switchquality"},"15.13":{t:"`muted`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-Set and get whether t ...`,l:"en/advanced/property.html#muted",a:"muted"},"15.14":{t:"`currentTime`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-Set and get the curren ...`,l:"en/advanced/property.html#currenttime",a:"currenttime"},"15.15":{t:"`duration`",p:`
-Type: Getter
-
-Get the video duration
-<div className=" ...`,l:"en/advanced/property.html#duration",a:"duration"},"15.16":{t:"`screenshot`",p:`
-Type: Function
-
-Download a screenshot of the current video fr ...`,l:"en/advanced/property.html#screenshot",a:"screenshot"},"15.17":{t:"`getDataURL`",p:`
-Type: Function
-
-Gets the base64 address of the screenshot of  ...`,l:"en/advanced/property.html#getdataurl",a:"getdataurl"},"15.18":{t:"`getBlobUrl`",p:`
-Type: Function
-
-Gets the blob address of the screenshot of th ...`,l:"en/advanced/property.html#getbloburl",a:"getbloburl"},"15.19":{t:"`fullscreen`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-Set and get the playe ...`,l:"en/advanced/property.html#fullscreen",a:"fullscreen"},"15.20":{t:"`fullscreenWeb`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-Set and get the playe ...`,l:"en/advanced/property.html#fullscreenweb",a:"fullscreenweb"},"15.21":{t:"`pip`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-Set and get the playe ...`,l:"en/advanced/property.html#pip",a:"pip"},"15.22":{t:"`poster`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Set and get the video  ...`,l:"en/advanced/property.html#poster",a:"poster"},"15.23":{t:"`mini`",p:`
-Type: Setter/Getter
-Parameter: Boolean
-
-Set and get the playe ...`,l:"en/advanced/property.html#mini",a:"mini"},"15.24":{t:"`playing`",p:`
-Type: Getter
-Parameter: Boolean
-
-Get whether the video is cur ...`,l:"en/advanced/property.html#playing",a:"playing"},"15.25":{t:"`autoSize`",p:`
-Type: Function
-
-Sets whether the video should auto adjust its ...`,l:"en/advanced/property.html#autosize",a:"autosize"},"15.26":{t:"`rect`",p:`
-Type: Getter
-
-Gets the size and position information of the p ...`,l:"en/advanced/property.html#rect",a:"rect"},"15.27":{t:"`flip`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Set and get the player ...`,l:"en/advanced/property.html#flip",a:"flip"},"15.28":{t:"`playbackRate`",p:`
-Type: Setter/Getter
-Parameter: Number
-Set and get the playbac ...`,l:"en/advanced/property.html#playbackrate",a:"playbackrate"},"15.29":{t:"`aspectRatio`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Set and get the aspect ...`,l:"en/advanced/property.html#aspectratio",a:"aspectratio"},"15.30":{t:"`autoHeight`",p:`
-Type: Function
-
-When the container has only width, this attri ...`,l:"en/advanced/property.html#autoheight",a:"autoheight"},"15.31":{t:"`attr`",p:`
-Type: Function
-Parameter: String
-
-Dynamically get and set the ...`,l:"en/advanced/property.html#attr",a:"attr"},"15.32":{t:"`type`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Dynamically get and se ...`,l:"en/advanced/property.html#type",a:"type"},"15.33":{t:"`theme`",p:`
-Type: Setter/Getter
-Parameter: String
-
-Dynamically get and se ...`,l:"en/advanced/property.html#theme",a:"theme"},"15.34":{t:"`airplay`",p:`
-Type: Function
-
-Activate airplay
-<div className="run- ...`,l:"en/advanced/property.html#airplay",a:"airplay"},"15.35":{t:"`loaded`",p:`
-Type: Getter
-
-The proportion of the video that is cached, ran ...`,l:"en/advanced/property.html#loaded",a:"loaded"},"15.36":{t:"`played`",p:`
-Type: Getter
-
-The proportion of the video that has been playe ...`,l:"en/advanced/property.html#played",a:"played"},"15.37":{t:"`proxy`",p:`
-Type: Function
-
-A proxy function for DOM events, which essent ...`,l:"en/advanced/property.html#proxy",a:"proxy"},"15.38":{t:"`query`",p:`
-Type: Function
-
-DOM query function, similar to document.query ...`,l:"en/advanced/property.html#query",a:"query"},"15.39":{t:"`video`",p:`
-Type: Element
-
-A shortcut to return the video element of the  ...`,l:"en/advanced/property.html#video",a:"video"},"15.40":{t:"`cssVar`",p:`
-Type: Function
-
-Dynamically getting or setting css variables
- ...`,l:"en/advanced/property.html#cssvar",a:"cssvar"},"15.41":{t:"`quality`",p:`
-Type: Setter
-Parameter: Array
-
-Dynamically setting the list o ...`,l:"en/advanced/property.html#quality",a:"quality"},"15.42":{t:"`thumbnails`",p:`
-Type: Setter/Getter
-Parameter: Object
-
-Dynamically set thumbn ...`,l:"en/advanced/property.html#thumbnails",a:"thumbnails"},"15.43":{t:"`subtitleOffset`",p:`
-Type: Setter/Getter
-Parameter: Number
-
-Dynamically set subtit ...`,l:"en/advanced/property.html#subtitleoffset",a:"subtitleoffset"},"16.0":{t:"# Context Menu",p:"",l:"en/component/contextmenu.html",a:"context-menu"},"16.1":{t:"Configuration",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-disable
-Boolean
-Whether to di ...`,l:"en/component/contextmenu.html#configuration",a:"configuration"},"16.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#creation",a:"creation"},"16.3":{t:"Add",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#add",a:"add"},"16.4":{t:"Delete",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#delete",a:"delete"},"16.5":{t:"Updates",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/contextmenu.html#updates",a:"updates"},"17.0":{t:"# Controller",p:"",l:"en/component/controls.html",a:"controller"},"17.1":{t:"Configuration",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-disable
-Boolean
-Whether to di ...`,l:"en/component/controls.html#configuration",a:"configuration"},"17.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#creation",a:"creation"},"17.3":{t:"Adding",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#adding",a:"adding"},"17.4":{t:"Delete",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#delete",a:"delete"},"17.5":{t:"Update",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/controls.html#update",a:"update"},"18.0":{t:"# Layer",p:"",l:"en/component/layers.html",a:"layer"},"18.1":{t:"Configuration",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-disable
-Boolean
-Whether to di ...`,l:"en/component/layers.html#configuration",a:"configuration"},"18.2":{t:"Creation",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#creation",a:"creation"},"18.3":{t:"Add",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#add",a:"add"},"18.4":{t:"Delete",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#delete",a:"delete"},"18.5":{t:"Update",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/layers.html#update",a:"update"},"19.0":{t:"# Settings Panel",p:"",l:"en/component/setting.html",a:"settings-panel"},"19.1":{t:"Built-in",p:"First, open the settings panel, and then it comes with four bu ...",l:"en/component/setting.html#built-in",a:"built-in"},"19.2":{t:"Create - Button",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-html
-String, Element
-Item DOM ...`,l:"en/component/setting.html#create-button",a:"create-button"},"19.3":{t:"Create - Selection List",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-html
-String, Element
-Item DOM ...`,l:"en/component/setting.html#create-selection-list",a:"create-selection-list"},"19.4":{t:"Creating - Nested Lists",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#creating-nested-lists",a:"creating-nested-lists"},"19.5":{t:"Create - Toggle Button",p:`
-
-
-Property
-Type
-Description
-
-
-
-
-html
-String, Element
-Element' ...`,l:"en/component/setting.html#create-toggle-button",a:"create-toggle-button"},"19.6":{t:"Create - Range Slider",p:`
-
-
-Attribute
-Type
-Description
-
-
-
-
-html
-String, Element
-The ele ...`,l:"en/component/setting.html#create-range-slider",a:"create-range-slider"},"19.7":{t:"Add",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#add",a:"add"},"19.8":{t:"Delete",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#delete",a:"delete"},"19.9":{t:"Updates",p:"<div className="run-code">▶ Run Code</div&g ...",l:"en/component/setting.html#updates",a:"updates"},"20.0":{t:"# Installation and Usage",p:"",l:"en/index.html",a:"installation-and-usage"},"20.1":{t:"Installation",p:`::: code-group
-npm install artplayer
-
-yarn add artplayer
-
-pnpm ...`,l:"en/index.html#installation",a:"installation"},"20.2":{t:"`CDN`",p:`::: code-group
-https://cdn.jsdelivr.net/npm/artplayer/dist/art ...`,l:"en/index.html#cdn",a:"cdn"},"20.3":{t:"Usage",p:`::: code-group
-<html>
-    <head>
-        <title ...`,l:"en/index.html#usage",a:"usage"},"20.4":{t:"`Vue.js`",p:`::: code-group
-<template>
-  <div ref="$container ...`,l:"en/index.html#vue-js",a:"vue-js"},"20.5":{t:"`React.js`",p:`::: code-group
-import Artplayer from 'artplayer'
-import { useE ...`,l:"en/index.html#react-js",a:"react-js"},"20.6":{t:"TypeScript",p:`Importing Artplayer will automatically import artplayer.d.ts
-`,l:"en/index.html#typescript",a:"typescript"},"20.7":{t:"Vue.js",p:`
-
-`,l:"en/index.html#vue-js",a:"vue-js"},"20.8":{t:"React.js",p:`import Artplayer from 'artplayer';
-const art = useRef<Artpl ...`,l:"en/index.html#react-js",a:"react-js"},"20.9":{t:"Option",p:`You can also use the option type
-import Artplayer, { type Opti ...`,l:"en/index.html#option",a:"option"},"20.10":{t:"JavaScript",p:"Sometimes your js file may lose the TypeScript type hints, in  ...",l:"en/index.html#javascript",a:"javascript"},"20.11":{t:"Ancient Browsers",p:"The production build of artplayer.js is only compatible with t ...",l:"en/index.html#ancient-browsers",a:"ancient-browsers"},"20.12":{t:"ECMAScript Module",p:`::: tip ESM Demo:
-https://artplayer.org/esm.html
-:::
-Starting  ...`,l:"en/index.html#ecmascript-module",a:"ecmascript-module"},"20.13":{t:"Custom userAgent",p:"Currently, the determination of mobile devices is not accurate ...",l:"en/index.html#custom-useragent",a:"custom-useragent"},"21.0":{t:"# Language Settings",p:`::: danger
-Given the increasing number of bundled multilingual ...`,l:"en/start/i18n.html",a:"language-settings"},"21.1":{t:"Default Languages",p:"The default languages are: en, zh-cn, which do not require man ...",l:"en/start/i18n.html#default-languages",a:"default-languages"},"21.2":{t:"Importing Languages",p:"Language files before packaging are located in: artplayer/src/ ...",l:"en/start/i18n.html#importing-languages",a:"importing-languages"},"21.3":{t:"Add Language",p:`var art = new Artplayer({
-    container: '.artplayer-app',
-    ...`,l:"en/start/i18n.html#add-language",a:"add-language"},"21.4":{t:"Modify Language",p:`import zhTw from 'artplayer/i18n/zh-tw';
-
-var art = new Artpla ...`,l:"en/start/i18n.html#modify-language",a:"modify-language"},"22.0":{t:"# Basic Options",p:"",l:"en/start/option.html",a:"basic-options"},"22.1":{t:"`container`",p:`
-Type: String, Element
-Default: #artplayer
-
-The DOM container  ...`,l:"en/start/option.html#container",a:"container"},"22.2":{t:"`url`",p:`
-Type: String
-Default: ''
-
-The video source address
-<div cl ...`,l:"en/start/option.html#url",a:"url"},"22.3":{t:"`id`",p:`
-Type: String
-Default: ''
-
-The unique identifier of the player ...`,l:"en/start/option.html#id",a:"id"},"22.4":{t:"`onReady`",p:`
-Type: Function
-Default: undefined
-
-The constructor accepts a  ...`,l:"en/start/option.html#onready",a:"onready"},"22.5":{t:"`poster`",p:`
-Type: String
-Default: ''
-
-The poster of the video, which only ...`,l:"en/start/option.html#poster",a:"poster"},"22.6":{t:"`theme`",p:`
-Type: String
-Default: #f00
-
-Player theme color, currently use ...`,l:"en/start/option.html#theme",a:"theme"},"22.7":{t:"`volume`",p:`
-Type: Number
-Default: 0.7
-
-The default volume of the player
-& ...`,l:"en/start/option.html#volume",a:"volume"},"22.8":{t:"`isLive`",p:`
-Type: Boolean
-Default: false
-
-Use live mode, which will hide  ...`,l:"en/start/option.html#islive",a:"islive"},"22.9":{t:"`muted`",p:`
-Type: Boolean
-Default: false
-
-Whether to mute by default
-< ...`,l:"en/start/option.html#muted",a:"muted"},"22.10":{t:"`autoplay`",p:`
-Type: Boolean
-Default: false
-
-Whether to play automatically
-
- ...`,l:"en/start/option.html#autoplay",a:"autoplay"},"22.11":{t:"`autoSize`",p:`
-Type: Boolean
-Default: false
-
-The size of the player will by  ...`,l:"en/start/option.html#autosize",a:"autosize"},"22.12":{t:"`autoMini`",p:`
-Type: Boolean
-Default: false
-
-Automatically enter mini mode w ...`,l:"en/start/option.html#automini",a:"automini"},"22.13":{t:"`loop`",p:`
-Type: Boolean
-Default: false
-
-Whether to loop the video
-<d ...`,l:"en/start/option.html#loop",a:"loop"},"22.14":{t:"`flip`",p:`
-Type: Boolean
-Default: false
-
-Whether to show the video flip  ...`,l:"en/start/option.html#flip",a:"flip"},"22.15":{t:"`playbackRate`",p:`
-Type: Boolean
-Default: false
-
-Whether to show the playback sp ...`,l:"en/start/option.html#playbackrate",a:"playbackrate"},"22.16":{t:"`aspectRatio`",p:`
-Type: Boolean
-Default: false
-
-Displays the video aspect ratio ...`,l:"en/start/option.html#aspectratio",a:"aspectratio"},"22.17":{t:"`screenshot`",p:`
-Type: Boolean
-Default: false
-
-Whether to show the screenshot  ...`,l:"en/start/option.html#screenshot",a:"screenshot"},"22.18":{t:"`setting`",p:`
-Type: Boolean
-Default: false
-
-Display the toggle button for t ...`,l:"en/start/option.html#setting",a:"setting"},"22.19":{t:"`hotkey`",p:`
-Type: Boolean
-Default: true
-
-Whether to use hotkeys
-<div c ...`,l:"en/start/option.html#hotkey",a:"hotkey"},"22.20":{t:"`pip`",p:`
-Type: Boolean
-Default: false
-Show the Picture in Picture swit ...`,l:"en/start/option.html#pip",a:"pip"},"22.21":{t:"`mutex`",p:`
-Type: Boolean
-Default: true
-
-If there are multiple players on ...`,l:"en/start/option.html#mutex",a:"mutex"},"22.22":{t:"`fullscreen`",p:`
-Type: Boolean
-Default: false
-Display the Window Fullscreen bu ...`,l:"en/start/option.html#fullscreen",a:"fullscreen"},"22.23":{t:"`fullscreenWeb`",p:`
-Type: Boolean
-Default: false
-
-Display the Web Fullscreen butt ...`,l:"en/start/option.html#fullscreenweb",a:"fullscreenweb"},"22.24":{t:"`subtitleOffset`",p:`
-
-Type: Boolean
-
-
-Default: false
-
-
-Subtitle time offset, the r ...`,l:"en/start/option.html#subtitleoffset",a:"subtitleoffset"},"22.25":{t:"`miniProgressBar`",p:`
-Type: Boolean
-Default: false
-
-Mini progress bar, only appears ...`,l:"en/start/option.html#miniprogressbar",a:"miniprogressbar"},"22.26":{t:"`useSSR`",p:`
-Type: Boolean
-Default: false
-
-Whether to use SSR (Server-Side ...`,l:"en/start/option.html#usessr",a:"usessr"},"22.27":{t:"`playsInline`",p:`
-Type: Boolean
-Default: true
-
-Whether to use playsInline mode  ...`,l:"en/start/option.html#playsinline",a:"playsinline"},"22.28":{t:"`layers`",p:`
-Type: Array
-Default: []
-
-Initializes custom layers
-<div cl ...`,l:"en/start/option.html#layers",a:"layers"},"22.29":{t:"`settings`",p:`
-Type: Array
-Default: []
-
-Initializes custom settings panel
-&l ...`,l:"en/start/option.html#settings",a:"settings"},"22.30":{t:"`contextmenu`",p:`
-Type: Array
-Default: []
-
-Initialize custom context menu
-<d ...`,l:"en/start/option.html#contextmenu",a:"contextmenu"},"22.31":{t:"`controls`",p:`
-Type: Array
-Default: []
-
-Initializes custom bottom control ba ...`,l:"en/start/option.html#controls",a:"controls"},"22.32":{t:"`quality`",p:`
-Type: Array
-Default: []
-
-Whether to show the quality selectio ...`,l:"en/start/option.html#quality",a:"quality"},"22.33":{t:"`highlight`",p:`
-Type: Array
-Default: []
-
-Show highlight information on the pr ...`,l:"en/start/option.html#highlight",a:"highlight"},"22.34":{t:"`plugins`",p:`
-Type: Array
-Default: []
-
-Initialize custom plugins
-<div cl ...`,l:"en/start/option.html#plugins",a:"plugins"},"22.35":{t:"`thumbnails`",p:`
-Type: Object
-Default: {}
-
-Set thumbnails on the progress bar
- ...`,l:"en/start/option.html#thumbnails",a:"thumbnails"},"22.36":{t:"`subtitle`",p:`
-Type: Object
-Default: {}
-
-Set the video subtitles, supporting ...`,l:"en/start/option.html#subtitle",a:"subtitle"},"22.37":{t:"`moreVideoAttr`",p:`
-Type: Object
-Default: {'controls': false, 'preload': 'metadat ...`,l:"en/start/option.html#morevideoattr",a:"morevideoattr"},"22.38":{t:"`icons`",p:`
-Type: Object
-Default: {}
-
-Used to replace default icons, supp ...`,l:"en/start/option.html#icons",a:"icons"},"22.39":{t:"`type`",p:`
-Type: String
-Default: ''
-
-Used to specify the format of the v ...`,l:"en/start/option.html#type",a:"type"},"22.40":{t:"`customType`",p:`
-Type: Object
-Default: {}
-
-Matches the video's type to delegat ...`,l:"en/start/option.html#customtype",a:"customtype"},"22.41":{t:"`lang`",p:`
-Type: String
-Default: navigator.language.toLowerCase()
-
-Defau ...`,l:"en/start/option.html#lang",a:"lang"},"22.42":{t:"`i18n`",p:`
-Type: Object
-Default: {}
-
-Custom i18n configuration, which wi ...`,l:"en/start/option.html#i18n",a:"i18n"},"22.43":{t:"`lock`",p:`
-Type: Boolean
-Default: false
-
-Whether to display a lock butto ...`,l:"en/start/option.html#lock",a:"lock"},"22.44":{t:"`gesture`",p:`
-Type: Boolean
-Default: true
-
-Whether to enable gesture events ...`,l:"en/start/option.html#gesture",a:"gesture"},"22.45":{t:"`fastForward`",p:`
-Type: Boolean
-Default: false
-
-Whether to add fast forward fun ...`,l:"en/start/option.html#fastforward",a:"fastforward"},"22.46":{t:"`autoPlayback`",p:`
-Type: Boolean
-Default: false
-
-Whether to use the automatic pl ...`,l:"en/start/option.html#autoplayback",a:"autoplayback"},"22.47":{t:"`autoOrientation`",p:`
-Type: Boolean
-Default: false
-
-Whether to rotate the player on ...`,l:"en/start/option.html#autoorientation",a:"autoorientation"},"22.48":{t:"`airplay`",p:`
-Type: Boolean
-Default: false
-
-Whether to display the airplay  ...`,l:"en/start/option.html#airplay",a:"airplay"},"22.49":{t:"`cssVar`",p:`
-Type: Object
-Default: {}
-
-Used to change built-in CSS variabl ...`,l:"en/start/option.html#cssvar",a:"cssvar"},"22.50":{t:"`proxy`",p:`
-Type: function
-Default: undefined
-
-The function can return a  ...`,l:"en/start/option.html#proxy",a:"proxy"},"23.0":{t:"# 安装使用",p:"",l:"index.html",a:"安装使用"},"23.1":{t:"安装",p:`::: code-group
-npm install artplayer
-
-yarn add artplayer
-
-pnpm ...`,l:"index.html#安装",a:"安装"},"23.2":{t:"`CDN`",p:`::: code-group
-https://cdn.jsdelivr.net/npm/artplayer/dist/art ...`,l:"index.html#cdn",a:"cdn"},"23.3":{t:"使用",p:`::: code-group
-<html>
-    <head>
-        <title ...`,l:"index.html#使用",a:"使用"},"23.4":{t:"`Vue.js`",p:`::: code-group
-<template>
-  <div ref="$container ...`,l:"index.html#vue-js",a:"vue-js"},"23.5":{t:"`React.js`",p:`::: code-group
-import Artplayer from 'artplayer'
-import { useE ...`,l:"index.html#react-js",a:"react-js"},"23.6":{t:"TypeScript",p:`导入 Artplayer 时会自动导入的 artplayer.d.ts
-`,l:"index.html#typescript",a:"typescript"},"23.7":{t:"Vue.js",p:`
-
-`,l:"index.html#vue-js",a:"vue-js"},"23.8":{t:"React.js",p:`import Artplayer from 'artplayer';
-const art = useRef<Artpl ...`,l:"index.html#react-js",a:"react-js"},"23.9":{t:"Option",p:`你也可以使用选项的类型
-import Artplayer, { type Option } from 'artplayer' ...`,l:"index.html#option",a:"option"},"23.10":{t:"JavaScript",p:`有时你的 js 文件会丢失 TypeScript 的类型提示,这时候你可以手动导入类型
-变量:
-/**
- * @type { ...`,l:"index.html#javascript",a:"javascript"},"23.11":{t:"古老的浏览器",p:`生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version
-对于 ...`,l:"index.html#古老的浏览器",a:"古老的浏览器"},"23.12":{t:"ECMAScript Module",p:`::: tip ESM Demo:
-https://artplayer.org/esm.html
-:::
-从 5.2.6 开 ...`,l:"index.html#ecmascript-module",a:"ecmascript-module"},"23.13":{t:"自定义 userAgent",p:"目前对于是否移动设备的判断并不准确,有时候希望通过改变 userAgent 来调整播放器的UI, 所以在 5.2.4 开始新 ...",l:"index.html#自定义-useragent",a:"自定义-useragent"},"24.0":{t:"# 弹幕库",p:"",l:"plugin/danmuku.html",a:"弹幕库"},"24.1":{t:"演示",p:`👉 查看完整演示
-`,l:"plugin/danmuku.html#演示",a:"演示"},"24.2":{t:"安装",p:`::: code-group
-npm install artplayer-plugin-danmuku
-
-yarn add  ...`,l:"plugin/danmuku.html#安装",a:"安装"},"24.3":{t:"CDN",p:`::: code-group
-https://cdn.jsdelivr.net/npm/artplayer-plugin-d ...`,l:"plugin/danmuku.html#cdn",a:"cdn"},"24.4":{t:"弹幕结构",p:`每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数
-{
-    t ...`,l:"plugin/danmuku.html#弹幕结构",a:"弹幕结构"},"24.5":{t:"全部选项",p:`只有danmuku是必须的参数,其余都是非必填
-{
-    danmuku: [], // 弹幕数据
-    speed:  ...`,l:"plugin/danmuku.html#全部选项",a:"全部选项"},"24.6":{t:"生命周期",p:`来自用户输入的弹幕:
-beforeEmit -> filter -> beforeVisible -> a ...`,l:"plugin/danmuku.html#生命周期",a:"生命周期"},"24.7":{t:"使用弹幕数组",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#使用弹幕数组",a:"使用弹幕数组"},"24.8":{t:"使用弹幕 XML",p:`弹幕 XML 文件,和 Bilibili 网站的弹幕格式一致
-<div className="run-cod ...`,l:"plugin/danmuku.html#使用弹幕-xml",a:"使用弹幕-xml"},"24.9":{t:"使用异步返回",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#使用异步返回",a:"使用异步返回"},"24.10":{t:"`hide/show`",p:`通过方法 hide 和 show 进行隐藏或者显示弹幕
-<div className="run-code&q ...`,l:"plugin/danmuku.html#hide-show",a:"hide-show"},"24.11":{t:"`isHide`",p:`通过属性 isHide 判断当前弹幕是隐藏或者显示
-<div className="run-code&quo ...`,l:"plugin/danmuku.html#ishide",a:"ishide"},"24.12":{t:"`emit`",p:`通过方法 emit 发送一条实时弹幕
-<div className="run-code" data ...`,l:"plugin/danmuku.html#emit",a:"emit"},"24.13":{t:"`config`",p:`通过方法 config 实时改变弹幕配置
-<div className="run-code" da ...`,l:"plugin/danmuku.html#config",a:"config"},"24.14":{t:"`load`",p:`通过 load 方法可以重载弹幕库,或者切换新弹幕库,或者追加新的弹幕库
-<div className="r ...`,l:"plugin/danmuku.html#load",a:"load"},"24.15":{t:"`reset`",p:`用于清空当前显示的弹幕
-<div className="run-code" data-libs=& ...`,l:"plugin/danmuku.html#reset",a:"reset"},"24.16":{t:"`mount`",p:`在初始化弹幕插件的时候,是可以指定弹幕发射器的挂载位置的,默认是挂载在控制栏的中部,你也可以把它挂载在播放器以外的地方。
-当 ...`,l:"plugin/danmuku.html#mount",a:"mount"},"24.17":{t:"`option`",p:`用于获取当前弹幕配置
-<div className="run-code" data-libs=&q ...`,l:"plugin/danmuku.html#option",a:"option"},"24.18":{t:"事件",p:"<div className="run-code" data-libs="./uncom ...",l:"plugin/danmuku.html#事件",a:"事件"},"25.0":{t:"# 语言设置",p:`::: danger
-鉴于捆绑的多国语言越来越多, 从 5.1.0 版本开始, artplayer.js 核心代码除了包含  ...`,l:"start/i18n.html",a:"语言设置"},"25.1":{t:"默认语言",p:`默认语言有: en, zh-cn, 无需手动导入
-var art = new Artplayer({
-    contain ...`,l:"start/i18n.html#默认语言",a:"默认语言"},"25.2":{t:"导入语言",p:`打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言
-打包后的语言文件存放于: a ...`,l:"start/i18n.html#导入语言",a:"导入语言"},"25.3":{t:"新增语言",p:`var art = new Artplayer({
-    container: '.artplayer-app',
-    ...`,l:"start/i18n.html#新增语言",a:"新增语言"},"25.4":{t:"修改语言",p:`import zhTw from 'artplayer/i18n/zh-tw';
-
-var art = new Artpla ...`,l:"start/i18n.html#修改语言",a:"修改语言"},"26.0":{t:"# 基础选项",p:"",l:"start/option.html",a:"基础选项"},"26.1":{t:"`container`",p:`
-Type: String, Element
-Default: #artplayer
-
-播放器挂载的 DOM 容器
-< ...`,l:"start/option.html#container",a:"container"},"26.2":{t:"`url`",p:`
-Type: String
-Default: ''
-
-视频源地址
-<div className="run-c ...`,l:"start/option.html#url",a:"url"},"26.3":{t:"`id`",p:`
-Type: String
-Default: ''
-
-播放器的唯一标识,目前只用于记忆播放 autoplayback
-< ...`,l:"start/option.html#id",a:"id"},"26.4":{t:"`onReady`",p:`
-Type: Function
-Default: undefined
-
-构造函数接受一个函数作为第二个参数,播放器初始化成功 ...`,l:"start/option.html#onready",a:"onready"},"26.5":{t:"`poster`",p:`
-Type: String
-Default: ''
-
-视频的海报,只会出现在播放器初始化且未播放的状态下
-<div c ...`,l:"start/option.html#poster",a:"poster"},"26.6":{t:"`theme`",p:`
-Type: String
-Default: #f00
-
-播放器主题颜色,目前用于 进度条 和 高亮元素 上
-<div ...`,l:"start/option.html#theme",a:"theme"},"26.7":{t:"`volume`",p:`
-Type: Number
-Default: 0.7
-
-播放器的默认音量
-<div className="r ...`,l:"start/option.html#volume",a:"volume"},"26.8":{t:"`isLive`",p:`
-Type: Boolean
-Default: false
-
-使用直播模式,会隐藏进度条和播放时间
-<div clas ...`,l:"start/option.html#islive",a:"islive"},"26.9":{t:"`muted`",p:`
-Type: Boolean
-Default: false
-
-是否默认静音
-<div className=" ...`,l:"start/option.html#muted",a:"muted"},"26.10":{t:"`autoplay`",p:`
-Type: Boolean
-Default: false
-
-是否自动播放
-<div className=" ...`,l:"start/option.html#autoplay",a:"autoplay"},"26.11":{t:"`autoSize`",p:`
-Type: Boolean
-Default: false
-
-播放器的尺寸默认会填充整个 container 容器尺寸,所以 ...`,l:"start/option.html#autosize",a:"autosize"},"26.12":{t:"`autoMini`",p:`
-Type: Boolean
-Default: false
-
-当播放器滚动到浏览器视口以外时,自动进入 迷你播放 模式
-&l ...`,l:"start/option.html#automini",a:"automini"},"26.13":{t:"`loop`",p:`
-Type: Boolean
-Default: false
-
-是否循环播放
-<div className=" ...`,l:"start/option.html#loop",a:"loop"},"26.14":{t:"`flip`",p:`
-Type: Boolean
-Default: false
-
-是否显示视频翻转功能,目前只出现在 设置面板 和 右键菜单 里 ...`,l:"start/option.html#flip",a:"flip"},"26.15":{t:"`playbackRate`",p:`
-Type: Boolean
-Default: false
-
-是否显示视频播放速度功能,会出现在 设置面板 和 右键菜单 里 ...`,l:"start/option.html#playbackrate",a:"playbackrate"},"26.16":{t:"`aspectRatio`",p:`
-Type: Boolean
-Default: false
-
-是否显示视频长宽比功能,会出现在 设置面板 和 右键菜单 里
- ...`,l:"start/option.html#aspectratio",a:"aspectratio"},"26.17":{t:"`screenshot`",p:`
-Type: Boolean
-Default: false
-
-是否在底部控制栏里显示 视频截图 功能
-<div cla ...`,l:"start/option.html#screenshot",a:"screenshot"},"26.18":{t:"`setting`",p:`
-Type: Boolean
-Default: false
-
-是否在底部控制栏里显示 设置面板 的开关按钮
-<div  ...`,l:"start/option.html#setting",a:"setting"},"26.19":{t:"`hotkey`",p:`
-Type: Boolean
-Default: true
-
-是否使用快捷键
-<div className=" ...`,l:"start/option.html#hotkey",a:"hotkey"},"26.20":{t:"`pip`",p:`
-Type: Boolean
-Default: false
-
-是否在底部控制栏里显示 画中画 的开关按钮
-<div c ...`,l:"start/option.html#pip",a:"pip"},"26.21":{t:"`mutex`",p:`
-Type: Boolean
-Default: true
-
-假如页面里同时存在多个播放器,是否只能让一个播放器播放
-< ...`,l:"start/option.html#mutex",a:"mutex"},"26.22":{t:"`fullscreen`",p:`
-Type: Boolean
-Default: false
-
-是否在底部控制栏里显示播放器 窗口全屏 按钮
-<div  ...`,l:"start/option.html#fullscreen",a:"fullscreen"},"26.23":{t:"`fullscreenWeb`",p:`
-Type: Boolean
-Default: false
-
-是否在底部控制栏里显示播放器 网页全屏 按钮
-<div  ...`,l:"start/option.html#fullscreenweb",a:"fullscreenweb"},"26.24":{t:"`subtitleOffset`",p:`
-Type: Boolean
-Default: false
-
-字幕时间偏移,范围在 [-5s, 5s],出现在 设置面板 里 ...`,l:"start/option.html#subtitleoffset",a:"subtitleoffset"},"26.25":{t:"`miniProgressBar`",p:`
-Type: Boolean
-Default: false
-
-迷你进度条,只在播放器失去焦点后且正在播放时出现
-<di ...`,l:"start/option.html#miniprogressbar",a:"miniprogressbar"},"26.26":{t:"`useSSR`",p:`
-Type: Boolean
-Default: false
-
-是否使用 SSR 挂载模式,假如你希望在播放器挂载前,就提前渲 ...`,l:"start/option.html#usessr",a:"usessr"},"26.27":{t:"`playsInline`",p:`
-Type: Boolean
-Default: true
-
-在移动端是否使用 playsInline 模式
-<div  ...`,l:"start/option.html#playsinline",a:"playsinline"},"26.28":{t:"`layers`",p:`
-Type: Array
-Default: []
-
-初始化自定义的 层
-<div className="ru ...`,l:"start/option.html#layers",a:"layers"},"26.29":{t:"`settings`",p:`
-Type: Array
-Default: []
-
-初始化自定义的 设置面板
-<div className=" ...`,l:"start/option.html#settings",a:"settings"},"26.30":{t:"`contextmenu`",p:`
-Type: Array
-Default: []
-
-初始化自定义的 右键菜单
-<div className=" ...`,l:"start/option.html#contextmenu",a:"contextmenu"},"26.31":{t:"`controls`",p:`
-Type: Array
-Default: []
-
-初始化自定义的底部 控制栏
-<div className=&quo ...`,l:"start/option.html#controls",a:"controls"},"26.32":{t:"`quality`",p:`
-Type: Array
-Default: []
-
-是否在底部控制栏里显示 画质选择 列表
-
-
-
-属性
-类型
-描述
-
-
-
-
- ...`,l:"start/option.html#quality",a:"quality"},"26.33":{t:"`highlight`",p:`
-Type: Array
-Default: []
-
-在进度条上显示 高亮信息
-
-
-
-属性
-类型
-描述
-
-
-
-
-time
-Nu ...`,l:"start/option.html#highlight",a:"highlight"},"26.34":{t:"`plugins`",p:`
-Type: Array
-Default: []
-
-初始化自定义的 插件
-<div className="r ...`,l:"start/option.html#plugins",a:"plugins"},"26.35":{t:"`thumbnails`",p:`
-Type: Object
-Default: {}
-
-在进度条上设置 预览图
-
-
-
-属性
-类型
-描述
-
-
-
-
-url
-Str ...`,l:"start/option.html#thumbnails",a:"thumbnails"},"26.36":{t:"`subtitle`",p:`
-Type: Object
-Default: {}
-
-设置视频的字幕,支持字幕格式:vtt, srt, ass
-
-
-
-属性
- ...`,l:"start/option.html#subtitle",a:"subtitle"},"26.37":{t:"`moreVideoAttr`",p:`
-Type: Object
-Default: {'controls': false,'preload': 'metadata ...`,l:"start/option.html#morevideoattr",a:"morevideoattr"},"26.38":{t:"`icons`",p:`
-Type: Object
-Default: {}
-
-用于替换默认图标,支持 Html 字符串和 HTMLElement
-& ...`,l:"start/option.html#icons",a:"icons"},"26.39":{t:"`type`",p:`
-Type: String
-Default: ''
-
-用于指明视频的格式,需要配合 customType 一起使用,默认视频 ...`,l:"start/option.html#type",a:"type"},"26.40":{t:"`customType`",p:`
-Type: Object
-Default: {}
-
-通过视频的 type 进行匹配,把视频解码权交给第三方程序进行处理,处 ...`,l:"start/option.html#customtype",a:"customtype"},"26.41":{t:"`lang`",p:`
-Type: String
-Default: navigator.language.toLowerCase()
-
-默认显示语 ...`,l:"start/option.html#lang",a:"lang"},"26.42":{t:"`i18n`",p:`
-Type: Object
-Default: {}
-
-自定义 i18n 配置,该配置会和自带的 i18n 进行深度合并
-新增 ...`,l:"start/option.html#i18n",a:"i18n"},"26.43":{t:"`lock`",p:`
-Type: Boolean
-Default: false
-
-是否在移动端显示一个 锁定按钮 ,用于隐藏底部 控制栏
-< ...`,l:"start/option.html#lock",a:"lock"},"26.44":{t:"`gesture`",p:`
-Type: Boolean
-Default: true
-
-是否在移动端启用视频元素上的手势事件
-<div class ...`,l:"start/option.html#gesture",a:"gesture"},"26.45":{t:"`fastForward`",p:`
-Type: Boolean
-Default: false
-
-是否在移动端添加长按视频快进功能
-<div classN ...`,l:"start/option.html#fastforward",a:"fastforward"},"26.46":{t:"`autoPlayback`",p:`
-Type: Boolean
-Default: false
-
-是否使用自动 回放功能
-<div className=& ...`,l:"start/option.html#autoplayback",a:"autoplayback"},"26.47":{t:"`autoOrientation`",p:`
-Type: Boolean
-Default: false
-
-是否在移动端的网页全屏时,根据视频尺寸和视口尺寸,旋转播放器
- ...`,l:"start/option.html#autoorientation",a:"autoorientation"},"26.48":{t:"`airplay`",p:`
-Type: Boolean
-Default: false
-
-是否显示 airplay 按钮,当前只有部分浏览器支持该功能
- ...`,l:"start/option.html#airplay",a:"airplay"},"26.49":{t:"`cssVar`",p:`
-Type: Object
-Default: {}
-
-用于改变内置的css变量
-<div className=&quo ...`,l:"start/option.html#cssvar",a:"cssvar"},"26.50":{t:"`proxy`",p:`
-Type: function
-Default: undefined
-
-函数可以返回一个第三方的 HTMLCanvasEle ...`,l:"start/option.html#proxy",a:"proxy"}},n={previewLength:62,buttonLabel:"Search",placeholder:"Search docs",allow:[],ignore:[]},a={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:n};export{a as default};
diff --git a/docs/document/assets/en_advanced_built-in.md.CY71IZlq.js b/docs/document/assets/en_advanced_built-in.md.XdT81JC0.js
similarity index 69%
rename from docs/document/assets/en_advanced_built-in.md.CY71IZlq.js
rename to docs/document/assets/en_advanced_built-in.md.XdT81JC0.js
index eab2c200a..1ed66397b 100644
--- a/docs/document/assets/en_advanced_built-in.md.CY71IZlq.js
+++ b/docs/document/assets/en_advanced_built-in.md.XdT81JC0.js
@@ -1,15 +1,15 @@
-import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Advanced Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/built-in.md","filePath":"en/advanced/built-in.md","lastUpdated":1750384414000}'),p={name:"en/advanced/built-in.md"};function t(h,a,k,r,E,d){return l(),e("div",null,a[0]||(a[0]=[s('

Advanced Properties ​

The advanced properties here refer to the secondary attributes mounted on the instance, which are less commonly used

option ​

Options for the player

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Advanced Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/built-in.md","filePath":"en/advanced/built-in.md","lastUpdated":1764426402000}'),p={name:"en/advanced/built-in.md"};function t(h,a,k,r,E,d){return l(),e("div",null,a[0]||(a[0]=[s('

Advanced Properties ​

The Advanced Properties here refer to the secondary properties attached to the instance, which are less commonly used.

option ​

The player's options.

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-console.info(art.option);

Reminder

If you directly modify this option object, the player will not respond immediately.

template ​

Manages all of the DOM elements of the player

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.option);

Note

If you directly modify this option object, the player will not respond immediately.

template ​

Manages all DOM elements of the player.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 console.info(art.template);
-console.info(art.template.$video);

Warning

To easily distinguish between DOM elements and plain objects, all DOM elements in the player are named starting with a $

Here is the definition of all DOM elements: artplayer/types/template.d.ts

events ​

Manages all DOM events in the player, which is essentially a proxy for addEventListener and removeEventListener. When using the following methods to handle events, the event will also be automatically destroyed when the player is destroyed.

  • The proxy method is used to proxy DOM events
  • The hover method is used to proxy custom hover events
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var container = document.querySelector('.artplayer-app');
+console.info(art.template.$video);

Note

To easily distinguish between DOM elements and regular objects, all DOM elements within the player are named with a $ prefix.

This is the definition of all DOM elements: artplayer/types/template.d.ts

events ​

Manages all DOM events for the player. It essentially proxies addEventListener and removeEventListener. When using the following methods to handle events, the event will be automatically destroyed when the player is destroyed.

  • The proxy method is used to proxy DOM events.
  • The hover method is used to proxy custom hover events.
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var container = document.querySelector('.artplayer-app');
 
 var art = new Artplayer({
     container: container,
@@ -17,14 +17,14 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 art.events.proxy(container, 'click', event => {
-    console.info('click', event);
+	console.info('click', event);
 });
 
 art.events.hover(container, (event) => {
     console.info('mouseenter', event);
 }, (event) => {
     console.info('mouseleave', event);
-});

Warning

If you need some DOM events to only exist during the lifecycle of the player, it is strongly recommended to use these functions to avoid causing memory leaks

storage ​

Manages the local storage of the player

  • The name attribute is used to set the cache key
  • The set method is used to set the cache
  • The get method is used to get the cache
  • The del method is used to delete the cache
  • The clear method is used to clear the cache
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

If you need DOM events that only exist during the player's lifecycle, it is strongly recommended to use these functions to avoid memory leaks.

storage ​

Manages the player's local storage.

  • The name property is used to set the cache key.
  • The set method is used to set a cache value.
  • The get method is used to get a cache value.
  • The del method is used to delete a cache value.
  • The clear method is used to clear all cache.
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -33,18 +33,18 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 const test = art.storage.get('test');
 console.info(test);
 art.storage.del('test');
-art.storage.clear();

Warning

By default, all player instances share the same localStorage, and the default key is artplayer_settings

If you want different players to use different localStorage, you can modify art.storage.name accordingly

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+art.storage.clear();

Note

By default, all player instances share the same localStorage, and the default key is artplayer_settings.

If you want different players to use different localStorage, you can modify art.storage.name.

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.storage.name = 'your-storage-key';
-art.storage.set('test', { foo: 'bar' });

icons ​

Manage all the svg icons of the player

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+art.storage.set('test', { foo: 'bar' });

icons ​

Manages all svg icons for the player.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-console.info(art.icons.loading);

This is the definition of all icons:

artplayer/types/icons.d.ts

i18n ​

Manage the player's i18n

  • The get method is used to retrieve the value of i18n
  • The update method is used to update the i18n object
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.icons.loading);

This is the definition of all icons:

artplayer/types/icons.d.ts

i18n ​

Manages the player's i18n.

  • The get method is used to get an i18n value.
  • The update method is used to update the i18n object.
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -55,14 +55,14 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     'zh-cn': {
         Play: 'Your Play'
     }
-});

WARNING

Using art.i18n.update can only update i18n after instantiation. If you want to update i18n before instantiation, please use the i18n from the basic options for the update.

notice ​

Manage the player's notices, there's only one show property used to display notices.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

WARNING

Using art.i18n.update can only update the i18n after instantiation. If you want to update the i18n before instantiation, please use the i18n option in the basic options.

notice ​

Manages the player's notifications. It only has a show property for displaying notifications.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.notice.show = 'Video Ready To Play';
-})

WARNING

To immediately hide the display of notice: art.notice.show = '';

layers ​

Manage the layers of the player

  • The add method is used for dynamically adding layers
  • The remove method is used for dynamically removing layers
  • The update method is used for dynamically updating layers
  • The show property is used to set whether to display all layers or not
  • The toggle method is used to toggle the display of all layers
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+})

WARNING

If you want to hide the notice immediately: art.notice.show = '';

layers ​

Manages the player's layers.

  • The add method is used to dynamically add a layer.
  • The remove method is used to dynamically remove a layer.
  • The update method is used to dynamically update a layer.
  • The show property is used to set whether all layers are visible.
  • The toggle method is used to toggle the visibility of all layers.
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -75,7 +75,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 	setTimeout(() => {
 		art.layers.show = false;
 	}, 1000);
-});

Component configuration Please refer to the following address:

/component/layers.html

controls ​

Manage the player's controllers

  • add method is used to dynamically add controllers
  • remove method is used to dynamically remove controllers
  • update method is used to dynamically update controllers
  • show property is used to set whether to display all controllers
  • toggle method is used to toggle the display of all controllers
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Refer to the following address for Component Configuration:

/component/layers.html

controls ​

Manages the player's controls.

  • The add method is used to dynamically add a control.

  • The remove method is used to dynamically remove a control.

  • The update method is used to dynamically update controls

  • The show property is used to set whether to display all controls

  • The toggle method is used to toggle the display of all controls

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -89,7 +89,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 	setTimeout(() => {
 		art.controls.show = false;
 	}, 1000);
-});

Component Configuration Please refer to the following address:

/component/controls.html

contextmenu ​

Manage the right-click context menu of the player

  • The add method is used to dynamically add menu items
  • The remove method is used to dynamically remove menu items
  • The update method is used to dynamically update menu items
  • The show attribute is used to set whether to show all menu items
  • The toggle method is used to switch the visibility of all menu items
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/controls.html

contextmenu ​

Manages the player's context menu

  • The add method is used to dynamically add menu items
  • The remove method is used to dynamically remove menu items
  • The update method is used to dynamically update menu items
  • The show property is used to set whether to display all menu items
  • The toggle method is used to toggle the display of all menu items
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -100,10 +100,10 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     });
 
     art.contextmenu.show = true;
-    setTimeout(() => {
-        art.contextmenu.show = false;
-    }, 1000);
-});

Component Configuration Please refer to the following address:

/component/contextmenu.html

subtitle ​

Manage the subtitle features of the player

  • url property sets and returns the current subtitle address
  • style method sets the style of the current subtitle
  • switch method sets the current subtitle address and options
  • textTrack Get the current subtitle track
  • activeCues Get the currently active subtitle list
  • cues Get the subtitle list
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+	setTimeout(() => {
+		art.contextmenu.show = false;
+	}, 1000);
+});

For Component Configuration, please refer to:

/component/contextmenu.html

subtitle ​

Manages the player's subtitle functionality

  • The url property sets and returns the current subtitle URL
  • The style method sets the style of the current subtitle
  • The switch method sets the current subtitle URL and options
  • textTrack gets the current text track
  • activeCues gets the list of currently active cues
  • cues gets the overall list of cues
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -113,7 +113,18 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     art.subtitle.style({
         color: 'red',
     });
-});

loading ​

Manage the loading layer of the player

  • show property is used to set whether to display the loading layer
  • The toggle attribute is used to toggle the display of the loading layer
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

info ​

Manages the player's information panel, commonly used to view the current status of the player and video, such as version number, resolution, duration, etc.

  • Control the panel's visibility via art.info.show
  • The triggered event is named info (see the event documentation for details)
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.info.show = true;
+
+    setTimeout(() => {
+        art.info.show = false;
+    }, 3000);
+});

loading ​

Manages the player's loading layer

  • The show property is used to set whether to display the loading layer
  • The toggle property is used to toggle the display of the loading layer
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -123,7 +134,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 	setTimeout(() => {
 		art.loading.show = false;
 	}, 1000);
-});

hotkey ​

Manage the hotkey functionality of the player

  • The add method is used to add a hotkey
  • The remove method is used to remove a hotkey
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

hotkey ​

Manages the player's hotkey functionality

  • The add method is used to add hotkeys
  • The remove method is used to remove hotkeys
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -137,17 +148,17 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
 		art.hotkey.remove(32, hotkeyEvent);
 	}, 5000);
-});

Warning

Shortcut keys will only work after the player has gained focus (e.g., after clicking on the player).

mask ​

Manage the player's mask layer

  • show property is used to set whether to display the mask layer
  • toggle property is used to toggle the display of the mask layer
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

These hotkeys only take effect after the player gains focus (e.g., after clicking on the player)

mask ​

Manages the player's mask layer

  • The show property is used to set whether to display the mask layer
  • The toggle property is used to toggle the display of the mask layer
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.mask.show = false;
-    setTimeout(() => {
-        art.mask.show = true;
-    }, 1000);
-});

setting ​

Manage the player's settings panel

  • add method is used to dynamically add a setting item
  • remove method is used to dynamically remove a setting item
  • update method is used to dynamically update a setting item
  • show property is used to set whether to display all the setting items
  • toggle method is used to toggle whether to display all the setting items
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+	setTimeout(() => {
+		art.mask.show = true;
+	}, 1000);
+});

setting ​

Manages the player's settings panel

  • The add method is used to dynamically add settings items
  • The remove method is used to dynamically remove settings items
  • The update method is used to dynamically update settings items
  • The show property is used to set whether to display all settings items
  • The toggle method is used to toggle the display of all settings items
`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -162,7 +173,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 	setTimeout(() => {
 		art.setting.show = false;
 	}, 1000);
-});

Settings Panel Please refer to the following link

/component/setting.html

plugins ​

Manage the player's plugin features, with only one method add to dynamically add plugins

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

For the Settings Panel, please refer to:

/component/setting.html

plugins ​

Manages the player's plugin functionality, with only the add method for dynamically adding plugins

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
diff --git a/docs/document/assets/en_advanced_built-in.md.CY71IZlq.lean.js b/docs/document/assets/en_advanced_built-in.md.XdT81JC0.lean.js
similarity index 76%
rename from docs/document/assets/en_advanced_built-in.md.CY71IZlq.lean.js
rename to docs/document/assets/en_advanced_built-in.md.XdT81JC0.lean.js
index 86035d1a4..15736249a 100644
--- a/docs/document/assets/en_advanced_built-in.md.CY71IZlq.lean.js
+++ b/docs/document/assets/en_advanced_built-in.md.XdT81JC0.lean.js
@@ -1 +1 @@
-import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Advanced Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/built-in.md","filePath":"en/advanced/built-in.md","lastUpdated":1750384414000}'),p={name:"en/advanced/built-in.md"};function t(h,a,k,r,E,d){return l(),e("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const g=n(p,[["render",t]]);export{o as __pageData,g as default};
+import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Advanced Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/built-in.md","filePath":"en/advanced/built-in.md","lastUpdated":1764426402000}'),p={name:"en/advanced/built-in.md"};function t(h,a,k,r,E,d){return l(),e("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const g=n(p,[["render",t]]);export{o as __pageData,g as default};
diff --git a/docs/document/assets/en_advanced_class.md.BLyA7rxa.js b/docs/document/assets/en_advanced_class.md.BLyA7rxa.js
new file mode 100644
index 000000000..d03e14117
--- /dev/null
+++ b/docs/document/assets/en_advanced_class.md.BLyA7rxa.js
@@ -0,0 +1,8 @@
+import{_ as i,c as n,o as t,ak as s,j as a}from"./chunks/framework.xxfEszSJ.js";const u=JSON.parse('{"title":"Static Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/class.md","filePath":"en/advanced/class.md","lastUpdated":1764426402000}'),l={name:"en/advanced/class.md"};function r(p,e,d,h,o,c){return t(),n("div",null,e[0]||(e[0]=[s('

Static Properties ​

Here, Static Properties refer to the top-level properties mounted on the constructor function, which are very rarely used.

instances ​

Returns an array of all player instances. This property can be useful when you need to manage multiple player instances simultaneously.

',4),a("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
console.info([...Artplayer.instances]);
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+console.info([...Artplayer.instances]);

version ​

Returns the version information of the player.

`,3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.version);

env ​

Returns the environment variables of the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.env);

build ​

Returns the build time of the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.build);

config ​

Returns the default configuration for videos.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.config);

utils ​

Returns the collection of utility functions for the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.utils);

For all utility functions, please refer to the following address:

artplayer/types/utils.d.ts

scheme ​

Returns the validation schema for player options.

',4),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.scheme);

Emitter ​

Returns the constructor function for the event emitter.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.Emitter);

validator ​

Returns the validation function for options.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.validator);

kindOf ​

Returns the utility function for type detection.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.kindOf);

html ​

Returns the html string required by the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.html);

option ​

Returns the default options for the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.option);
',1)]))}const _=i(l,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/docs/document/assets/en_advanced_class.md.C3V-LDO3.lean.js b/docs/document/assets/en_advanced_class.md.BLyA7rxa.lean.js similarity index 94% rename from docs/document/assets/en_advanced_class.md.C3V-LDO3.lean.js rename to docs/document/assets/en_advanced_class.md.BLyA7rxa.lean.js index a9d9ace0b..e4223cad0 100644 --- a/docs/document/assets/en_advanced_class.md.C3V-LDO3.lean.js +++ b/docs/document/assets/en_advanced_class.md.BLyA7rxa.lean.js @@ -1 +1 @@ -import{_ as i,c as n,o as t,ak as s,j as a}from"./chunks/framework.xxfEszSJ.js";const u=JSON.parse('{"title":"Static Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/class.md","filePath":"en/advanced/class.md","lastUpdated":1700976201000}'),l={name:"en/advanced/class.md"};function r(p,e,d,h,o,c){return t(),n("div",null,e[0]||(e[0]=[s("",4),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",4),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const _=i(l,[["render",r]]);export{u as __pageData,_ as default}; +import{_ as i,c as n,o as t,ak as s,j as a}from"./chunks/framework.xxfEszSJ.js";const u=JSON.parse('{"title":"Static Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/class.md","filePath":"en/advanced/class.md","lastUpdated":1764426402000}'),l={name:"en/advanced/class.md"};function r(p,e,d,h,o,c){return t(),n("div",null,e[0]||(e[0]=[s("",4),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",4),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",3),a("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const _=i(l,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/docs/document/assets/en_advanced_class.md.C3V-LDO3.js b/docs/document/assets/en_advanced_class.md.C3V-LDO3.js deleted file mode 100644 index e835c88b7..000000000 --- a/docs/document/assets/en_advanced_class.md.C3V-LDO3.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as i,c as n,o as t,ak as s,j as a}from"./chunks/framework.xxfEszSJ.js";const u=JSON.parse('{"title":"Static Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/class.md","filePath":"en/advanced/class.md","lastUpdated":1700976201000}'),l={name:"en/advanced/class.md"};function r(p,e,d,h,o,c){return t(),n("div",null,e[0]||(e[0]=[s('

Static Properties ​

Here, Static Properties refer to the first-level properties mounted on the constructor, which are very rarely used.

instances ​

Returns an array of all player instances. You can use this property when you want to manage multiple players at the same time.

',4),a("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
console.info([...Artplayer.instances]);
-
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});
-
-console.info([...Artplayer.instances]);

version ​

Returns the version information of the player.

`,3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.version);

env ​

Returns the environment variables of the player.

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.env);

build ​

Returns the build time of the player

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.build);

config ​

Returns the default configuration of the video

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.config);

utils ​

Returns a collection of utility functions for the player

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.utils);

For the full list of utility functions, please refer to the following address:

artplayer/types/utils.d.ts

scheme ​

Returns the validation scheme for the player options

',4),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.scheme);

Emitter ​

Returns the constructor for the event dispatcher

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.Emitter);

validator ​

Returns the validation function for options

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.validator);

kindOf ​

Returns the function tool for type checking

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.kindOf);

html ​

Returns the html string required for the player

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.html);

option ​

Returns the player's default options

',3),a("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.info(Artplayer.option);
',1)]))}const _=i(l,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/docs/document/assets/en_advanced_event.md.D5Yv5LYW.js b/docs/document/assets/en_advanced_event.md.CtQl1IYg.js similarity index 79% rename from docs/document/assets/en_advanced_event.md.D5Yv5LYW.js rename to docs/document/assets/en_advanced_event.md.CtQl1IYg.js index 02335f823..d30a20cdd 100644 --- a/docs/document/assets/en_advanced_event.md.D5Yv5LYW.js +++ b/docs/document/assets/en_advanced_event.md.CtQl1IYg.js @@ -1,4 +1,4 @@ -import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Example Events","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/event.md","filePath":"en/advanced/event.md","lastUpdated":1729435465000}'),h={name:"en/advanced/event.md"};function t(k,n,r,E,d,g){return p(),l("div",null,n[0]||(n[0]=[s("h1",{id:"example-events",tabindex:"-1"},[a("Example Events "),s("a",{class:"header-anchor",href:"#example-events","aria-label":'Permalink to "Example Events"'},"​")],-1),s("p",null,[a("Player events are divided into two types, one is the video's "),s("code",null,"native events"),a(" (prefix "),s("code",null,"video:"),a("), the other is "),s("code",null,"custom events")],-1),s("p",null,"Listening to events:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+import{_ as l,c as e,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Instance Events","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/event.md","filePath":"en/advanced/event.md","lastUpdated":1764426402000}'),h={name:"en/advanced/event.md"};function t(k,n,r,E,d,g){return p(),e("div",null,n[0]||(n[0]=[s("h1",{id:"instance-events",tabindex:"-1"},[a("Instance Events "),s("a",{class:"header-anchor",href:"#instance-events","aria-label":'Permalink to "Instance Events"'},"​")],-1),s("p",null,[a("Player events are divided into two types: "),s("code",null,"native events"),a(" (prefixed with "),s("code",null,"video:"),a(") and "),s("code",null,"custom events"),a(".")],-1),s("p",null,"Listen to an event:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -17,7 +17,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
     url: '/assets/sample/video.mp4',
 });
 
-art.emit('focus');

Remove an event:

`,2),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+art.emit('focus');

Remove an event listener:

`,2),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -27,14 +27,14 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
     art.off('ready', onReady);
 }
 
-art.on('ready', onReady);

For a full list of events, please refer to the following address:

artplayer/types/events.d.ts

ready ​

Triggered when the player is able to play for the first time

`,4),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+art.on('ready', onReady);

For a complete list of events, please refer to:

artplayer/types/events.d.ts

ready ​

Triggered when the player is ready for the first time

`,4),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     console.info('ready');
-});

restart ​

Triggered when the player switches the address and is able to play

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

restart ​

Triggered when the player switches URL and becomes playable

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -59,7 +59,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('play', () => {
     console.info('play');
-});

hotkey ​

Triggered when a hotkey on the player is pressed

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

hotkey ​

Triggered when a hotkey is pressed on the player

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -105,42 +105,51 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('click', (event) => {
     console.info('click', event);
-});

error ​

Triggered when an error occurs while the player is loading the video

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

error ​

Triggered when an error occurs while loading the video

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
 });
 
 art.on('error', (error, reconnectTime) => {
     console.info(error, reconnectTime);
-});

hover ​

Triggered when the player is hovered or unhovered by the mouse

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('hover', (state, event) => {
-    console.info('hover', state, event);
-});

mousemove ​

Triggered when the mouse moves over the player

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+## \`hover\`
+
+Triggered when the mouse enters or leaves the player
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{6}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('hover', (state, event) => {
+    console.info('hover', state, event);
+});

mousemove ​

Triggered when the mouse moves over the player

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('mousemove', (event) => {
     console.info('mousemove', event);
-});

resize ​

Triggered when the player size changes

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

resize ​

Triggered when the player's dimensions change

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('resize', () => {
     console.info('resize');
-});

view ​

Triggered when the player appears in the viewport

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

view ​

Triggered when the player enters or leaves the viewport

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('view', (state) => {
     console.info('view', state);
-});

lock ​

On mobile, triggered when the locked state changes

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

lock ​

Triggered when the lock state changes on mobile devices

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lock: true,
@@ -148,7 +157,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('lock', (state) => {
     console.info('lock', state);
-});

aspectRatio ​

Triggered when the aspect ratio of the player changes

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

aspectRatio ​

Triggered when the player's aspect ratio changes

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     aspectRatio: true,
@@ -157,7 +166,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('aspectRatio', (aspectRatio) => {
     console.info('aspectRatio', aspectRatio);
-});

autoHeight ​

Triggered when the player automatically sets the height

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

autoHeight ​

Triggered when the player automatically adjusts its height

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -168,7 +177,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('autoHeight', (height) => {
     console.info('autoHeight', height);
-});

autoSize ​

Triggered when the player automatically sets the size

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

autoSize ​

Triggered when the player automatically adjusts its size

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoSize: true,
@@ -176,7 +185,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('autoSize', () => {
     console.info('autoSize');
-});

flip ​

Triggered when the player flips

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

flip ​

Triggered when the player is flipped

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     flip: true,
@@ -185,7 +194,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('flip', (flip) => {
     console.info('flip', flip);
-});

fullscreen ​

Triggered when the player goes into full screen

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

fullscreen ​

Triggered when the player enters or exits window fullscreen mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreen: true,
@@ -193,7 +202,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('fullscreen', (state) => {
     console.info('fullscreen', state);
-});

fullscreenError ​

Triggered when the player goes into full screen error

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

fullscreenError ​

Triggered when a window fullscreen error occurs

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -204,7 +213,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('fullscreenError', (event) => {
     console.info('fullscreenError', event);
-});

fullscreenWeb ​

Triggered when the player enters web fullscreen

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

fullscreenWeb ​

Triggered when the player enters or exits web fullscreen mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
@@ -212,7 +221,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('fullscreenWeb', (state) => {
     console.info('fullscreenWeb', state);
-});

mini ​

Triggered when the player enters mini mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

mini ​

Triggered when the player enters or exits mini mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -223,7 +232,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('mini', (state) => {
     console.info('mini', state);
-});

pip ​

Triggered when the player enters Picture-in-Picture mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

pip ​

Triggered when the player enters or exits picture-in-picture mode

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     pip: true,
@@ -231,22 +240,31 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('pip', (state) => {
     console.info('pip', state);
-});

screenshot ​

Triggered when the player takes a screenshot

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    screenshot: true,
 });
 
-art.on('screenshot', (dataUri) => {
-    console.info('screenshot', dataUri);
-});

seek ​

Triggered when the player jumps in time

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+## \`screenshot\`
+
+Triggered when the player captures a screenshot
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{7}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    screenshot: true,
+});
+
+art.on('screenshot', (dataUri) => {
+    console.info('screenshot', dataUri);
+});

seek ​

Triggered when the player performs a time seek

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('seek', (currentTime) => {
     console.info('seek', currentTime);
-});

subtitleOffset ​

Triggered when the subtitle offset occurs in the player

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

subtitleOffset ​

Triggered when subtitle offset changes in the player

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitleOffset: true,
@@ -268,7 +286,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('subtitleBeforeUpdate', (cues) => {
     console.info('subtitleBeforeUpdate', cues);
-});

subtitleAfterUpdate ​

Triggered when the subtitles are updated

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

subtitleAfterUpdate ​

Triggered after subtitles are updated

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -278,7 +296,7 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('subtitleAfterUpdate', (cues) => {
     console.info('subtitleAfterUpdate', cues);
-});

subtitleLoad ​

Triggered when the subtitle loads

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

subtitleLoad ​

Triggered when subtitles are loaded

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -288,28 +306,28 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('subtitleLoad', (option, cues) => {
     console.info('subtitleLoad', cues, option);
-});

info ​

Triggered when the information panel is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

info ​

Triggered when the info panel is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('info', (state) => {
     console.log(state);
-});

layer ​

Triggered when a custom layer is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

layer ​

Triggered when custom layers are shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('layer', (state) => {
     console.log(state);
-});

loading ​

Triggered when a loader is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

loading ​

Triggered when the loader is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('loading', (state) => {
     console.log(state);
-});

mask ​

Triggered when a mask layer is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

mask ​

Triggered when the mask layer is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -323,14 +341,14 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('subtitle', (state) => {
     console.log(state);
-});

contextmenu ​

Triggered when the right-click menu is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

contextmenu ​

Triggered when the context menu is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('contextmenu', (state) => {
     console.log(state);
-});

control ​

Triggered when the controller is shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
+});

control ​

Triggered when the controls are shown or hidden

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -345,11 +363,20 @@ import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js
 
 art.on('setting', (state) => {
     console.log(state);
-});

muted ​

Triggered when the muted state changes

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('muted', (state) => {
-    console.log(state);
-});

keydown ​

Listen to the keydown event from document

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i('
js
var art = new Artplayer({\n    container: '.artplayer-app',\n    url: '/assets/sample/video.mp4',\n});\n\nart.on('keydown', (event) => {\n    console.log(event.code);\n});

video:canplay ​

The browser can play the media file, but estimates there is not enough data to play through to the end without having to stop for further buffering

video:canplaythrough ​

The browser estimates it can play the media through to the end without stopping for content buffering

video:complete ​

OfflineAudioContext rendering is complete

video:durationchange ​

Triggered when the value of the duration property changes

video:emptied ​

The media content becomes empty; for example, when this media has been completely loaded (or partially loaded), this event is sent and the load() method is called to reload it

video:ended ​

The video has stopped because the media reached the end point

video:error ​

An error occurred while fetching media data, or the resource type is not a supported media format

video:loadeddata ​

The first frame of the media has finished loading

video:loadedmetadata ​

Metadata has been loaded

video:pause ​

Playback has been paused

video:play ​

Playback has started

video:playing ​

Playback is ready to start following a pause or delay due to lack of data

video:progress ​

Periodically triggered while the browser is loading resources

video:ratechange ​

The playback rate has changed

video:seeked ​

A seek (frame skipping) operation has completed

video:seeking ​

A seek (frame skipping) operation has started

video:stalled ​

The user agent is trying to fetch media data, but the data unexpectedly has not appeared

video:suspend ​

Media data loading has been suspended

video:timeupdate ​

The time specified by the currentTime attribute has changed

video:volumechange ​

Volume changed

video:waiting ​

Playback has stopped due to temporarily missing data

',43)]))}const o=e(h,[["render",t]]);export{y as __pageData,o as default}; +## \`muted\` + +Triggered when the mute state changes + +<div className="run-code">▶ Run Code</div> + +\`\`\`js{6} +var art = new Artplayer({ + container: '.artplayer-app', + url: '/assets/sample/video.mp4', +}); + +art.on('muted', (state) => { + console.log(state); +});

keydown ​

Listens for keydown events from the document

`,3),s("div",{className:"run-code"},"▶ Run Code",-1),i('
js
var art = new Artplayer({\n    container: '.artplayer-app',\n    url: '/assets/sample/video.mp4',\n});\n\nart.on('keydown', (event) => {\n    console.log(event.code);\n});

video:canplay ​

The browser can start playing the media, but estimates there isn't enough data to play through to the end without having to stop for further buffering

video:canplaythrough ​

The browser estimates it can play the media through to the end without stopping to buffer content

video:complete ​

OfflineAudioContext rendering is complete

video:durationchange ​

Triggered when the value of the duration property changes

video:emptied ​

The media has become empty; for example, this event is sent when the media has already been loaded (or partially loaded), and the load() method is called to reload it

video:ended ​

Playback has stopped because the media has reached its end point

video:error ​

An error occurred while fetching media data, or the resource type is not a supported media format

video:loadeddata ​

The first frame of the media has finished loading

video:loadedmetadata ​

Metadata has been loaded

video:pause ​

Playback has been paused

video:play ​

Playback has begun

video:playing ​

Playback is ready to start after having been paused or delayed due to lack of data

video:progress ​

Periodically triggered while the browser is loading the resource

video:ratechange ​

The playback rate has changed

video:seeked ​

A seek operation has completed

video:seeking ​

A seek operation has begun

video:stalled ​

The user agent is trying to fetch media data, but data is unexpectedly not forthcoming

video:suspend ​

Media data loading has been suspended

video:timeupdate ​

The time indicated by the currentTime attribute has been updated

video:volumechange ​

The volume has changed

video:waiting ​

Playback has stopped due to temporary lack of data

',43)]))}const o=l(h,[["render",t]]);export{y as __pageData,o as default}; diff --git a/docs/document/assets/en_advanced_event.md.CtQl1IYg.lean.js b/docs/document/assets/en_advanced_event.md.CtQl1IYg.lean.js new file mode 100644 index 000000000..1851be6db --- /dev/null +++ b/docs/document/assets/en_advanced_event.md.CtQl1IYg.lean.js @@ -0,0 +1 @@ +import{_ as l,c as e,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Instance Events","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/event.md","filePath":"en/advanced/event.md","lastUpdated":1764426402000}'),h={name:"en/advanced/event.md"};function t(k,n,r,E,d,g){return p(),e("div",null,n[0]||(n[0]=[s("h1",{id:"instance-events",tabindex:"-1"},[a("Instance Events "),s("a",{class:"header-anchor",href:"#instance-events","aria-label":'Permalink to "Instance Events"'},"​")],-1),s("p",null,[a("Player events are divided into two types: "),s("code",null,"native events"),a(" (prefixed with "),s("code",null,"video:"),a(") and "),s("code",null,"custom events"),a(".")],-1),s("p",null,"Listen to an event:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",4),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",43)]))}const o=l(h,[["render",t]]);export{y as __pageData,o as default}; diff --git a/docs/document/assets/en_advanced_event.md.D5Yv5LYW.lean.js b/docs/document/assets/en_advanced_event.md.D5Yv5LYW.lean.js deleted file mode 100644 index 0781bb568..000000000 --- a/docs/document/assets/en_advanced_event.md.D5Yv5LYW.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as l,o as p,j as s,ak as i,a}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Example Events","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/event.md","filePath":"en/advanced/event.md","lastUpdated":1729435465000}'),h={name:"en/advanced/event.md"};function t(k,n,r,E,d,g){return p(),l("div",null,n[0]||(n[0]=[s("h1",{id:"example-events",tabindex:"-1"},[a("Example Events "),s("a",{class:"header-anchor",href:"#example-events","aria-label":'Permalink to "Example Events"'},"​")],-1),s("p",null,[a("Player events are divided into two types, one is the video's "),s("code",null,"native events"),a(" (prefix "),s("code",null,"video:"),a("), the other is "),s("code",null,"custom events")],-1),s("p",null,"Listening to events:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",2),s("div",{className:"run-code"},"▶ Run Code",-1),i("",4),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",3),s("div",{className:"run-code"},"▶ Run Code",-1),i("",43)]))}const o=e(h,[["render",t]]);export{y as __pageData,o as default}; diff --git a/docs/document/assets/en_advanced_global.md.BbhNIAMt.js b/docs/document/assets/en_advanced_global.md.D5Nz8wyo.js similarity index 71% rename from docs/document/assets/en_advanced_global.md.BbhNIAMt.js rename to docs/document/assets/en_advanced_global.md.D5Nz8wyo.js index 83b2c2d89..f171482c8 100644 --- a/docs/document/assets/en_advanced_global.md.BbhNIAMt.js +++ b/docs/document/assets/en_advanced_global.md.D5Nz8wyo.js @@ -1,19 +1,19 @@ -import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Global Attributes","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/global.md","filePath":"en/advanced/global.md","lastUpdated":1718941442000}'),p={name:"en/advanced/global.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Global Attributes ​

Here, Global Attributes refer to the first-level properties mounted on the constructor. Property names are all in uppercase, subject to change in the future and basically not needed.

DEBUG ​

Whether to start debug mode, which can print out all built-in events of the video by default is turned off.

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DEBUG = true;
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Global Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/global.md","filePath":"en/advanced/global.md","lastUpdated":1764426402000}'),p={name:"en/advanced/global.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Global Properties ​

These global properties refer to the top-level properties mounted on the constructor. The property names are all in uppercase. They are subject to change in the future and are generally not used.

DEBUG ​

Whether to enable debug mode, which can print all built-in events of the video. Default is off.

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DEBUG = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

STYLE ​

Returns the player style text

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.log(Artplayer.STYLE);

CONTEXTMENU ​

Whether to enable the right-click context menu, enabled by default.

',3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.CONTEXTMENU = false;
+});

STYLE ​

Returns the player style text.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s('
js
console.log(Artplayer.STYLE);

CONTEXTMENU ​

Whether to enable the context menu. Default is on.

',3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.CONTEXTMENU = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

NOTICE_TIME ​

The display duration of the notification message, in milliseconds, defaults to 2000

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.NOTICE_TIME = 5000;
+});

NOTICE_TIME ​

The display duration for notification messages, in milliseconds. Default is 2000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.NOTICE_TIME = 5000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

SETTING_WIDTH ​

The default width of the settings panel, in pixels, defaults to 250

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_WIDTH = 300;
+});

SETTING_WIDTH ​

The default width of the settings panel, in pixels. Default is 250.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_WIDTH = 300;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -23,7 +23,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

SETTING_ITEM_WIDTH ​

Set the default width of the settings items in the panel, in pixels, the default is 200.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_ITEM_WIDTH = 300;
+});

SETTING_ITEM_WIDTH ​

The default width of settings items in the settings panel, in pixels. Default is 200.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_ITEM_WIDTH = 300;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -33,7 +33,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

SETTING_ITEM_HEIGHT ​

Set the default height of the settings items in the panel, in pixels, the default is 35.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_ITEM_HEIGHT = 40;
+});

SETTING_ITEM_HEIGHT ​

The default height of settings items in the settings panel, in pixels. Default is 35.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SETTING_ITEM_HEIGHT = 40;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -43,7 +43,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

RESIZE_TIME ​

Throttle time for the resize event, in milliseconds, defaults to 200

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RESIZE_TIME = 500;
+});

RESIZE_TIME ​

The throttle time for the resize event, in milliseconds. Default is 200.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RESIZE_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -52,7 +52,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('resize', () => {
     console.log('resize');
-});

SCROLL_TIME ​

Throttle time for the scroll event, in milliseconds, defaults to 200

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SCROLL_TIME = 500;
+});

SCROLL_TIME ​

The throttle time for the scroll event, in milliseconds. Default is 200.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SCROLL_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -61,7 +61,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('scroll', () => {
     console.log('scroll');
-});

SCROLL_GAP ​

The boundary tolerance distance for the view event, in pixels, default is 50

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SCROLL_GAP = 100;
+});

SCROLL_GAP ​

The boundary tolerance distance for the view event, in pixels. Default is 50.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SCROLL_GAP = 100;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -70,40 +70,49 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('scroll', () => {
     console.log('scroll');
-});

AUTO_PLAYBACK_MAX ​

The maximum number of records for the automatic playback feature, default is 10

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_MAX = 20;
+});

AUTO_PLAYBACK_MAX ​

The maximum record count for the auto-playback feature. Default is 10.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_MAX = 20;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

AUTO_PLAYBACK_MIN ​

The minimum duration for the auto playback feature, in seconds, with a default of 5.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_MIN = 10;
+});

AUTO_PLAYBACK_MIN ​

The minimum record duration for the auto-playback feature, in seconds. Default is 5.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_MIN = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

AUTO_PLAYBACK_TIMEOUT ​

The delay duration for hiding the auto playback feature, in milliseconds, with a default of 3000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_TIMEOUT = 5000;
+});

AUTO_PLAYBACK_TIMEOUT ​

The hide delay duration for the auto-playback feature, in milliseconds. Default is 3000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_PLAYBACK_TIMEOUT = 5000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

RECONNECT_TIME_MAX ​

The maximum number of automatic reconnection attempts when a connection error occurs, default is 5

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RECONNECT_TIME_MAX = 10;
+});

RECONNECT_TIME_MAX ​

The maximum number of automatic reconnection attempts when a connection error occurs. Default is 5.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RECONNECT_TIME_MAX = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
-});

RECONNECT_SLEEP_TIME ​

The delay time for the automatic reconnection attempt when a connection error occurs, in milliseconds, default is 1000

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RECONNECT_SLEEP_TIME = 3000;
+});

RECONNECT_SLEEP_TIME ​

The delay time for automatic reconnection when a connection error occurs, in milliseconds. Default is 1000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.RECONNECT_SLEEP_TIME = 3000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
-});

CONTROL_HIDE_TIME ​

...

Auto-hide delay time for the bottom control bar, measured in milliseconds, default is 3000

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.CONTROL_HIDE_TIME = 5000;
+});
 
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

DBCLICK_TIME ​

Double-click event delay time, measured in milliseconds, default is 300

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DBCLICK_TIME = 500;
+## CONTROL_HIDE_TIME
+
+The delay time in milliseconds for auto-hiding the bottom control bar. Default is \`3000\`.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js
+Artplayer.CONTROL_HIDE_TIME = 5000;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});

DBCLICK_TIME ​

The delay time in milliseconds for double-click events. Default is 300.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DBCLICK_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -112,67 +121,62 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('dblclick', () => {
     console.log('dblclick');
-});

DBCLICK_FULLSCREEN ​

On desktop, whether to switch to fullscreen on double click, default is true

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DBCLICK_FULLSCREEN = false;
+});

DBCLICK_FULLSCREEN ​

On desktop, whether double-click toggles fullscreen mode. Default is true.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.DBCLICK_FULLSCREEN = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

MOBILE_DBCLICK_PLAY ​

On mobile, whether to toggle play/pause on double click, default is true

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.MOBILE_DBCLICK_PLAY = false;
+});

MOBILE_DBCLICK_PLAY ​

On mobile devices, whether double-click toggles play/pause. Default is true.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.MOBILE_DBCLICK_PLAY = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

MOBILE_CLICK_PLAY ​

On mobile, whether to play/pause on single click, default is false

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.MOBILE_CLICK_PLAY = true;
+});

MOBILE_CLICK_PLAY ​

On mobile devices, whether single-click toggles play/pause. Default is false.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.MOBILE_CLICK_PLAY = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

On mobile devices, whether a tap toggles play/pause, defaults to false

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.MOBILE_CLICK_PLAY = true;
-
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

AUTO_ORIENTATION_TIME ​

On mobile devices, the delay time for auto-rotation, in milliseconds, defaults to 200

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_ORIENTATION_TIME = 500;
+});

AUTO_ORIENTATION_TIME ​

On mobile devices, the delay time in milliseconds for automatic screen rotation. Default is 200.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.AUTO_ORIENTATION_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoOrientation: true,
-});

INFO_LOOP_TIME ​

Info panel refresh time, unit in milliseconds, default is 1000

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.INFO_LOOP_TIME = 2000;
+});

INFO_LOOP_TIME ​

The refresh interval in milliseconds for the information panel. Default is 1000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.INFO_LOOP_TIME = 2000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-art.info.show = true;

FAST_FORWARD_VALUE ​

On mobile, the multiplier rate of the speed when long-pressing for fast-forward, default is 3

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FAST_FORWARD_VALUE = 5;
+art.info.show = true;

FAST_FORWARD_VALUE ​

On mobile devices, the speed multiplier for fast-forward during long-press. Default is 3.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FAST_FORWARD_VALUE = 5;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

FAST_FORWARD_TIME ​

The time, in milliseconds, to fast-forward when double-tapped, default is 10 On mobile, the delay time of the long-press acceleration, in milliseconds, default is 1000

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FAST_FORWARD_TIME = 2000;
+});

FAST_FORWARD_TIME ​

On mobile devices, the delay time in milliseconds for activating fast-forward during long-press. Default is 1000.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FAST_FORWARD_TIME = 2000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

TOUCH_MOVE_RATIO ​

On mobile, the ratio of the speed of sliding left and right to seek, default is 0.5

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.TOUCH_MOVE_RATIO = 1;
+});

TOUCH_MOVE_RATIO ​

On mobile devices, the speed multiplier for seeking when swiping left/right. Default is 0.5.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.TOUCH_MOVE_RATIO = 1;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

VOLUME_STEP ​

The step ratio of adjusting volume with shortcuts, default is 0.1

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.VOLUME_STEP = 0.2;
+});

VOLUME_STEP ​

The volume adjustment step for keyboard shortcuts. Default is 0.1.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.VOLUME_STEP = 0.2;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

SEEK_STEP ​

The increment by which the playback progress is adjusted via keyboard shortcuts, in seconds, the default is 5

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SEEK_STEP = 10;
+});

SEEK_STEP ​

The seeking step in seconds for keyboard shortcuts. Default is 5.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.SEEK_STEP = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

PLAYBACK_RATE ​

The list of built-in playback speeds, by default [0.5, 0.75, 1, 1.25, 1.5, 2]

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.PLAYBACK_RATE = [0.5, 1, 2, 3, 4, 5];
+});

PLAYBACK_RATE ​

The built-in list of playback rates. Default is [0.5, 0.75, 1, 1.25, 1.5, 2].

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.PLAYBACK_RATE = [0.5, 1, 2, 3, 4, 5];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -182,7 +186,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

ASPECT_RATIO ​

Built-in list of video aspect ratios, default is ['default', '4:3', '16:9']

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.ASPECT_RATIO = ['default', '1:1', '2:1', '4:3', '6:5'];
+art.setting.show = true;

ASPECT_RATIO ​

The built-in list of video aspect ratios. Default is ['default', '4:3', '16:9'].

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.ASPECT_RATIO = ['default', '1:1', '2:1', '4:3', '6:5'];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -192,7 +196,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FLIP ​

Built-in list of video flips, defaults to ['normal', 'horizontal', 'vertical']

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FLIP = ['normal', 'horizontal'];
+art.setting.show = true;

FLIP ​

The built-in list of video flip modes. Default is ['normal', 'horizontal', 'vertical'].

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FLIP = ['normal', 'horizontal'];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -202,21 +206,38 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

When in web fullscreen, whether to mount the player under the body element, defaults to false

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.FULLSCREEN_WEB_IN_BODY = true;
+art.setting.show = true;
+
+## FULLSCREEN_WEB_IN_BODY
+
+Determines whether to mount the player under the \`body\` element during web fullscreen mode. Defaults to \`true\`.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js
+Artplayer.FULLSCREEN_WEB_IN_BODY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    fullscreenWeb: true,
+});

LOG_VERSION ​

Sets whether to print the player version. Defaults to true.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.LOG_VERSION = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-    fullscreenWeb: true,
-});

LOG_VERSION ​

Setting whether to print the player version, the default is true

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.LOG_VERSION = false;
-
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

USE_RAF ​

Setting whether to use requestAnimationFrame, the default is false, currently mainly used for smooth progress bar effects

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.USE_RAF = true;
+});

USE_RAF ​

Sets whether to use requestAnimationFrame. Defaults to false. Currently mainly used for smooth progress bar effects.

`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.USE_RAF = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     miniProgressBar: true,
-});
`,1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default}; +});

REMOVE_SRC_WHEN_DESTROY ​

Determines whether to remove the video's src attribute and call load() to actively release media resources when destroying the player. Defaults to true.

When enabled, this can reduce video resource usage in single-page applications or scenarios where players are frequently created/destroyed. If you wish to preserve the video element's state and only remove the UI, set this to false.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
Artplayer.REMOVE_SRC_WHEN_DESTROY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+// Only destroys the UI, does not actively clear src
+art.destroy();
`,1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/en_advanced_global.md.BbhNIAMt.lean.js b/docs/document/assets/en_advanced_global.md.D5Nz8wyo.lean.js similarity index 79% rename from docs/document/assets/en_advanced_global.md.BbhNIAMt.lean.js rename to docs/document/assets/en_advanced_global.md.D5Nz8wyo.lean.js index cdd543ba2..b6dcb3c79 100644 --- a/docs/document/assets/en_advanced_global.md.BbhNIAMt.lean.js +++ b/docs/document/assets/en_advanced_global.md.D5Nz8wyo.lean.js @@ -1 +1 @@ -import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Global Attributes","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/global.md","filePath":"en/advanced/global.md","lastUpdated":1718941442000}'),p={name:"en/advanced/global.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default}; +import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Global Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/global.md","filePath":"en/advanced/global.md","lastUpdated":1764426402000}'),p={name:"en/advanced/global.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/en_advanced_plugin.md.hspsx5uD.js b/docs/document/assets/en_advanced_plugin.md.BOuMu80J.js similarity index 90% rename from docs/document/assets/en_advanced_plugin.md.hspsx5uD.js rename to docs/document/assets/en_advanced_plugin.md.BOuMu80J.js index ca7b975af..2b848a7bf 100644 --- a/docs/document/assets/en_advanced_plugin.md.hspsx5uD.js +++ b/docs/document/assets/en_advanced_plugin.md.BOuMu80J.js @@ -1,4 +1,4 @@ -import{_ as l,c as p,o as h,j as s,ak as n,a as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Writing Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/plugin.md","filePath":"en/advanced/plugin.md","lastUpdated":1750384414000}'),e={name:"en/advanced/plugin.md"};function k(t,a,E,r,d,g){return h(),p("div",null,a[0]||(a[0]=[s("h1",{id:"writing-plugins",tabindex:"-1"},[i("Writing Plugins "),s("a",{class:"header-anchor",href:"#writing-plugins","aria-label":'Permalink to "Writing Plugins"'},"​")],-1),s("p",null,[i("Once you know the player's "),s("code",null,"properties"),i(", "),s("code",null,"methods"),i(", and "),s("code",null,"events"),i(", writing plugins is very simple.")],-1),s("p",null,"You can load plugin functions during instantiation.",-1),s("div",{className:"run-code"},"▶ Run Code",-1),n(`
js
function myPlugin(art) {
+import{_ as l,c as p,o as h,j as s,ak as a,a as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Writing Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/plugin.md","filePath":"en/advanced/plugin.md","lastUpdated":1764426402000}'),e={name:"en/advanced/plugin.md"};function k(t,n,E,r,d,g){return h(),p("div",null,n[0]||(n[0]=[s("h1",{id:"writing-plugins",tabindex:"-1"},[i("Writing Plugins "),s("a",{class:"header-anchor",href:"#writing-plugins","aria-label":'Permalink to "Writing Plugins"'},"​")],-1),s("p",null,[i("Once you are familiar with the player's "),s("code",null,"properties"),i(", "),s("code",null,"methods"),i(", and "),s("code",null,"events"),i(", writing plugins becomes very straightforward.")],-1),s("p",null,"You can load plugin functions during instantiation:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),a(`
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -17,7 +17,7 @@ import{_ as l,c as p,o as h,j as s,ak as n,a as i}from"./chunks/framework.xxfEsz
 
 art.on('ready', () => {
     console.info(art.plugins.myPlugin);
-});

You can also load plugins after instantiation:

`,2),s("div",{className:"run-code"},"▶ Run Code",-1),n(`
js
function myPlugin(art) {
+});

You can also load plugin functions after instantiation:

`,2),s("div",{className:"run-code"},"▶ Run Code",-1),a(`
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -37,7 +37,7 @@ import{_ as l,c as p,o as h,j as s,ak as n,a as i}from"./chunks/framework.xxfEsz
 
 art.on('ready', () => {
     console.info(art.plugins.myPlugin);
-});

For example, I want to write a plugin that displays an image advertisement after the video is paused.

js
function adsPlugin(option) {
+});

For example, let's say I want to write a plugin that displays an image ad when the video is paused:

`,2),s("div",{className:"run-code"},"▶ Run Code",-1),a(`
js
function adsPlugin(option) {
     return (art) => {
         art.layers.add({
             name: 'ads',
@@ -96,4 +96,4 @@ import{_ as l,c as p,o as h,j as s,ak as n,a as i}from"./chunks/framework.xxfEsz
             url: '/assets/sample/layer.png'
         })
     ],
-});
`,3)]))}const b=l(e,[["render",k]]);export{y as __pageData,b as default}; +});
`,1)]))}const b=l(e,[["render",k]]);export{y as __pageData,b as default}; diff --git a/docs/document/assets/en_advanced_plugin.md.BOuMu80J.lean.js b/docs/document/assets/en_advanced_plugin.md.BOuMu80J.lean.js new file mode 100644 index 000000000..16e78d644 --- /dev/null +++ b/docs/document/assets/en_advanced_plugin.md.BOuMu80J.lean.js @@ -0,0 +1 @@ +import{_ as l,c as p,o as h,j as s,ak as a,a as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Writing Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/plugin.md","filePath":"en/advanced/plugin.md","lastUpdated":1764426402000}'),e={name:"en/advanced/plugin.md"};function k(t,n,E,r,d,g){return h(),p("div",null,n[0]||(n[0]=[s("h1",{id:"writing-plugins",tabindex:"-1"},[i("Writing Plugins "),s("a",{class:"header-anchor",href:"#writing-plugins","aria-label":'Permalink to "Writing Plugins"'},"​")],-1),s("p",null,[i("Once you are familiar with the player's "),s("code",null,"properties"),i(", "),s("code",null,"methods"),i(", and "),s("code",null,"events"),i(", writing plugins becomes very straightforward.")],-1),s("p",null,"You can load plugin functions during instantiation:",-1),s("div",{className:"run-code"},"▶ Run Code",-1),a("",2),s("div",{className:"run-code"},"▶ Run Code",-1),a("",2),s("div",{className:"run-code"},"▶ Run Code",-1),a("",1)]))}const b=l(e,[["render",k]]);export{y as __pageData,b as default}; diff --git a/docs/document/assets/en_advanced_plugin.md.hspsx5uD.lean.js b/docs/document/assets/en_advanced_plugin.md.hspsx5uD.lean.js deleted file mode 100644 index b6adf06ca..000000000 --- a/docs/document/assets/en_advanced_plugin.md.hspsx5uD.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as l,c as p,o as h,j as s,ak as n,a as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"Writing Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/plugin.md","filePath":"en/advanced/plugin.md","lastUpdated":1750384414000}'),e={name:"en/advanced/plugin.md"};function k(t,a,E,r,d,g){return h(),p("div",null,a[0]||(a[0]=[s("h1",{id:"writing-plugins",tabindex:"-1"},[i("Writing Plugins "),s("a",{class:"header-anchor",href:"#writing-plugins","aria-label":'Permalink to "Writing Plugins"'},"​")],-1),s("p",null,[i("Once you know the player's "),s("code",null,"properties"),i(", "),s("code",null,"methods"),i(", and "),s("code",null,"events"),i(", writing plugins is very simple.")],-1),s("p",null,"You can load plugin functions during instantiation.",-1),s("div",{className:"run-code"},"▶ Run Code",-1),n("",2),s("div",{className:"run-code"},"▶ Run Code",-1),n("",3)]))}const b=l(e,[["render",k]]);export{y as __pageData,b as default}; diff --git a/docs/document/assets/en_advanced_property.md.COS94_z7.js b/docs/document/assets/en_advanced_property.md.urRMaqHe.js similarity index 70% rename from docs/document/assets/en_advanced_property.md.COS94_z7.js rename to docs/document/assets/en_advanced_property.md.urRMaqHe.js index e695b5564..8e57eb705 100644 --- a/docs/document/assets/en_advanced_property.md.COS94_z7.js +++ b/docs/document/assets/en_advanced_property.md.urRMaqHe.js @@ -1,13 +1,12 @@ -import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Instance Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/property.md","filePath":"en/advanced/property.md","lastUpdated":1726306667000}'),p={name:"en/advanced/property.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Instance Properties ​

Here, instance properties refer to the primary properties mounted on the instance, which are quite commonly used.

play ​

  • Type: Function

Play video

',5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js

-var art = new Artplayer({
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Instance Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/property.md","filePath":"en/advanced/property.md","lastUpdated":1764426402000}'),p={name:"en/advanced/property.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Instance Properties ​

Here, Instance Properties refer to the first-level properties mounted on the instance, which are commonly used.

play ​

  • Type: Function

Play the video.

',5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
 });
 
-art.on('ready', () => {
-    art.play();
-});

pause ​

  • Type: Function

Pause video

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+art.on('ready', () => {
+    art.play();
+});

pause ​

  • Type: Function

Pause the video.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -19,7 +18,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.pause();
     }, 3000);
-});

toggle ​

  • Type: Function

Toggle the play and pause state of the video

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

toggle ​

  • Type: Function

Toggle video playback and pause.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -31,14 +30,22 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.toggle();
     }, 3000);
-});

destroy ​

  • Type: Function
  • Parameter: Boolean

Destroy the player. Accepts a parameter indicating whether to remove the player's html after destruction, which defaults to true

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

destroy ​

  • Type: Function
  • Parameter: Boolean

Destroy the player. Accepts a parameter indicating whether to remove the player's html after destruction. Defaults to true.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.destroy();
-});

seek ​

  • Type: Setter
  • Parameter: Number

Jump to a specific time in the video, in seconds.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

reset ​

  • Type: Function

Reset the player's video element: removes the current src and calls load() once. Commonly used to manually release media resources or reinitialize the video tag in single-page applications.

Note: The global configuration Artplayer.REMOVE_SRC_WHEN_DESTROY will also automatically execute similar logic when destroy() is called.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    // Only reset the video, do not remove the interface
+    art.reset();
+});

seek ​

  • Type: Setter
  • Parameter: Number

Seek to a specific time in the video, in seconds.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -52,7 +59,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     art.forward = 5;
-});

backward ​

  • Type: Setter
  • Parameter: Number

Video rewind time in seconds

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

backward ​

  • Type: Setter
  • Parameter: Number

Rewind the video time, in seconds.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -63,7 +70,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.backward = 2;
     }, 3000);
-});

volume ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the video volume, which ranges from [0, 1]

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

volume ​

  • Type: Setter/Getter
  • Parameter: Number

Set and get the video volume, range: [0, 1].

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -72,14 +79,14 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.volume);
     art.volume = 0.5;
     console.info(art.volume);
-});

url ​

  • Type: Setter/Getter
  • Parameter: String

Set and retrieve the video address

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

url ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the video URL.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.url = '/assets/sample/video.mp4?t=0';
-});

switch ​

  • Type: Setter
  • Parameter: String

Set the video address, which is similar to art.url, but performs some optimization operations

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

switch ​

  • Type: Setter
  • Parameter: String

Set the video URL. Similar to art.url when setting, but performs some optimization operations.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -89,7 +96,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.switch = '/assets/sample/video.mp4?t=0';
     }, 3000);
-});

switchUrl ​

  • Type: Function
  • Parameter: String

Set the video address, similar to setting art.url, but some optimization operations will be executed.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

switchUrl ​

  • Type: Function
  • Parameter: String

Set the video URL. Similar to art.url when setting, but performs some optimization operations.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -99,17 +106,35 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.switchUrl('/assets/sample/video.mp4?t=0');
     }, 3000);
-});

Warning

art.switch and art.switchUrl have the same functionality. However, the art.switchUrl method will return a Promise. When it resolves, it indicates that the new address can be played; when it rejects, it indicates there was an error loading the new address.

switchQuality ​

  • Type: Function
  • Parameter: String

Set video quality address, similar to art.switchUrl, but it will carry over the previous playback progress.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('ready', () => {
-    art.seek = 10;
-    setTimeout(() => {
-        art.switchQuality('/assets/sample/video.mp4?t=0');
-    }, 3000);
-});

muted ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get whether the video is muted.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+:::warning Note
+
+\`art.switch\` and \`art.switchUrl\` have the same functionality, but the \`art.switchUrl\` method returns a \`Promise\`. It \`resolve\`s when the new URL is playable and \`reject\`s when the new URL fails to load.
+
+:::
+
+## \`switchQuality\`
+
+-   Type: \`Function\`
+-   Parameter: \`String\`
+
+Sets the video quality URL. Similar to \`art.switchUrl\`, but retains the previous playback progress.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{9}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.seek = 10;
+    setTimeout(() => {
+        art.switchQuality('/assets/sample/video.mp4?t=0');
+    }, 3000);
+});

muted ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets whether the video is muted.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -118,7 +143,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.muted);
     art.muted = true;
     console.info(art.muted);
-});

currentTime ​

  • Type: Setter/Getter
  • Parameter: Number

Set and get the current time of the video. Setting the time is similar to seek, but it does not trigger additional events.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

currentTime ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the current playback time of the video. Setting the time is similar to seek, but it does not trigger additional events.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -127,29 +152,29 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.currentTime);
     art.currentTime = 5;
     console.info(art.currentTime);
-});

duration ​

  • Type: Getter

Get the video duration

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

duration ​

  • Type: Getter

Gets the duration of the video.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     console.info(art.duration);
-});

Note

Some videos do not have a duration, such as videos that are being live streamed or videos that have not been fully decoded, in which case the obtained duration will be 0

screenshot ​

  • Type: Function

Download a screenshot of the current video frame, optional parameter is the screenshot name

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

Some videos may not have a duration, such as live streams or videos that have not been fully decoded. In these cases, the obtained duration will be 0.

screenshot ​

  • Type: Function

Downloads a screenshot of the current video frame. An optional parameter specifies the screenshot filename.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.screenshot('your-name');
-});

getDataURL ​

  • Type: Function

Gets the base64 address of the screenshot of the current video frame, which returns a Promise.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

getDataURL ​

  • Type: Function

Gets the base64 URL of a screenshot of the current video frame. Returns a Promise.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', async () => {
     const url = await art.getDataURL();
-    console.info(url)
-});

getBlobUrl ​

  • Type: Function

Gets the blob address of the screenshot of the current video frame, which returns a Promise.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+	console.info(url)
+});

getBlobUrl ​

  • Type: Function

Gets the blob URL of a screenshot of the current video frame. Returns a Promise.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -157,7 +182,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 art.on('ready', async () => {
     const url = await art.getBlobUrl();
     console.info(url);
-});

fullscreen ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player window fullscreen

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

fullscreen ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's window fullscreen state.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -169,7 +194,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Note

Due to browser security mechanisms, before triggering the window to fullscreen, the page must have had an interaction (e.g. user clicked on the page).

fullscreenWeb ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player web page full screen

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, the page must have prior user interaction (e.g., the user has clicked on the page) before triggering window fullscreen.

fullscreenWeb ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's web page fullscreen state.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
@@ -181,7 +206,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         art.fullscreenWeb = false;
     }, 3000);
-});

pip ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player picture-in-picture mode

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

pip ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's Picture-in-Picture mode.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -193,7 +218,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Warning

Due to browser security mechanisms, user interaction (e.g., a user click on the page) must occur before triggering picture-in-picture.

poster ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the video poster, the poster effect is visible only before the video starts playing.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, the page must have prior user interaction (e.g., the user has clicked on the page) before triggering Picture-in-Picture.

poster ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the video poster. The poster effect is only visible before video playback starts.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     poster: '/assets/sample/poster.jpg',
@@ -203,14 +228,14 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.poster);
     art.poster = '/assets/sample/poster.jpg?t=0';
     console.info(art.poster);
-});

mini ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player's mini mode

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

mini ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's mini mode.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.mini = true;
-});

playing ​

  • Type: Getter
  • Parameter: Boolean

Get whether the video is currently playing

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

playing ​

  • Type: Getter
  • Parameter: Boolean

Gets whether the video is currently playing.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -218,21 +243,29 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     console.info(art.playing);
-});

autoSize ​

  • Type: Function

Sets whether the video should auto adjust its size

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

state ​

  • Type: Setter/Getter
  • Parameter: String

Gets or sets the player's current state. Supported values: standard (normal), mini (mini window), pip (picture-in-picture), fullscreen (fullscreen window), fullscreenWeb (webpage fullscreen).

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.state); // Default: standard
+    art.state = 'mini';
+});

autoSize ​

  • Type: Function

Sets whether the video adapts its size automatically.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.autoSize();
-});

rect ​

  • Type: Getter

Gets the size and position information of the player

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

rect ​

  • Type: Getter

Gets the player's dimensions and coordinate information.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s('
js
var art = new Artplayer({\n    container: '.artplayer-app',\n    url: '/assets/sample/video.mp4',\n});\n\nart.on('ready', () => {\n    console.info(JSON.stringify(art.rect));\n});

Note

The dimension and coordinate information is obtained via getBoundingClientRect.

bottom / top / left / right / x / y / width / height ​

  • Type: Getter

These properties provide shortcut access to rect:

  • bottom, top, left, right, x, y: Correspond to the fields of the same name in DOMRect
  • width, height: The player's current visible width and height
',6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
-    console.info(JSON.stringify(art.rect));
-});

Warning

The size and coordinates are obtained via getBoundingClientRect

flip ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the player flip, supports normal, horizontal, vertical

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    console.info(art.width, art.height, art.left, art.top);
+});

flip ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the player flip state. Supported values: normal, horizontal, vertical.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -241,7 +274,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.flip);
     art.flip = 'horizontal';
     console.info(art.flip);
-});

playbackRate ​

  • Type: Setter/Getter
  • Parameter: Number Set and get the playback speed of the player
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

playbackRate ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the player's playback rate.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -250,7 +283,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.playbackRate);
     art.playbackRate = 2;
     console.info(art.playbackRate);
-});

aspectRatio ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the aspect ratio of the player

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

aspectRatio ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the player's aspect ratio.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -259,7 +292,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.aspectRatio);
     art.aspectRatio = '16:9';
     console.info(art.aspectRatio);
-});

autoHeight ​

  • Type: Function

When the container has only width, this attribute can automatically calculate and set the height of the video

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

autoHeight ​

  • Type: Function

When the container only has a defined width, this property can automatically calculate and set the video height.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -270,7 +303,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('resize', () => {
     art.autoHeight();
-});

Warning

When your container has only width but you do not know the exact height, this property is very useful as it can automatically calculate the video's height, but you need to make sure when to set this property.

attr ​

  • Type: Function
  • Parameter: String

Dynamically get and set the attributes of the video element

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

This property is useful when your container has only a defined width but an unknown height. It automatically calculates the video height, but you need to determine the appropriate timing to set this property.

attr ​

  • Type: Function
  • Parameter: String

Dynamically gets and sets attributes of the video element.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -279,7 +312,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.attr('playsInline'));
     art.attr('playsInline', true);
     console.info(art.attr('playsInline'));
-});

type ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically get and set the video type

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

type ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically gets and sets the video type.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -288,7 +321,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.type);
     art.type = 'm3u8';
     console.info(art.type);
-});

theme ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically get and set the player's theme color

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

theme ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically gets and sets the player's theme color.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -297,7 +330,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.info(art.theme);
     art.theme = '#000';
     console.info(art.theme);
-});

airplay ​

  • Type: Function

Activate airplay

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

airplay ​

  • Type: Function

Initiates AirPlay.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -309,21 +342,28 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

loaded ​

  • Type: Getter

The proportion of the video that is cached, ranging from [0, 1], commonly used with the video:timeupdate event.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

loaded ​

  • Type: Getter

The proportion of the video that has been buffered, ranging from [0, 1]. Often used with the video:timeupdate event.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('video:timeupdate', () => {
     console.info(art.loaded);
-});

played ​

  • Type: Getter

The proportion of the video that has been played, ranging from [0, 1], commonly used with the video:timeupdate event.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

loadedTime ​

  • Type: Getter

The amount of media that has been buffered, in seconds. Typically used alongside loaded to display detailed buffering progress.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('video:timeupdate', () => {
+    console.info(art.loadedTime);
+});

played ​

  • Type: Getter

The proportion of the video that has been played, ranging from [0, 1]. Often used with the video:timeupdate event.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('video:timeupdate', () => {
     console.info(art.played);
-});

proxy ​

  • Type: Function

A proxy function for DOM events, which essentially proxies addEventListener and removeEventListener. When using proxy to handle events, the event will automatically be destroyed when the player is destroyed.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var container = document.querySelector('.artplayer-app');
+});

proxy ​

  • Type: Function

A proxy function for DOM events, essentially proxying addEventListener and removeEventListener. When using proxy to handle events, the event is automatically removed when the player is destroyed.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var container = document.querySelector('.artplayer-app');
 
 var art = new Artplayer({
 	container: container,
@@ -332,17 +372,17 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.proxy(container, 'click', event => {
 	console.info(event);
-});

Tip

If you need some DOM events to exist only during the lifespan of the player, it is highly recommended to use this function to avoid causing memory leaks.

query ​

  • Type: Function

DOM query function, similar to document.querySelector, but the object being queried is limited within the current player, which can prevent errors due to having the same class name.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

If you need DOM events to exist only for the duration of the player's lifecycle, it is strongly recommended to use this function to avoid memory leaks.

query ​

  • Type: Function

A DOM query function, similar to document.querySelector, but the search is scoped to the current player instance, preventing errors from duplicate class names.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
 
-console.info(art.query('.art-video'));

video ​

  • Type: Element

A shortcut to return the video element of the player.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.query('.art-video'));

video ​

  • Type: Element

Quickly returns the player's video element.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
 
-console.info(art.video);

cssVar ​

  • Type: Function

Dynamically getting or setting css variables

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.video);

cssVar ​

  • Type: Function

Dynamically gets or sets CSS variables.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
@@ -351,7 +391,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     console.log(art.cssVar('--art-theme'));
     art.cssVar('--art-theme', 'green');
     console.log(art.cssVar('--art-theme'));
-});

quality ​

  • Type: Setter
  • Parameter: Array

Dynamically setting the list of qualities

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

quality ​

  • Type: Setter
  • Parameter: Array

Dynamically sets the list of available quality levels.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 	quality: [
@@ -381,18 +421,30 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 			},
 		];
 	}, 3000);
-})

thumbnails ​

  • Type: Setter/Getter
  • Parameter: Object

Dynamically set thumbnails

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-	container: '.artplayer-app',
-	url: '/assets/sample/video.mp4',
-});
+})
 
-art.on('ready', () => {
-    art.thumbnails = {
-        url: '/assets/sample/thumbnails.png',
-        number: 60,
-        column: 10,
-    };
-});

subtitleOffset ​

  • Type: Setter/Getter
  • Parameter: Number

Dynamically set subtitle offset

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+## \`thumbnails\`
+
+-   Type: \`Setter/Getter\`
+-   Parameter: \`Object\`
+
+Dynamically set thumbnails
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js
+var art = new Artplayer({
+	container: '.artplayer-app',
+	url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.thumbnails = {
+        url: '/assets/sample/thumbnails.png',
+        number: 60,
+        column: 10,
+    };
+});

subtitleOffset ​

  • Type: Setter/Getter
  • Parameter: Number

Dynamically set subtitle offset

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
     subtitle: {
diff --git a/docs/document/assets/en_advanced_property.md.COS94_z7.lean.js b/docs/document/assets/en_advanced_property.md.urRMaqHe.lean.js
similarity index 75%
rename from docs/document/assets/en_advanced_property.md.COS94_z7.lean.js
rename to docs/document/assets/en_advanced_property.md.urRMaqHe.lean.js
index bfbaee056..e6ac58a78 100644
--- a/docs/document/assets/en_advanced_property.md.COS94_z7.lean.js
+++ b/docs/document/assets/en_advanced_property.md.urRMaqHe.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Instance Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/property.md","filePath":"en/advanced/property.md","lastUpdated":1726306667000}'),p={name:"en/advanced/property.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default};
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Instance Properties","description":"","frontmatter":{},"headers":[],"relativePath":"en/advanced/property.md","filePath":"en/advanced/property.md","lastUpdated":1764426402000}'),p={name:"en/advanced/property.md"};function h(t,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(p,[["render",h]]);export{g as __pageData,y as default};
diff --git a/docs/document/assets/en_component_contextmenu.md.DgD64wIy.js b/docs/document/assets/en_component_contextmenu.md.COLfX45a.js
similarity index 83%
rename from docs/document/assets/en_component_contextmenu.md.DgD64wIy.js
rename to docs/document/assets/en_component_contextmenu.md.COLfX45a.js
index bec8f9746..75f41b480 100644
--- a/docs/document/assets/en_component_contextmenu.md.DgD64wIy.js
+++ b/docs/document/assets/en_component_contextmenu.md.COLfX45a.js
@@ -1,4 +1,4 @@
-import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Context Menu","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/contextmenu.md","filePath":"en/component/contextmenu.md","lastUpdated":1700976201000}'),p={name:"en/component/contextmenu.md"};function t(h,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Context Menu ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique name of the component, used for marking the class name
indexNumberComponent index, used for display priority
htmlString, ElementThe DOM element of the component
styleObjectStyle object for the component
clickFunctionClick event for the component
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Context Menu","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/contextmenu.md","filePath":"en/component/contextmenu.md","lastUpdated":1759888544000}'),p={name:"en/component/contextmenu.md"};function t(h,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s('

Context Menu ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique component name for CSS class
indexNumberComponent index for display priority
htmlString, ElementComponent DOM element
styleObjectComponent style object
clickFunctionComponent click event
mountedFunctionTriggered after component mount
tooltipStringComponent tooltip text

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -16,7 +16,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 art.contextmenu.show = true;
 
 // Get the Element of contextmenu by name
-console.info(art.contextmenu['your-menu']);

Add ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.contextmenu['your-menu']);

Addition ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -33,7 +33,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 art.contextmenu.show = true;
 
 // Get the Element of contextmenu by name
-console.info(art.contextmenu['your-menu']);

Delete ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.contextmenu['your-menu']);

Removal ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -52,10 +52,10 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     setTimeout(() => {
-        // Delete the context menu by name
+        // Delete the contextmenu by name
         art.contextmenu.remove('your-menu')
     }, 3000);
-});

Updates ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Update ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
diff --git a/docs/document/assets/en_component_contextmenu.md.DgD64wIy.lean.js b/docs/document/assets/en_component_contextmenu.md.COLfX45a.lean.js
similarity index 90%
rename from docs/document/assets/en_component_contextmenu.md.DgD64wIy.lean.js
rename to docs/document/assets/en_component_contextmenu.md.COLfX45a.lean.js
index 1fd03515d..5db4b2f9c 100644
--- a/docs/document/assets/en_component_contextmenu.md.DgD64wIy.lean.js
+++ b/docs/document/assets/en_component_contextmenu.md.COLfX45a.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Context Menu","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/contextmenu.md","filePath":"en/component/contextmenu.md","lastUpdated":1700976201000}'),p={name:"en/component/contextmenu.md"};function t(h,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(p,[["render",t]]);export{g as __pageData,o as default};
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Context Menu","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/contextmenu.md","filePath":"en/component/contextmenu.md","lastUpdated":1759888544000}'),p={name:"en/component/contextmenu.md"};function t(h,a,k,r,E,d){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(p,[["render",t]]);export{g as __pageData,o as default};
diff --git a/docs/document/assets/en_component_controls.md.Bj2oItzY.js b/docs/document/assets/en_component_controls.md.BbQsn0wJ.js
similarity index 87%
rename from docs/document/assets/en_component_controls.md.Bj2oItzY.js
rename to docs/document/assets/en_component_controls.md.BbQsn0wJ.js
index dabe63c91..12fdd3ecd 100644
--- a/docs/document/assets/en_component_controls.md.Bj2oItzY.js
+++ b/docs/document/assets/en_component_controls.md.BbQsn0wJ.js
@@ -1,4 +1,4 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Controller","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/controls.md","filePath":"en/component/controls.md","lastUpdated":1700976201000}'),e={name:"en/component/controls.md"};function h(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Controller ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringThe unique name of the component for class identification
indexNumberThe index of the component, used for display priority
htmlString, ElementThe component's DOM element
styleObjectThe style object for the component
clickFunctionComponent click event
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component
positionStringleft and right control the position of the controller
selectorArrayAn array of objects for the selection list
onSelectFunctionFunction triggered when an item from the selection list is clicked

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Controls","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/controls.md","filePath":"en/component/controls.md","lastUpdated":1764426402000}'),h={name:"en/component/controls.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Controls ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the control
nameStringUnique control name for CSS class identification
indexNumberControl index for display priority
htmlString, ElementControl's DOM element
styleObjectControl style object
clickFunctionControl click event handler
mountedFunctionTriggered after control is mounted
tooltipStringControl tooltip text
positionStringleft or right - controls display position
selectorArrayArray of selector list objects
onSelectFunctionFunction triggered when selector item is clicked

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -64,7 +64,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 // Get the Element of control by name
-console.info(art.controls['button1']);

Delete ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+console.info(art.controls['button1']);

Removal ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -86,7 +86,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
         // Delete the control by name
         art.controls.remove('button1');
     }, 3000);
-});

Update ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Updating ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -127,4 +127,4 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             ],
         });
     }, 3000);
-});
`,1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; +});
`,1)]))}const y=n(h,[["render",e]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/en_component_controls.md.BbQsn0wJ.lean.js b/docs/document/assets/en_component_controls.md.BbQsn0wJ.lean.js new file mode 100644 index 000000000..46ad2eeb1 --- /dev/null +++ b/docs/document/assets/en_component_controls.md.BbQsn0wJ.lean.js @@ -0,0 +1 @@ +import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Controls","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/controls.md","filePath":"en/component/controls.md","lastUpdated":1764426402000}'),h={name:"en/component/controls.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(h,[["render",e]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/en_component_controls.md.Bj2oItzY.lean.js b/docs/document/assets/en_component_controls.md.Bj2oItzY.lean.js deleted file mode 100644 index e8eadbe95..000000000 --- a/docs/document/assets/en_component_controls.md.Bj2oItzY.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Controller","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/controls.md","filePath":"en/component/controls.md","lastUpdated":1700976201000}'),e={name:"en/component/controls.md"};function h(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/docs/document/assets/en_component_layers.md.BNGRBNoB.js b/docs/document/assets/en_component_layers.md.CX93a7QS.js similarity index 88% rename from docs/document/assets/en_component_layers.md.BNGRBNoB.js rename to docs/document/assets/en_component_layers.md.CX93a7QS.js index 811793fb6..ebebccdae 100644 --- a/docs/document/assets/en_component_layers.md.BNGRBNoB.js +++ b/docs/document/assets/en_component_layers.md.CX93a7QS.js @@ -1,12 +1,12 @@ -import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Layer","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/layers.md","filePath":"en/component/layers.md","lastUpdated":1700976201000}'),h={name:"en/component/layers.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Layer ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique name of the component, used for marking class name
indexNumberComponent index, used for display priority
htmlString, ElementThe DOM element of the component
styleObjectStyle object for the component
clickFunctionClick event for the component
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Layer","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/layers.md","filePath":"en/component/layers.md","lastUpdated":1764426402000}'),h={name:"en/component/layers.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Layer ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique component name for CSS class
indexNumberComponent index for display priority
htmlString, ElementComponent DOM element
styleObjectComponent style object
clickFunctionComponent click event
mountedFunctionTriggered after component mount
tooltipStringComponent tooltip text

Creation ​

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: \`<img style="width: 100px" src="\${img}">\`,
-            tooltip: 'Poster Tip',
+            tooltip: 'Potser Tip',
             style: {
                 position: 'absolute',
                 top: '50px',
@@ -23,16 +23,16 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 // Get the Element of layer by name
-console.info(art.layers['poster']);

Add ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
+console.info(art.layers['potser']);

Addition ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.layers.add({
-    name: 'poster',
+    name: 'potser',
     html: \`<img style="width: 100px" src="\${img}">\`,
-    tooltip: 'Poster Tip',
+    tooltip: 'Potser Tip',
     style: {
         position: 'absolute',
         top: '50px',
@@ -47,13 +47,13 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 });
 
 // Get the Element of layer by name
-console.info(art.layers['poster']);

Delete ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
+console.info(art.layers['potser']);

Removal ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: \`<img style="width: 100px" src="\${img}">\`,
             style: {
                 position: 'absolute',
@@ -67,7 +67,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 art.on('ready', () => {
     setTimeout(() => {
         // Delete the layer by name
-        art.layers.remove('poster');
+        art.layers.remove('potser');
     }, 3000);
 });

Update ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
@@ -75,7 +75,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: \`<img style="width: 100px" src="\${img}">\`,
             style: {
                 position: 'absolute',
@@ -90,7 +90,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     setTimeout(() => {
         // Update the layer by name
         art.layers.update({
-            name: 'poster',
+            name: 'potser',
             html: \`<img style="width: 200px" src="\${img}">\`,
             style: {
                 position: 'absolute',
diff --git a/docs/document/assets/en_component_layers.md.BNGRBNoB.lean.js b/docs/document/assets/en_component_layers.md.CX93a7QS.lean.js
similarity index 90%
rename from docs/document/assets/en_component_layers.md.BNGRBNoB.lean.js
rename to docs/document/assets/en_component_layers.md.CX93a7QS.lean.js
index 8656e246a..5a5e6e3d1 100644
--- a/docs/document/assets/en_component_layers.md.BNGRBNoB.lean.js
+++ b/docs/document/assets/en_component_layers.md.CX93a7QS.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Layer","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/layers.md","filePath":"en/component/layers.md","lastUpdated":1700976201000}'),h={name:"en/component/layers.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(h,[["render",e]]);export{c as __pageData,y as default};
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Layer","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/layers.md","filePath":"en/component/layers.md","lastUpdated":1764426402000}'),h={name:"en/component/layers.md"};function e(t,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(h,[["render",e]]);export{c as __pageData,y as default};
diff --git a/docs/document/assets/en_component_setting.md.Dqvlpr4j.js b/docs/document/assets/en_component_setting.md.C6o2AWtX.js
similarity index 77%
rename from docs/document/assets/en_component_setting.md.Dqvlpr4j.js
rename to docs/document/assets/en_component_setting.md.C6o2AWtX.js
index 809cc1dbb..028adf62c 100644
--- a/docs/document/assets/en_component_setting.md.Dqvlpr4j.js
+++ b/docs/document/assets/en_component_setting.md.C6o2AWtX.js
@@ -1,12 +1,12 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Settings Panel","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/setting.md","filePath":"en/component/setting.md","lastUpdated":1750384414000}'),t={name:"en/component/setting.md"};function e(h,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Settings Panel ​

Built-in ​

First, open the settings panel, and then it comes with four built-in items: flip, playbackRate, aspectRatio, subtitleOffset

',3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Settings Panel","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/setting.md","filePath":"en/component/setting.md","lastUpdated":1764426402000}'),t={name:"en/component/setting.md"};function e(h,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s('

Settings Panel ​

Built-in ​

First, you need to open the settings panel. It comes with four built-in items: flip, playbackRate, aspectRatio, subtitleOffset

',3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-    setting: true,
+	setting: true,
     flip: true,
     playbackRate: true,
     aspectRatio: true,
     subtitleOffset: true,
-});

Create - Button ​

PropertyTypeDescription
htmlString, ElementItem DOM
iconString, ElementItem Icon
onClickFunctionClick event
widthNumberList Width
tooltipStringTooltip text
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Creating - Buttons ​

PropertyTypeDescription
htmlString, ElementElement DOM
iconString, ElementElement icon
onClickFunctionElement click event
widthNumberList width
tooltipStringTooltip text
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -21,7 +21,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 			}
         },
     ],
-});

Create - Selection List ​

PropertyTypeDescription
htmlString, ElementItem DOM
iconString, ElementItem Icon
selectorArrayItem selector
onSelectFunctionClick event
widthNumberList Width
tooltipStringTooltip text
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Creating - Selection Lists ​

PropertyTypeDescription
htmlString, ElementElement DOM
iconString, ElementElement icon
selectorArrayElement list
onSelectFunctionElement click event
widthNumberList width
tooltipStringTooltip text
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -116,26 +116,41 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             ],
         },
     ],
-});

Create - Toggle Button ​

PropertyTypeDescription
htmlString, ElementElement's DOM element
iconString, ElementElement's icon
switchBooleanButton's default state
onSwitchFunctionButton toggle event
tooltipStringTooltip text
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    setting: true,
-    settings: [
-        {
-            html: 'PIP Mode',
-            tooltip: 'Close',
-            icon: '<img width="22" height="22" src="/assets/img/state.svg">',
-            switch: false,
-            onSwitch: function (item, $dom, event) {
-                console.info(item, $dom, event);
-                const nextState = !item.switch;
-                art.pip = nextState;
-                item.tooltip = nextState ? 'Open' : 'Close';
-                return nextState;
-            },
-        },
-    ],
-});

Create - Range Slider ​

AttributeTypeDescription
htmlString, ElementThe element's DOM element
iconString, ElementThe element's icon
rangeArrayDefault state array
onRangeFunctionEvent triggered upon completion
onChangeFunctionEvent triggered on change
tooltipStringTooltip text
js
const range = [5, 1, 10, 1];
+});
+
+## Create - Toggle Button
+
+| Property   | Type                | Description               |
+| ---------- | ------------------- | ------------------------- |
+| \`html\`     | \`String\`, \`Element\` | DOM element of the item   |
+| \`icon\`     | \`String\`, \`Element\` | Icon of the item          |
+| \`switch\`   | \`Boolean\`           | Default state of the button |
+| \`onSwitch\` | \`Function\`          | Button toggle event       |
+| \`tooltip\`  | \`String\`            | Tooltip text              |
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    setting: true,
+    settings: [
+        {
+            html: 'PIP Mode',
+            tooltip: 'Close',
+            icon: '<img width="22" height="22" src="/assets/img/state.svg">',
+            switch: false,
+            onSwitch: function (item, $dom, event) {
+                console.info(item, $dom, event);
+                const nextState = !item.switch;
+                art.pip = nextState;
+                item.tooltip = nextState ? 'Open' : 'Close';
+                return nextState;
+            },
+        },
+    ],
+});

Create - Range Slider ​

PropertyTypeDescription
htmlString, ElementDOM element of the item
iconString, ElementIcon of the item
rangeArrayDefault state array
onRangeFunctionEvent triggered on completion
onChangeFunctionEvent triggered on change
tooltipStringTooltip text
js
const range = [5, 1, 10, 1];
 const value = range[0];
 const min = range[1];
 const max = range[2];
@@ -168,7 +183,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     tooltip: '5x',
     icon: '<img width="22" height="22" src="/assets/img/state.svg">',
     range: [5, 1, 10, 1],
-});

Delete ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Remove ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -191,7 +206,7 @@ import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
         // Delete the setting by name
         art.setting.remove('slider');
     }, 3000);
-});

Updates ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Update ​

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
diff --git a/docs/document/assets/en_component_setting.md.Dqvlpr4j.lean.js b/docs/document/assets/en_component_setting.md.C6o2AWtX.lean.js
similarity index 65%
rename from docs/document/assets/en_component_setting.md.Dqvlpr4j.lean.js
rename to docs/document/assets/en_component_setting.md.C6o2AWtX.lean.js
index 7829d9e85..525ef77bc 100644
--- a/docs/document/assets/en_component_setting.md.Dqvlpr4j.lean.js
+++ b/docs/document/assets/en_component_setting.md.C6o2AWtX.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Settings Panel","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/setting.md","filePath":"en/component/setting.md","lastUpdated":1750384414000}'),t={name:"en/component/setting.md"};function e(h,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(t,[["render",e]]);export{c as __pageData,y as default};
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const c=JSON.parse('{"title":"Settings Panel","description":"","frontmatter":{},"headers":[],"relativePath":"en/component/setting.md","filePath":"en/component/setting.md","lastUpdated":1764426402000}'),t={name:"en/component/setting.md"};function e(h,a,k,E,r,d){return p(),l("div",null,a[0]||(a[0]=[s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const y=n(t,[["render",e]]);export{c as __pageData,y as default};
diff --git a/docs/document/assets/en_index.md.CS_tThma.js b/docs/document/assets/en_index.md.C1_6xfSn.js
similarity index 78%
rename from docs/document/assets/en_index.md.CS_tThma.js
rename to docs/document/assets/en_index.md.C1_6xfSn.js
index ef6e25e0c..1bf9e4728 100644
--- a/docs/document/assets/en_index.md.CS_tThma.js
+++ b/docs/document/assets/en_index.md.C1_6xfSn.js
@@ -1,4 +1,4 @@
-import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Installation and Usage","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1757137705000}'),p={name:"en/index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l(`

Installation and Usage ​

Installation ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

Usage ​

html
<html>
+import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Installation & Usage","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1764426402000}'),p={name:"en/index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l(`

Installation & Usage ​

Installation ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

Usage ​

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -19,7 +19,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
           });
         </script>
     </body>
-</html>

Warning

The player's size depends on the size of the container container, so your container container must have a size.

You can find more usage examples at the link below

/packages/artplayer-template

Vue.js ​

vue
<template>
+</html>

Note

The player's dimensions depend on the size of its container container, so your container must have defined dimensions.

See more usage examples at the following link:

/packages/artplayer-template

Vue.js ​

vue
<template>
   <div ref="$container" />
 </template>
 
@@ -51,7 +51,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
   art.value.destroy(false)
 })
 </script>
vue
<template>
-  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
+  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
 </template>
 
 <script setup>
@@ -71,7 +71,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
 function getInstance(art) {
   console.log(art)
 }
-</script>

Artplayer Not Responsive:

Modifying option directly in Vue.js will not change the player

React.js ​

jsx
import Artplayer from 'artplayer'
+</script>

Artplayer is not reactive:

Directly modifying option in Vue.js will not update the player.

React.js ​

jsx
import Artplayer from 'artplayer'
 import { useEffect, useRef } from 'react'
 
 export default function Player({ option, getInstance, ...rest }) {
@@ -111,13 +111,13 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
   )
 }
 
-export default App

Non-responsive Artplayer

In React.js, directly modifying the option will not change the player

TypeScript ​

Importing Artplayer will automatically import artplayer.d.ts

Vue.js ​

vue
<script setup>
+export default App

Artplayer is not reactive:

Directly modifying option in React.js will not update the player.

TypeScript ​

artplayer.d.ts is automatically imported when importing Artplayer.

Vue.js ​

vue
<script setup>
 import Artplayer from 'artplayer';
 const art = shallowRef<Artplayer>(null);
 art.value = new Artplayer();
 </script>

React.js ​

jsx
import Artplayer from 'artplayer';
 const art = useRef<Artplayer>(null);
-art.current = new Artplayer();

Option ​

You can also use the option type

ts
import Artplayer, { type Option } from 'artplayer';
+art.current = new Artplayer();

Option ​

You can also use the option type.

ts
import Artplayer, { type Option } from 'artplayer';
 
 const option: Option = {
     container: '.artplayer-app',
@@ -126,15 +126,15 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
 
 option.volume = 0.5;
 
-const art = new Artplayer(option);

Complete TypeScript Definitions

packages/artplayer/types

JavaScript ​

Sometimes your js file may lose the TypeScript type hints, in this case, you can manually import the types

Variables:

js
/**
+const art = new Artplayer(option);

Full TypeScript definitions

packages/artplayer/types

JavaScript ​

Sometimes your js files may lose TypeScript type hints. In such cases, you can manually import the types.

Variable:

js
/**
  * @type {import("artplayer")}
  */
-let art = null;

Parameters:

js
/**
+let art = null;

Parameter:

js
/**
  * @param {import("artplayer")} art
  */
 function getInstance(art) {
   //
-}

Properties:

js
export default {
+}

Property:

js
export default {
   data() {
     return {
       /**
@@ -143,7 +143,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
       art: null,
     }
   }
-}

Options:

js
/**
+}

Option:

js
/**
  * @type {import("artplayer/types/option").Option}
  */
 
@@ -154,7 +154,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
 
 option.volume = 0.5;
 
-const art8 = new Artplayer(option);

Ancient Browsers ​

The production build of artplayer.js is only compatible with the latest major version of Chrome: last 1 Chrome version

For ancient browsers, you can use the artplayer.legacy.js file, which is compatible up to: IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

If you need to support even older browsers, please modify the following configuration and then build it yourself:

Build configuration: scripts/build.js

Refer to documentation: browserslist

ECMAScript Module ​

Starting from 5.2.6, artplayer and all plugins will also provide an ESM version of mjs, such as:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
+const art8 = new Artplayer(option);

Legacy Browsers ​

The production build artplayer.js only supports the latest major version of Chrome: last 1 Chrome version

For legacy browsers, you can use the artplayer.legacy.js file, which supports compatibility down to: IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

If you need to support even older browsers, modify the following configuration and build it yourself:

Build configuration: scripts/build.js

Reference documentation: browserslist

ECMAScript Module ​

Starting from 5.2.6, artplayer and all plugins also provide an ESM version mjs, such as:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
 <html lang="en">
 
 <head>
@@ -171,7 +171,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
     <script type="importmap">
     {
         "imports": {
-            "artplayer": "https://unpkg.com/artplayer/dist/artplayer.mjs"
+            "artplayer": "https://unpkg.com/artplayer/dist/artplayer.esm.js"
         }
     }
     </script>
@@ -189,7 +189,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
     </script>
 </body>
 
-</html>

Custom userAgent ​

Currently, the determination of mobile devices is not accurate. Sometimes, you may want to adjust the player UI by changing the userAgent. Therefore, starting in version 5.2.4, we added a new globalThis.CUSTOM_USER_AGENT global variable.

html
<html>
+</html>

Custom userAgent ​

Currently, the detection for whether a device is mobile is not entirely accurate. Sometimes you may want to adjust the player's UI by changing the userAgent. Therefore, starting from 5.2.4, a new global variable globalThis.CUSTOM_USER_AGENT has been added.

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -211,4 +211,4 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
           });
         </script>
     </body>
-</html>

Warning

You need to modify it before import the Artplayer for it to take effect

`,50)]))}const c=i(p,[["render",t]]);export{g as __pageData,c as default}; +</html>

Note

You need to modify it before importing the Artplayer dependency for it to take effect.

`,50)]))}const c=i(p,[["render",t]]);export{g as __pageData,c as default}; diff --git a/docs/document/assets/en_index.md.C1_6xfSn.lean.js b/docs/document/assets/en_index.md.C1_6xfSn.lean.js new file mode 100644 index 000000000..bef158a13 --- /dev/null +++ b/docs/document/assets/en_index.md.C1_6xfSn.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Installation & Usage","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1764426402000}'),p={name:"en/index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l("",50)]))}const c=i(p,[["render",t]]);export{g as __pageData,c as default}; diff --git a/docs/document/assets/en_index.md.CS_tThma.lean.js b/docs/document/assets/en_index.md.CS_tThma.lean.js deleted file mode 100644 index 7f1548742..000000000 --- a/docs/document/assets/en_index.md.CS_tThma.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Installation and Usage","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1757137705000}'),p={name:"en/index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l("",50)]))}const c=i(p,[["render",t]]);export{g as __pageData,c as default}; diff --git a/docs/document/assets/en_start_i18n.md.CXVsjwvu.js b/docs/document/assets/en_start_i18n.md.B_wMV7AZ.js similarity index 79% rename from docs/document/assets/en_start_i18n.md.CXVsjwvu.js rename to docs/document/assets/en_start_i18n.md.B_wMV7AZ.js index 6b6ef8cc9..f63fe588c 100644 --- a/docs/document/assets/en_start_i18n.md.CXVsjwvu.js +++ b/docs/document/assets/en_start_i18n.md.B_wMV7AZ.js @@ -1,8 +1,8 @@ -import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Language Settings","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/i18n.md","filePath":"en/start/i18n.md","lastUpdated":1757137705000}'),e={name:"en/start/i18n.md"};function p(t,s,h,r,k,E){return n(),i("div",null,s[0]||(s[0]=[l(`

Language Settings ​

DANGER

Given the increasing number of bundled multilingual packs, starting from version 5.1.0, the core code of artplayer.js will no longer include other languages besides Simplified Chinese and English. You need to import the required languages on your own.

WARNING

When a language cannot be matched, English will be displayed by default. For i18n usage, refer to: artplayer/types/i18n.d.ts

Default Languages ​

The default languages are: en, zh-cn, which do not require manual import.

js
var art = new Artplayer({
+import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Language Settings","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/i18n.md","filePath":"en/start/i18n.md","lastUpdated":1764426402000}'),e={name:"en/start/i18n.md"};function p(t,s,h,r,k,E){return n(),i("div",null,s[0]||(s[0]=[l(`

Language Settings ​

DANGER

Due to the increasing number of bundled multilingual resources, starting from version 5.1.0, the core artplayer.js code will only include Simplified Chinese and English. Other languages are no longer bundled by default and must be imported manually as needed.

WARNING

When a language cannot be matched, English will be displayed by default. For i18n implementation reference, see: artplayer/types/i18n.d.ts

Default Languages ​

The default languages are: en, zh-cn. No manual import is required.

js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'zh-cn', // or 'en'
-});

Importing Languages ​

Language files before packaging are located in: artplayer/src/i18n/*.js.

Packaged language files are located at: artplayer/dist/i18n/*.js.

js
import id from 'artplayer/i18n/id';
+});

Importing Languages ​

Language files before bundling are located at: artplayer/src/i18n/*.js. Contributions to add your language are welcome.

Language files after bundling are located at: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
 import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
@@ -24,7 +24,7 @@ import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
         'zh-tw': window['artplayer-i18n-zh-tw'],
     },
     lang: 'zh-tw',
-});

Add Language ​

js
var art = new Artplayer({
+});

Adding a New Language ​

js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'your-lang',
@@ -33,7 +33,7 @@ import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
             Play: 'Your Play'
         },
     },
-});

Modify Language ​

js
import zhTw from 'artplayer/i18n/zh-tw';
+});

Modifying Languages ​

js
import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
     container: '.artplayer-app',
diff --git a/docs/document/assets/en_start_i18n.md.CXVsjwvu.lean.js b/docs/document/assets/en_start_i18n.md.B_wMV7AZ.lean.js
similarity index 70%
rename from docs/document/assets/en_start_i18n.md.CXVsjwvu.lean.js
rename to docs/document/assets/en_start_i18n.md.B_wMV7AZ.lean.js
index cbfd50101..b9234b59f 100644
--- a/docs/document/assets/en_start_i18n.md.CXVsjwvu.lean.js
+++ b/docs/document/assets/en_start_i18n.md.B_wMV7AZ.lean.js
@@ -1 +1 @@
-import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Language Settings","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/i18n.md","filePath":"en/start/i18n.md","lastUpdated":1757137705000}'),e={name:"en/start/i18n.md"};function p(t,s,h,r,k,E){return n(),i("div",null,s[0]||(s[0]=[l("",14)]))}const c=a(e,[["render",p]]);export{g as __pageData,c as default};
+import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"Language Settings","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/i18n.md","filePath":"en/start/i18n.md","lastUpdated":1764426402000}'),e={name:"en/start/i18n.md"};function p(t,s,h,r,k,E){return n(),i("div",null,s[0]||(s[0]=[l("",14)]))}const c=a(e,[["render",p]]);export{g as __pageData,c as default};
diff --git a/docs/document/assets/en_start_option.md.6JX4hU8Q.js b/docs/document/assets/en_start_option.md.Bk4YXvof.js
similarity index 68%
rename from docs/document/assets/en_start_option.md.6JX4hU8Q.js
rename to docs/document/assets/en_start_option.md.Bk4YXvof.js
index 0ac2c6b4a..a66793215 100644
--- a/docs/document/assets/en_start_option.md.6JX4hU8Q.js
+++ b/docs/document/assets/en_start_option.md.Bk4YXvof.js
@@ -1,26 +1,26 @@
-import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Basic Options","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/option.md","filePath":"en/start/option.md","lastUpdated":1742615709000}'),p={name:"en/start/option.md"};function t(h,a,r,k,d,E){return l(),e("div",null,a[0]||(a[0]=[s('

Basic Options ​

container ​

  • Type: String, Element
  • Default: #artplayer

The DOM container where the player mounts

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Basic Options","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/option.md","filePath":"en/start/option.md","lastUpdated":1764426402000}'),p={name:"en/start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s('

Basic Options ​

container ​

  • Type: String, Element
  • Default: #artplayer

The DOM container where the player is mounted.

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app', 
     // container: document.querySelector('.artplayer-app'),
     url: '/assets/sample/video.mp4',
-});

You may need to initialize the size of the container element, like:

css
.artplayer-app {
+});

You may need to initialize the size of the container element, for example:

css
.artplayer-app {
     width: 400px;
     height: 300px;
 }

Or use aspect-ratio:

css
.artplayer-app {
     aspect-ratio: 16/9;
-}

Tip

Among all options, only container is mandatory.

url ​

  • Type: String
  • Default: ''

The video source address

`,9),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+}

Note

Among all options, only container is required.

url ​

  • Type: String
  • Default: ''

The video source URL.

`,9),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

Sometimes the url is not known so quickly, in which case you can set the url asynchronously.

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Sometimes the url is not known immediately; in such cases, you can set the url asynchronously.

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
 });
 
 setTimeout(() => {
     art.url = '/assets/sample/video.mp4';
-}, 1000);

Note

The default support is for three video file formats: .mp4, .ogg, .webm.

If you need to play other formats such as .m3u8 or .flv, please refer to the Third-party Libraries on the left side.

id ​

  • Type: String
  • Default: ''

The unique identifier of the player, currently used only for remembering playback with autoplayback

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+}, 1000);

Note

By default, three video file formats are supported: .mp4, .ogg, .webm.

To play other formats like .m3u8 or .flv, please refer to the Third-party Libraries section on the left.

id ​

  • Type: String
  • Default: ''

The unique identifier for the player, currently only used for playback resumption autoplayback.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     id: 'your-url-id',
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

onReady ​

  • Type: Function
  • Default: undefined

The constructor accepts a function as the second argument, which is triggered when the player is successfully initialized and the video is ready to play, similar to the ready event

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer(
+});

onReady ​

  • Type: Function
  • Default: undefined

The constructor accepts a function as the second parameter, which is triggered when the player is successfully initialized and the video is ready to play, similar to the ready event.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer(
     {
         container: '.artplayer-app',
         url: '/assets/sample/video.mp4',
@@ -37,87 +37,103 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
 
 art.on('ready', () => {
     art.play();
-});

Warning

The this inside the callback function refers to the player instance, but if an arrow function is used for the callback, this will not point to the player instance.

poster ​

  • Type: String
  • Default: ''

The poster of the video, which only appears when the player is initialized and before it starts playing.

`,7),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

Inside the callback function, this refers to the player instance. However, if an arrow function is used for the callback, this will not point to the player instance.

poster ​

  • Type: String
  • Default: ''

The video poster image, which only appears when the player is initialized and not yet playing.

`,7),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     poster: '/assets/sample/poster.jpg',
-});

theme ​

  • Type: String
  • Default: #f00

Player theme color, currently used for progress bar and highlight elements

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

theme ​

  • Type: String
  • Default: #f00

The player's theme color, currently used for the progress bar and highlighted elements.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     theme: '#ffad00',
-});

volume ​

  • Type: Number
  • Default: 0.7

The default volume of the player

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

volume ​

  • Type: Number
  • Default: 0.7

The default volume of the player.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     volume: 0.5,
-});

Warning

The player will cache the size of the last volume. When the player is initialized next time (such as refreshing the page), it will read this cached value.

isLive ​

  • Type: Boolean
  • Default: false

Use live mode, which will hide the progress bar and playback time

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

The player caches the last volume level; upon next initialization (e.g., page refresh), the player will read this cached value.

isLive ​

  • Type: Boolean
  • Default: false

Enable live streaming mode, which hides the progress bar and playback time.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     isLive: true,
-});

muted ​

  • Type: Boolean
  • Default: false

Whether to mute by default

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

muted ​

  • Type: Boolean
  • Default: false

Whether to mute by default.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
-});

autoplay ​

  • Type: Boolean
  • Default: false

Whether to play automatically

  • Default: false

Autoplay

`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

autoplay ​

  • Type: Boolean
  • Default: false

Whether to autoplay.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoplay: true,
     muted: true,
-});

Warning

If you want the video to autoplay by default upon entering the page, muted must be set to true. For more information, please read Autoplay Policy Changes

autoSize ​

  • Type: Boolean
  • Default: false

The size of the player will by default fill the entire container, which often results in black bars. This value can automatically adjust the player size to hide the black bars, similar to css's object-fit: cover;

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

If you want the video to autoplay immediately upon page load, muted must be set to true. For more information, please read Autoplay Policy Changes.

autoSize ​

  • Type: Boolean
  • Default: false

By default, the player's dimensions fill the entire container size, often resulting in black bars. This option automatically adjusts the player size to hide the black bars, similar to object-fit: cover; in CSS.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoSize: true,
-});

autoMini ​

  • Type: Boolean
  • Default: false

Automatically enter mini mode when the player scrolls out of the browser viewport

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    autoMini: true,
-});

loop ​

  • Type: Boolean
  • Default: false

Whether to loop the video

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});
+
+## \`autoMini\`
+
+-   Type: \`Boolean\`
+-   Default: \`false\`
+
+Automatically enters \`mini player\` mode when the player scrolls out of the browser viewport.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{4}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    autoMini: true,
+});

loop ​

  • Type: Boolean
  • Default: false

Whether to enable video looping.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     loop: true,
-});

flip ​

  • Type: Boolean
  • Default: false

Whether to show the video flip feature, currently only available in Settings Panel and Context Menu

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

flip ​

  • Type: Boolean
  • Default: false

Whether to display the video flip functionality. Currently appears in the Settings Panel and Context Menu.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     flip: true,
     setting: true,
-});

playbackRate ​

  • Type: Boolean
  • Default: false

Whether to show the playback speed feature of the video, it will appear in Settings Panel and Context Menu

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

playbackRate ​

  • Type: Boolean
  • Default: false

Whether to display the video playback rate functionality. Appears in the Settings Panel and Context Menu.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     playbackRate: true,
     setting: true,
-});

aspectRatio ​

  • Type: Boolean
  • Default: false

Displays the video aspect ratio feature, it will appear in the Settings Panel and Context Menu

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

aspectRatio ​

  • Type: Boolean
  • Default: false

Whether to display the video aspect ratio functionality. Appears in the Settings Panel and Context Menu.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     aspectRatio: true,
     setting: true,
-});

screenshot ​

  • Type: Boolean
  • Default: false

Whether to show the screenshot button, it will appear in the toolbar and context menu Display Screenshot function in the bottom control bar

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

screenshot ​

  • Type: Boolean
  • Default: false

Whether to display the Video Screenshot functionality in the bottom control bar.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     screenshot: true,
-});

Warning

Due to browser security mechanisms, if the video source address and the website are cross-origin, screenshot failure may occur

setting ​

  • Type: Boolean
  • Default: false

Display the toggle button for the Settings Panel in the bottom control bar

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, screenshot capture may fail if the video source URL is cross-origin with the website.

setting ​

  • Type: Boolean
  • Default: false

Whether to display the toggle button for the Settings Panel in the bottom control bar.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
-});

hotkey ​

  • Type: Boolean
  • Default: true

Whether to use hotkeys

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

hotkey ​

  • Type: Boolean
  • Default: true

Whether to enable hotkeys.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     hotkey: true,
-});
HotkeyDescription
↑Increase volume
↓Decrease volume
←Fast forward video
→Rewind video
spaceToggle play/pause

Tip

These hotkeys will only work after the player gains focus (such as after clicking on the player).

pip ​

  • Type: Boolean
  • Default: false Show the Picture in Picture switch button on the bottom control bar
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});
HotkeyDescription
↑Increase volume
↓Decrease volume
←Seek forward
→Seek backward
spaceToggle play/pause

Note

These hotkeys only take effect after the player gains focus (e.g., by clicking on the player).

pip ​

  • Type: Boolean
  • Default: false

Whether to display the Picture-in-Picture toggle button in the bottom control bar.

`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     pip: true,
-});

mutex ​

  • Type: Boolean
  • Default: true

If there are multiple players on the page, should only one player be allowed to play at a time

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

mutex ​

  • Type: Boolean
  • Default: true

If multiple players exist simultaneously on the page, whether only one player is allowed to play at a time.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     mutex: true,
-});

fullscreen ​

  • Type: Boolean
  • Default: false Display the Window Fullscreen button on the control bar at the bottom
`,3),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

backdrop ​

  • Type: Boolean
  • Default: true

Whether to enable the backdrop blur effect for the player UI. When enabled, overlays such as the settings panel, context menu, and volume bar will apply a backdrop-filter frosted glass effect for a more transparent appearance. However, this may cause performance or compatibility issues on some low-performance devices or older browsers.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    backdrop: false, // Disable frosted glass effect
+});

fullscreen ​

  • Type: Boolean
  • Default: false

Whether to display the player Window Fullscreen button in the bottom control bar.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreen: true,
-});

fullscreenWeb ​

  • Type: Boolean
  • Default: false

Display the Web Fullscreen button on the control bar at the bottom

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

fullscreenWeb ​

  • Type: Boolean
  • Default: false

Whether to display the player Webpage Fullscreen button in the bottom control bar.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
-});

subtitleOffset ​

  • Type: Boolean

  • Default: false

Subtitle time offset, the range is [-5s, 5s], appearing in the Settings panel

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

subtitleOffset ​

  • Type: Boolean
  • Default: false

Subtitle timing offset, range within [-5s, 5s]. Appears in the Settings Panel.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitleOffset: true,
@@ -125,28 +141,40 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
         url: '/assets/sample/subtitle.srt',
     },
     setting: true,
-});

miniProgressBar ​

  • Type: Boolean
  • Default: false

Mini progress bar, only appears when the player loses focus and is playing

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    miniProgressBar: true,
-});

useSSR ​

  • Type: Boolean
  • Default: false

Whether to use SSR (Server-Side Rendering) mount mode, useful if you want to pre-render the player's required HTML before the player mounts

You can access the player's required HTML through Artplayer.html

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var $container = document.querySelector('.artplayer-app');
+});
+
+## \`miniProgressBar\`
+
+-   Type: \`Boolean\`
+-   Default: \`false\`
+
+Mini progress bar that appears only when the player loses focus and is playing.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{4}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    miniProgressBar: true,
+});

useSSR ​

  • Type: Boolean
  • Default: false

Whether to use SSR mount mode. Useful if you want to pre-render the player's required HTML before mounting.

You can access the player's required HTML via Artplayer.html.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var $container = document.querySelector('.artplayer-app');
 $container.innerHTML = Artplayer.html;
 
 var art = new Artplayer({
     container: $container,
     url: '/assets/sample/video.mp4',
     useSSR: true,
-});

playsInline ​

  • Type: Boolean
  • Default: true

Whether to use playsInline mode on mobile devices

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

playsInline ​

  • Type: Boolean
  • Default: true

Whether to use playsInline mode on mobile devices.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     playsInline: true,
-});

layers ​

  • Type: Array
  • Default: []

Initializes custom layers

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
+});

layers ​

  • Type: Array
  • Default: []

Initialize custom layers.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: \`<img style="width: 100px" src="\${img}">\`,
             style: {
                 position: 'absolute',
@@ -163,7 +191,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Component Configuration Please refer to the following address:

/component/layers.html

settings ​

  • Type: Array
  • Default: []

Initializes custom settings panel

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/layers.html

settings ​

  • Type: Array
  • Default: []

Initialize custom settings panel.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -197,7 +225,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Settings Panel Please refer to the following address

/component/setting.html

contextmenu ​

  • Type: Array
  • Default: []

Initialize custom context menu

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

For Settings Panel, please refer to:

/component/setting.html

contextmenu ​

  • Type: Array
  • Default: []

Initialize custom context menu.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -209,7 +237,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Component Configuration Please refer to the following address:

/component/contextmenu.html- Type:

controls ​

  • Type: Array
  • Default: []

Initializes custom bottom control bar

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/contextmenu.html

controls ​

  • Type: Array
  • Default: []

Initialize custom bottom control bar.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -225,21 +253,45 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

Component Configuration Refer to the following address:

/component/controls.html

quality ​

  • Type: Array
  • Default: []

Whether to show the quality selection list in the bottom control bar

PropertyTypeDescription
defaultBooleanDefault quality
htmlStringQuality name
urlStringQuality URL
`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    quality: [
-        {
-            default: true,
-            html: 'SD 480P',
-            url: '/assets/sample/video.mp4',
-        },
-        {
-            html: 'HD 720P',
-            url: '/assets/sample/video.mp4',
-        },
-    ],
-});

highlight ​

  • Type: Array
  • Default: []

Show highlight information on the progress bar

PropertyTypeDescription
timeNumberHighlight time (in seconds)
textStringHighlight text
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});
+
+:::warning For \`Component Configuration\`, please refer to:
+
+[/component/controls.html](/component/controls.html)
+
+:::
+
+## \`quality\`
+
+-   Type: \`Array\`
+-   Default: \`[]\`
+
+Whether to display the \`Quality Selection\` list in the bottom control bar.
+
+| Property  | Type      | Description      |
+| --------- | --------- | ---------------- |
+| \`default\` | \`Boolean\` | Default quality  |
+| \`html\`    | \`String\`  | Quality name     |
+| \`url\`     | \`String\`  | Quality URL      |
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{4-14}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    quality: [
+        {
+            default: true,
+            html: 'SD 480P',
+            url: '/assets/sample/video.mp4',
+        },
+        {
+            html: 'HD 720P',
+            url: '/assets/sample/video.mp4',
+        },
+    ],
+});

highlight ​

  • Type: Array
  • Default: []

Display Highlight Information on the progress bar.

PropertyTypeDescription
timeNumberHighlight time (in seconds)
textStringHighlight text
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     highlight: [
@@ -264,7 +316,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             text: '--终わり--',
         },
     ],
-});

plugins ​

  • Type: Array
  • Default: []

Initialize custom plugins

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
function myPlugin(art) {
+});

plugins ​

  • Type: Array
  • Default: []

Initialize custom plugins.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -279,7 +331,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     plugins: [myPlugin],
-});

thumbnails ​

  • Type: Object
  • Default: {}

Set thumbnails on the progress bar

PropertyTypeDescription
urlStringThumbnail URL
numberNumberNumber of thumbnails
columnNumberColumns of thumbnails
widthNumberThumbnail width
heightNumberThumbnail height
scaleNumberThumbnail scale
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

thumbnails ​

  • Type: Object
  • Default: {}

Set Preview Thumbnails on the progress bar.

PropertyTypeDescription
urlStringThumbnail image URL
numberNumberNumber of thumbnails
columnNumberNumber of thumbnail columns
widthNumberThumbnail width
heightNumberThumbnail height
scaleNumberThumbnail scale
`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     thumbnails: {
@@ -287,7 +339,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
         number: 60,
         column: 10,
     },
-});

Online thumbnail generation

artplayer-tool-thumbnail

subtitle ​

  • Type: Object
  • Default: {}

Set the video subtitles, supporting subtitle formats: vtt, srt, ass

PropertyTypeDescription
nameStringSubtitle name
urlStringSubtitle URL
typeStringSubtitle type, options: vtt, srt, ass
styleObjectSubtitle style
encodingStringSubtitle encoding, default utf-8
escapeBooleanWhether to escape html tags, default true
onVttLoadFunctionFunction to modify vtt text
`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Generate Thumbnails Online

artplayer-tool-thumbnail

subtitle ​

  • Type: Object
  • Default: {}

Set the video subtitle. Supported subtitle formats: vtt, srt, ass.

PropertyTypeDescription
nameStringSubtitle name
urlStringSubtitle URL
typeStringSubtitle type, options: vtt, srt, ass
styleObjectSubtitle style
encodingStringSubtitle encoding, default: utf-8
escapeBooleanWhether to escape html tags, default: true
onVttLoadFunctionFunction for modifying vtt text
`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -300,25 +352,37 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             'font-size': '30px',
         },
     },
-});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'}

Additional video attributes, these attributes will be directly written into the video element

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'} (In Safari, it automatically adjusts to preload: 'auto' for better loading experience).

More video attributes. These attributes will be directly written into the video element.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     moreVideoAttr: {
         'webkit-playsinline': true,
         playsInline: true,
     },
-});

icons ​

  • Type: Object
  • Default: {}

Used to replace default icons, supports Html strings and HTMLElement

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    icons: {
-        loading: '<img src="/assets/img/loading.gif">',
-        state: '<img src="/assets/img/state.png">',
-    },
-});

Definition of all icons

artplayer/types/icons.d.ts

type ​

  • Type: String
  • Default: ''

Used to specify the format of the video, which is used in conjunction with customType. By default, the video format is the same as the file extension of the video URL (such as .m3u8, .mkv, .ts). However, sometimes the video URL does not have the correct file extension, so it needs to be specifically stated.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});
+
+## \`icons\`
+
+-   Type: \`Object\`
+-   Default: \`{}\`
+
+Used to replace default icons, supports both \`Html\` strings and \`HTMLElement\`.
+
+<div className="run-code">▶ Run Code</div>
+
+\`\`\`js{4-7}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    icons: {
+        loading: '<img src="/assets/img/ploading.gif">',
+        state: '<img src="/assets/img/state.png">',
+    },
+});

All Icon Definitions

artplayer/types/icons.d.ts

type ​

  • Type: String
  • Default: ''

Used to specify the video format. It needs to be used in conjunction with customType. By default, the video format is determined by the suffix of the video URL (e.g., .m3u8, .mkv, .ts). However, sometimes the video URL lacks the correct suffix, so explicit specification is necessary.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.m3u8',
     type: 'm3u8',
-});

Recognition of file extensions

The player can only parse this type of file extension: /assets/sample/video.m3u8

But it cannot parse this type of file extension: /assets/sample/video?type=m3u8

Therefore, if you use customType, it is best to specify type as well

customType ​

  • Type: Object
  • Default: {}

Matches the video's type to delegate the video decoding to a third-party program for processing. The processing function can receive three parameters:

  • video: Video DOM element
  • url: Video address
  • art: Current instance
`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Suffix Recognition

The player can only parse suffixes like this: /assets/sample/video.m3u8

But cannot parse suffixes like this: /assets/sample/video?type=m3u8

Therefore, if you use customType, it is best to also specify the type.

customType ​

  • Type: Object
  • Default: {}

Matches based on the video's type and delegates video decoding to third-party programs. The handler function receives three parameters:

  • video: The video DOM element
  • url: The video URL
  • art: The current instance
`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.m3u8',
     customType: {
@@ -326,11 +390,11 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             //
         },
     },
-});

lang ​

  • Type: String
  • Default: navigator.language.toLowerCase()

Default display language, currently supports: en, zh-cn

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

lang ​

  • Type: String
  • Default: navigator.language.toLowerCase()

The default display language. Currently supported: en, zh-cn.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'en',
-});

More language settings

/start/i18n.html

i18n ​

  • Type: Object
  • Default: {}

Custom i18n configuration, which will be deeply merged with the built-in i18n

Add your language:

`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

More Language Settings

/start/i18n.html

i18n ​

  • Type: Object
  • Default: {}

Custom i18n configuration. This configuration will be deeply merged with the built-in i18n.

Add your language:

`,6),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'your-lang',
@@ -339,7 +403,7 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             Play: 'Your Play'
         },
     },
-});

Modifying the existing language

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Modify an existing language:

`,2),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     i18n: {
@@ -350,39 +414,39 @@ import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             Play: 'Your Play'
         },
     },
-});

More language settings

/start/i18n.html

lock ​

  • Type: Boolean
  • Default: false

Whether to display a lock button on mobile to hide the bottom control bar

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

More Language Settings

/start/i18n.html

lock ​

  • Type: Boolean
  • Default: false

Whether to display a lock button on mobile devices to hide the bottom control bar.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lock: true,
-});

gesture ​

  • Type: Boolean
  • Default: true

Whether to enable gesture events on video elements on mobile devices

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

gesture ​

  • Type: Boolean
  • Default: true

Whether to enable gesture events on the video element on mobile devices.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     gesture: false,
-});

fastForward ​

  • Type: Boolean
  • Default: false

Whether to add fast forward function by long pressing on the video on mobile devices

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

fastForward ​

  • Type: Boolean
  • Default: false

Whether to add a long-press video fast-forward feature on mobile devices.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

autoPlayback ​

  • Type: Boolean
  • Default: false

Whether to use the automatic playback feature

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

autoPlayback ​

  • Type: Boolean
  • Default: false

Whether to use the automatic playback feature.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     id: 'your-url-id',
     autoPlayback: true,
-});

Warning

Because the player by default uses url as the key to cache the playback progress

But if the url of the same video is different, then you need to use id to identify the unique key of the video

autoOrientation ​

  • Type: Boolean
  • Default: false

Whether to rotate the player on mobile web pages in full screen according to the video size and the viewport dimensions

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

Note

By default, the player uses the url as the key to cache the playback progress.

However, if the same video has different urls, you need to use the id to identify the unique key for the video.

autoOrientation ​

  • Type: Boolean
  • Default: false

Whether to rotate the player during fullscreen mode on mobile web, based on the video dimensions and viewport size.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoOrientation: true,
-});

airplay ​

  • Type: Boolean
  • Default: false

Whether to display the airplay button, currently only some browsers support this feature

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

airplay ​

  • Type: Boolean
  • Default: false

Whether to display the airplay button. Currently, only some browsers support this feature.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     airplay: true,
-});

cssVar ​

  • Type: Object
  • Default: {}

Used to change built-in CSS variables

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

cssVar ​

  • Type: Object
  • Default: {}

Used to modify built-in CSS variables.

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     cssVar: {
         //
     },
-});

Reference for cssVar syntax

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

The function can return a third-party HTMLCanvasElement or HTMLVideoElement, for example, it can proxy an existing video DOM element

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

CSS Variable Reference

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

The function can return a third-party HTMLCanvasElement or HTMLVideoElement. For example, it can proxy an existing video DOM element.

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     proxy: () => document.createElement('video')
-});
`,1)]))}const g=n(p,[["render",t]]);export{o as __pageData,g as default}; +});
`,1)]))}const g=n(p,[["render",h]]);export{o as __pageData,g as default}; diff --git a/docs/document/assets/en_start_option.md.6JX4hU8Q.lean.js b/docs/document/assets/en_start_option.md.Bk4YXvof.lean.js similarity index 51% rename from docs/document/assets/en_start_option.md.6JX4hU8Q.lean.js rename to docs/document/assets/en_start_option.md.Bk4YXvof.lean.js index 50af324cc..2cd059ad6 100644 --- a/docs/document/assets/en_start_option.md.6JX4hU8Q.lean.js +++ b/docs/document/assets/en_start_option.md.Bk4YXvof.lean.js @@ -1 +1 @@ -import{_ as n,c as e,o as l,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Basic Options","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/option.md","filePath":"en/start/option.md","lastUpdated":1742615709000}'),p={name:"en/start/option.md"};function t(h,a,r,k,d,E){return l(),e("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",9),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",7),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",3),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const g=n(p,[["render",t]]);export{o as __pageData,g as default}; +import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const o=JSON.parse('{"title":"Basic Options","description":"","frontmatter":{},"headers":[],"relativePath":"en/start/option.md","filePath":"en/start/option.md","lastUpdated":1764426402000}'),p={name:"en/start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",9),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",7),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const g=n(p,[["render",h]]);export{o as __pageData,g as default}; diff --git a/docs/document/assets/index.md.BiU-7WW0.js b/docs/document/assets/index.md.BfiYqSM4.js similarity index 96% rename from docs/document/assets/index.md.BiU-7WW0.js rename to docs/document/assets/index.md.BfiYqSM4.js index 03dfd2bd7..438be5416 100644 --- a/docs/document/assets/index.md.BiU-7WW0.js +++ b/docs/document/assets/index.md.BfiYqSM4.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"安装使用","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1757137705000}'),p={name:"index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l(`

安装使用 ​

安装 ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

使用 ​

html
<html>
+import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"安装使用","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1757137705000}'),p={name:"index.md"};function t(e,s,h,k,r,E){return n(),a("div",null,s[0]||(s[0]=[l(`

安装使用 ​

安装 ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

使用 ​

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -19,7 +19,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
           });
         </script>
     </body>
-</html>

提示

播放器的尺寸依赖于容器 container 的尺寸,所以你的容器 container 必须是有尺寸的

以下链接可以看到更多的使用例子

/packages/artplayer-template

Vue.js ​

vue
<template>
+</html>

提示

播放器的尺寸依赖于容器 container 的尺寸,所以你的容器 container 必须是有尺寸的

以下链接可以看到更多的使用例子

/packages/artplayer-template

Vue.js ​

vue
<template>
   <div ref="$container" />
 </template>
 
@@ -51,7 +51,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
   art.value.destroy(false)
 })
 </script>
vue
<template>
-  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
+  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
 </template>
 
 <script setup>
@@ -71,7 +71,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
 function getInstance(art) {
   console.log(art)
 }
-</script>

Artplayer 非响应式:

在 Vue.js 里直接修改 option 是不会改变播放器的

React.js ​

jsx
import Artplayer from 'artplayer'
+</script>

Artplayer 非响应式:

在 Vue.js 里直接修改 option 是不会改变播放器的

React.js ​

jsx
import Artplayer from 'artplayer'
 import { useEffect, useRef } from 'react'
 
 export default function Player({ option, getInstance, ...rest }) {
@@ -154,7 +154,7 @@ import{_ as i,c as a,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const g
 
 option.volume = 0.5;
 
-const art8 = new Artplayer(option);

古老的浏览器 ​

生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version

对于古老的浏览器,可以使用 artplayer.legacy.js 文件,可以兼容到:IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

假如你要兼容更古老的浏览器时,请修改以下配置然后自行构建:

构建配置:scripts/build.js

参考文档:browserslist

ECMAScript Module ​

从 5.2.6 开始,artplayer 和所有插件还会提供一个 ESM 版本的 mjs,如:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
+const art8 = new Artplayer(option);

古老的浏览器 ​

生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version

对于古老的浏览器,可以使用 artplayer.legacy.js 文件,可以兼容到:IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

假如你要兼容更古老的浏览器时,请修改以下配置然后自行构建:

构建配置:scripts/build.js

参考文档:browserslist

ECMAScript Module ​

从 5.2.6 开始,artplayer 和所有插件还会提供一个 ESM 版本的 mjs,如:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
 <html lang="en">
 
 <head>
diff --git a/docs/document/assets/index.md.BiU-7WW0.lean.js b/docs/document/assets/index.md.BfiYqSM4.lean.js
similarity index 100%
rename from docs/document/assets/index.md.BiU-7WW0.lean.js
rename to docs/document/assets/index.md.BfiYqSM4.lean.js
diff --git a/docs/document/assets/plugin_danmuku.md.oENZOFMk.js b/docs/document/assets/plugin_danmuku.md.B7E5dRUy.js
similarity index 99%
rename from docs/document/assets/plugin_danmuku.md.oENZOFMk.js
rename to docs/document/assets/plugin_danmuku.md.B7E5dRUy.js
index 998bce1db..88f2e9c06 100644
--- a/docs/document/assets/plugin_danmuku.md.oENZOFMk.js
+++ b/docs/document/assets/plugin_danmuku.md.B7E5dRUy.js
@@ -1,4 +1,4 @@
-import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"弹幕库","description":"","frontmatter":{},"headers":[],"relativePath":"plugin/danmuku.md","filePath":"plugin/danmuku.md","lastUpdated":1734270991000}'),h={name:"plugin/danmuku.md"};function e(k,a,t,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s(`

弹幕库 ​

演示 ​

👉 查看完整演示

安装 ​

bash
npm install artplayer-plugin-danmuku
bash
yarn add artplayer-plugin-danmuku
bash
pnpm add artplayer-plugin-danmuku
html
<script src="path/to/artplayer-plugin-danmuku.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js
bash
https://unpkg.com/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js

弹幕结构 ​

每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数

js
{
+import{_ as n,c as l,o as p,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const y=JSON.parse('{"title":"弹幕库","description":"","frontmatter":{},"headers":[],"relativePath":"plugin/danmuku.md","filePath":"plugin/danmuku.md","lastUpdated":1734270991000}'),h={name:"plugin/danmuku.md"};function e(k,a,t,r,E,d){return p(),l("div",null,a[0]||(a[0]=[s(`

弹幕库 ​

演示 ​

👉 查看完整演示

安装 ​

bash
npm install artplayer-plugin-danmuku
bash
yarn add artplayer-plugin-danmuku
bash
pnpm add artplayer-plugin-danmuku
html
<script src="path/to/artplayer-plugin-danmuku.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js
bash
https://unpkg.com/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js

弹幕结构 ​

每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数

js
{
     text: '', // 弹幕文本
     time: 10, // 弹幕时间, 默认为当前播放器时间
     mode: 0, // 弹幕模式: 0: 滚动(默认),1: 顶部,2: 底部
diff --git a/docs/document/assets/plugin_danmuku.md.oENZOFMk.lean.js b/docs/document/assets/plugin_danmuku.md.B7E5dRUy.lean.js
similarity index 100%
rename from docs/document/assets/plugin_danmuku.md.oENZOFMk.lean.js
rename to docs/document/assets/plugin_danmuku.md.B7E5dRUy.lean.js
diff --git a/docs/document/assets/start_i18n.md.Dd9hEcJD.js b/docs/document/assets/start_i18n.md.CO8qytwE.js
similarity index 98%
rename from docs/document/assets/start_i18n.md.Dd9hEcJD.js
rename to docs/document/assets/start_i18n.md.CO8qytwE.js
index 453a23e18..dab2fe443 100644
--- a/docs/document/assets/start_i18n.md.Dd9hEcJD.js
+++ b/docs/document/assets/start_i18n.md.CO8qytwE.js
@@ -2,7 +2,7 @@ import{_ as a,c as i,o as n,ak as l}from"./chunks/framework.xxfEszSJ.js";const c
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'zh-cn', // or 'en'
-});

导入语言 ​

打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言

打包后的语言文件存放于: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
+});

导入语言 ​

打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言

打包后的语言文件存放于: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
 import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
diff --git a/docs/document/assets/start_i18n.md.Dd9hEcJD.lean.js b/docs/document/assets/start_i18n.md.CO8qytwE.lean.js
similarity index 100%
rename from docs/document/assets/start_i18n.md.Dd9hEcJD.lean.js
rename to docs/document/assets/start_i18n.md.CO8qytwE.lean.js
diff --git a/docs/document/assets/start_option.md.B5CHO-We.js b/docs/document/assets/start_option.md.D52S8Ynf.js
similarity index 96%
rename from docs/document/assets/start_option.md.B5CHO-We.js
rename to docs/document/assets/start_option.md.D52S8Ynf.js
index fe3524cb6..442cf966b 100644
--- a/docs/document/assets/start_option.md.B5CHO-We.js
+++ b/docs/document/assets/start_option.md.D52S8Ynf.js
@@ -1,4 +1,4 @@
-import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"基础选项","description":"","frontmatter":{},"headers":[],"relativePath":"start/option.md","filePath":"start/option.md","lastUpdated":1742615709000}'),p={name:"start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s('

基础选项 ​

container ​

  • Type: String, Element
  • Default: #artplayer

播放器挂载的 DOM 容器

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"基础选项","description":"","frontmatter":{},"headers":[],"relativePath":"start/option.md","filePath":"start/option.md","lastUpdated":1764425558000}'),p={name:"start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s('

基础选项 ​

container ​

  • Type: String, Element
  • Default: #artplayer

播放器挂载的 DOM 容器

',4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app', 
     // container: document.querySelector('.artplayer-app'),
     url: '/assets/sample/video.mp4',
@@ -109,6 +109,10 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     mutex: true,
+});

backdrop ​

  • Type: Boolean
  • Default: true

是否开启播放器 UI 的背景虚化效果。开启后,设置面板、右键菜单、音量条等浮层会应用 backdrop-filter 毛玻璃效果,看起来更通透,但在部分低性能设备或老旧浏览器上可能会有性能或兼容性问题。

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    backdrop: false, // 关闭毛玻璃效果
 });

fullscreen ​

  • Type: Boolean
  • Default: false

是否在底部控制栏里显示播放器 窗口全屏 按钮

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -209,7 +213,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             },
         },
     ],
-});

组件配置 请参考以下地址:

/component/contextmenu.html- Type:

controls ​

  • Type: Array
  • Default: []

初始化自定义的底部 控制栏

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

组件配置 请参考以下地址:

/component/contextmenu.html

controls ​

  • Type: Array
  • Default: []

初始化自定义的底部 控制栏

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -300,7 +304,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
             'font-size': '30px',
         },
     },
-});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false,'preload': 'metadata'}

更多视频属性,这些属性将直接写入视频元素里

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'}(Safari 中会自动调整为 preload: 'auto' 以提升加载体验)

更多视频属性,这些属性将直接写入视频元素里

`,4),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     moreVideoAttr: {
@@ -381,7 +385,7 @@ import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";
     cssVar: {
         //
     },
-});

proxy ​

  • Type: function
  • Default: undefined

函数可以返回一个第三方的 HTMLCanvasElement 或者 HTMLVideoElement,例如可以代理一个已经存在的 video dom元素

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
+});

cssVar 写法参考

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

函数可以返回一个第三方的 HTMLCanvasElement 或者 HTMLVideoElement,例如可以代理一个已经存在的 video dom元素

`,5),i("div",{className:"run-code"},"▶ Run Code",-1),s(`
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     proxy: () => document.createElement('video')
diff --git a/docs/document/assets/start_option.md.B5CHO-We.lean.js b/docs/document/assets/start_option.md.D52S8Ynf.lean.js
similarity index 58%
rename from docs/document/assets/start_option.md.B5CHO-We.lean.js
rename to docs/document/assets/start_option.md.D52S8Ynf.lean.js
index 9df8e81a8..f83eb41dc 100644
--- a/docs/document/assets/start_option.md.B5CHO-We.lean.js
+++ b/docs/document/assets/start_option.md.D52S8Ynf.lean.js
@@ -1 +1 @@
-import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"基础选项","description":"","frontmatter":{},"headers":[],"relativePath":"start/option.md","filePath":"start/option.md","lastUpdated":1742615709000}'),p={name:"start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",9),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",7),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(p,[["render",h]]);export{g as __pageData,o as default};
+import{_ as n,c as l,o as e,ak as s,j as i}from"./chunks/framework.xxfEszSJ.js";const g=JSON.parse('{"title":"基础选项","description":"","frontmatter":{},"headers":[],"relativePath":"start/option.md","filePath":"start/option.md","lastUpdated":1764425558000}'),p={name:"start/option.md"};function h(t,a,k,r,d,E){return e(),l("div",null,a[0]||(a[0]=[s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",9),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",7),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",6),i("div",{className:"run-code"},"▶ Run Code",-1),s("",2),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",4),i("div",{className:"run-code"},"▶ Run Code",-1),s("",5),i("div",{className:"run-code"},"▶ Run Code",-1),s("",1)]))}const o=n(p,[["render",h]]);export{g as __pageData,o as default};
diff --git a/docs/document/component/contextmenu.html b/docs/document/component/contextmenu.html
index c5d044b9d..6d5be374b 100644
--- a/docs/document/component/contextmenu.html
+++ b/docs/document/component/contextmenu.html
@@ -9,9 +9,9 @@
     
     
     
-    
+    
     
-    
+    
     
     
     
@@ -23,7 +23,7 @@
     
   
   
-    
Skip to content

右键菜单 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本

创建 ​

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

右键菜单 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本

创建 ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -106,7 +106,7 @@
         })
     }, 3000);
 });
- + \ No newline at end of file diff --git a/docs/document/component/controls.html b/docs/document/component/controls.html index b7f2748c1..24194bfaf 100644 --- a/docs/document/component/controls.html +++ b/docs/document/component/controls.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

控制器 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本
positionStringleft 和 right 控制控制器出现的左右位置
selectorArray选择列表的对象数组
onSelectFunction选择列表的元素被点击时触发的函数

创建 ​

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

控制器 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本
positionStringleft 和 right 控制控制器出现的左右位置
selectorArray选择列表的对象数组
onSelectFunction选择列表的元素被点击时触发的函数

创建 ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -153,7 +153,7 @@
         });
     }, 3000);
 });
- + \ No newline at end of file diff --git a/docs/document/component/layers.html b/docs/document/component/layers.html index 01cbd1f7f..aaa87f3cd 100644 --- a/docs/document/component/layers.html +++ b/docs/document/component/layers.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

业务层 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本

创建 ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
+    
Skip to content

业务层 ​

配置 ​

属性类型描述
disableBoolean是否禁用组件
nameString组件唯一名称,用于标记类名
indexNumber组件索引,用于显示的优先级
htmlString, Element组件的 DOM 元素
styleObject组件样式对象
clickFunction组件点击事件
mountedFunction组件挂载后触发
tooltipString组件的提示文本

创建 ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -125,7 +125,7 @@
         });
     }, 3000);
 });
- + \ No newline at end of file diff --git a/docs/document/component/setting.html b/docs/document/component/setting.html index 9a54864bb..b5371a2d8 100644 --- a/docs/document/component/setting.html +++ b/docs/document/component/setting.html @@ -9,9 +9,9 @@ - + - + @@ -23,7 +23,7 @@ -
Skip to content

设置面板 ​

内置 ​

须先打开设置面板,然后自带四个内置项:flip, playbackRate, aspectRatio, subtitleOffset

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

设置面板 ​

内置 ​

须先打开设置面板,然后自带四个内置项:flip, playbackRate, aspectRatio, subtitleOffset

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 	setting: true,
@@ -245,7 +245,7 @@
         });
     }, 3000);
 });
- + \ No newline at end of file diff --git a/docs/document/en/advanced/built-in.html b/docs/document/en/advanced/built-in.html index 9bbad80dd..0bfd9b152 100644 --- a/docs/document/en/advanced/built-in.html +++ b/docs/document/en/advanced/built-in.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,18 +23,18 @@ -
Skip to content

Advanced Properties ​

The advanced properties here refer to the secondary attributes mounted on the instance, which are less commonly used

option ​

Options for the player

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Advanced Properties ​

The Advanced Properties here refer to the secondary properties attached to the instance, which are less commonly used.

option ​

The player's options.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-console.info(art.option);

Reminder

If you directly modify this option object, the player will not respond immediately.

template ​

Manages all of the DOM elements of the player

▶ Run Code
js
var art = new Artplayer({
+console.info(art.option);

Note

If you directly modify this option object, the player will not respond immediately.

template ​

Manages all DOM elements of the player.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 console.info(art.template);
-console.info(art.template.$video);

Warning

To easily distinguish between DOM elements and plain objects, all DOM elements in the player are named starting with a $

Here is the definition of all DOM elements: artplayer/types/template.d.ts

events ​

Manages all DOM events in the player, which is essentially a proxy for addEventListener and removeEventListener. When using the following methods to handle events, the event will also be automatically destroyed when the player is destroyed.

  • The proxy method is used to proxy DOM events
  • The hover method is used to proxy custom hover events
▶ Run Code
js
var container = document.querySelector('.artplayer-app');
+console.info(art.template.$video);

Note

To easily distinguish between DOM elements and regular objects, all DOM elements within the player are named with a $ prefix.

This is the definition of all DOM elements: artplayer/types/template.d.ts

events ​

Manages all DOM events for the player. It essentially proxies addEventListener and removeEventListener. When using the following methods to handle events, the event will be automatically destroyed when the player is destroyed.

  • The proxy method is used to proxy DOM events.
  • The hover method is used to proxy custom hover events.
▶ Run Code
js
var container = document.querySelector('.artplayer-app');
 
 var art = new Artplayer({
     container: container,
@@ -42,14 +42,14 @@
 });
 
 art.events.proxy(container, 'click', event => {
-    console.info('click', event);
+	console.info('click', event);
 });
 
 art.events.hover(container, (event) => {
     console.info('mouseenter', event);
 }, (event) => {
     console.info('mouseleave', event);
-});

Warning

If you need some DOM events to only exist during the lifecycle of the player, it is strongly recommended to use these functions to avoid causing memory leaks

storage ​

Manages the local storage of the player

  • The name attribute is used to set the cache key
  • The set method is used to set the cache
  • The get method is used to get the cache
  • The del method is used to delete the cache
  • The clear method is used to clear the cache
▶ Run Code
js
var art = new Artplayer({
+});

Note

If you need DOM events that only exist during the player's lifecycle, it is strongly recommended to use these functions to avoid memory leaks.

storage ​

Manages the player's local storage.

  • The name property is used to set the cache key.
  • The set method is used to set a cache value.
  • The get method is used to get a cache value.
  • The del method is used to delete a cache value.
  • The clear method is used to clear all cache.
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -58,18 +58,18 @@
 const test = art.storage.get('test');
 console.info(test);
 art.storage.del('test');
-art.storage.clear();

Warning

By default, all player instances share the same localStorage, and the default key is artplayer_settings

If you want different players to use different localStorage, you can modify art.storage.name accordingly

▶ Run Code
js
var art = new Artplayer({
+art.storage.clear();

Note

By default, all player instances share the same localStorage, and the default key is artplayer_settings.

If you want different players to use different localStorage, you can modify art.storage.name.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.storage.name = 'your-storage-key';
-art.storage.set('test', { foo: 'bar' });

icons ​

Manage all the svg icons of the player

▶ Run Code
js
var art = new Artplayer({
+art.storage.set('test', { foo: 'bar' });

icons ​

Manages all svg icons for the player.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-console.info(art.icons.loading);

This is the definition of all icons:

artplayer/types/icons.d.ts

i18n ​

Manage the player's i18n

  • The get method is used to retrieve the value of i18n
  • The update method is used to update the i18n object
▶ Run Code
js
var art = new Artplayer({
+console.info(art.icons.loading);

This is the definition of all icons:

artplayer/types/icons.d.ts

i18n ​

Manages the player's i18n.

  • The get method is used to get an i18n value.
  • The update method is used to update the i18n object.
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -80,14 +80,14 @@
     'zh-cn': {
         Play: 'Your Play'
     }
-});

WARNING

Using art.i18n.update can only update i18n after instantiation. If you want to update i18n before instantiation, please use the i18n from the basic options for the update.

notice ​

Manage the player's notices, there's only one show property used to display notices.

▶ Run Code
js
var art = new Artplayer({
+});

WARNING

Using art.i18n.update can only update the i18n after instantiation. If you want to update the i18n before instantiation, please use the i18n option in the basic options.

notice ​

Manages the player's notifications. It only has a show property for displaying notifications.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.notice.show = 'Video Ready To Play';
-})

WARNING

To immediately hide the display of notice: art.notice.show = '';

layers ​

Manage the layers of the player

  • The add method is used for dynamically adding layers
  • The remove method is used for dynamically removing layers
  • The update method is used for dynamically updating layers
  • The show property is used to set whether to display all layers or not
  • The toggle method is used to toggle the display of all layers
▶ Run Code
js
var art = new Artplayer({
+})

WARNING

If you want to hide the notice immediately: art.notice.show = '';

layers ​

Manages the player's layers.

  • The add method is used to dynamically add a layer.
  • The remove method is used to dynamically remove a layer.
  • The update method is used to dynamically update a layer.
  • The show property is used to set whether all layers are visible.
  • The toggle method is used to toggle the visibility of all layers.
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -100,7 +100,7 @@
 	setTimeout(() => {
 		art.layers.show = false;
 	}, 1000);
-});

Component configuration Please refer to the following address:

/component/layers.html

controls ​

Manage the player's controllers

  • add method is used to dynamically add controllers
  • remove method is used to dynamically remove controllers
  • update method is used to dynamically update controllers
  • show property is used to set whether to display all controllers
  • toggle method is used to toggle the display of all controllers
▶ Run Code
js
var art = new Artplayer({
+});

Refer to the following address for Component Configuration:

/component/layers.html

controls ​

Manages the player's controls.

  • The add method is used to dynamically add a control.

  • The remove method is used to dynamically remove a control.

  • The update method is used to dynamically update controls

  • The show property is used to set whether to display all controls

  • The toggle method is used to toggle the display of all controls

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -114,7 +114,7 @@
 	setTimeout(() => {
 		art.controls.show = false;
 	}, 1000);
-});

Component Configuration Please refer to the following address:

/component/controls.html

contextmenu ​

Manage the right-click context menu of the player

  • The add method is used to dynamically add menu items
  • The remove method is used to dynamically remove menu items
  • The update method is used to dynamically update menu items
  • The show attribute is used to set whether to show all menu items
  • The toggle method is used to switch the visibility of all menu items
▶ Run Code
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/controls.html

contextmenu ​

Manages the player's context menu

  • The add method is used to dynamically add menu items
  • The remove method is used to dynamically remove menu items
  • The update method is used to dynamically update menu items
  • The show property is used to set whether to display all menu items
  • The toggle method is used to toggle the display of all menu items
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -125,10 +125,10 @@
     });
 
     art.contextmenu.show = true;
-    setTimeout(() => {
-        art.contextmenu.show = false;
-    }, 1000);
-});

Component Configuration Please refer to the following address:

/component/contextmenu.html

subtitle ​

Manage the subtitle features of the player

  • url property sets and returns the current subtitle address
  • style method sets the style of the current subtitle
  • switch method sets the current subtitle address and options
  • textTrack Get the current subtitle track
  • activeCues Get the currently active subtitle list
  • cues Get the subtitle list
▶ Run Code
js
var art = new Artplayer({
+	setTimeout(() => {
+		art.contextmenu.show = false;
+	}, 1000);
+});

For Component Configuration, please refer to:

/component/contextmenu.html

subtitle ​

Manages the player's subtitle functionality

  • The url property sets and returns the current subtitle URL
  • The style method sets the style of the current subtitle
  • The switch method sets the current subtitle URL and options
  • textTrack gets the current text track
  • activeCues gets the list of currently active cues
  • cues gets the overall list of cues
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -138,7 +138,18 @@
     art.subtitle.style({
         color: 'red',
     });
-});

loading ​

Manage the loading layer of the player

  • show property is used to set whether to display the loading layer
  • The toggle attribute is used to toggle the display of the loading layer
▶ Run Code
js
var art = new Artplayer({
+});

info ​

Manages the player's information panel, commonly used to view the current status of the player and video, such as version number, resolution, duration, etc.

  • Control the panel's visibility via art.info.show
  • The triggered event is named info (see the event documentation for details)
▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.info.show = true;
+
+    setTimeout(() => {
+        art.info.show = false;
+    }, 3000);
+});

loading ​

Manages the player's loading layer

  • The show property is used to set whether to display the loading layer
  • The toggle property is used to toggle the display of the loading layer
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -148,7 +159,7 @@
 	setTimeout(() => {
 		art.loading.show = false;
 	}, 1000);
-});

hotkey ​

Manage the hotkey functionality of the player

  • The add method is used to add a hotkey
  • The remove method is used to remove a hotkey
▶ Run Code
js
var art = new Artplayer({
+});

hotkey ​

Manages the player's hotkey functionality

  • The add method is used to add hotkeys
  • The remove method is used to remove hotkeys
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -162,17 +173,17 @@
     setTimeout(() => {
 		art.hotkey.remove(32, hotkeyEvent);
 	}, 5000);
-});

Warning

Shortcut keys will only work after the player has gained focus (e.g., after clicking on the player).

mask ​

Manage the player's mask layer

  • show property is used to set whether to display the mask layer
  • toggle property is used to toggle the display of the mask layer
▶ Run Code
js
var art = new Artplayer({
+});

Note

These hotkeys only take effect after the player gains focus (e.g., after clicking on the player)

mask ​

Manages the player's mask layer

  • The show property is used to set whether to display the mask layer
  • The toggle property is used to toggle the display of the mask layer
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.mask.show = false;
-    setTimeout(() => {
-        art.mask.show = true;
-    }, 1000);
-});

setting ​

Manage the player's settings panel

  • add method is used to dynamically add a setting item
  • remove method is used to dynamically remove a setting item
  • update method is used to dynamically update a setting item
  • show property is used to set whether to display all the setting items
  • toggle method is used to toggle whether to display all the setting items
▶ Run Code
js
var art = new Artplayer({
+	setTimeout(() => {
+		art.mask.show = true;
+	}, 1000);
+});

setting ​

Manages the player's settings panel

  • The add method is used to dynamically add settings items
  • The remove method is used to dynamically remove settings items
  • The update method is used to dynamically update settings items
  • The show property is used to set whether to display all settings items
  • The toggle method is used to toggle the display of all settings items
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -187,7 +198,7 @@
 	setTimeout(() => {
 		art.setting.show = false;
 	}, 1000);
-});

Settings Panel Please refer to the following link

/component/setting.html

plugins ​

Manage the player's plugin features, with only one method add to dynamically add plugins

▶ Run Code
js
var art = new Artplayer({
+});

For the Settings Panel, please refer to:

/component/setting.html

plugins ​

Manages the player's plugin functionality, with only the add method for dynamically adding plugins

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -205,8 +216,8 @@
 
 art.on('ready', () => {
     art.plugins.add(myPlugin);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/advanced/class.html b/docs/document/en/advanced/class.html index 88e7bfd28..a44dd7e5d 100644 --- a/docs/document/en/advanced/class.html +++ b/docs/document/en/advanced/class.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,15 +23,15 @@ -
Skip to content

Static Properties ​

Here, Static Properties refer to the first-level properties mounted on the constructor, which are very rarely used.

instances ​

Returns an array of all player instances. You can use this property when you want to manage multiple players at the same time.

▶ Run Code
js
console.info([...Artplayer.instances]);
+    
Skip to content

Static Properties ​

Here, Static Properties refer to the top-level properties mounted on the constructor function, which are very rarely used.

instances ​

Returns an array of all player instances. This property can be useful when you need to manage multiple player instances simultaneously.

▶ Run Code
js
console.info([...Artplayer.instances]);
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-console.info([...Artplayer.instances]);

version ​

Returns the version information of the player.

▶ Run Code
js
console.info(Artplayer.version);

env ​

Returns the environment variables of the player.

▶ Run Code
js
console.info(Artplayer.env);

build ​

Returns the build time of the player

▶ Run Code
js
console.info(Artplayer.build);

config ​

Returns the default configuration of the video

▶ Run Code
js
console.info(Artplayer.config);

utils ​

Returns a collection of utility functions for the player

▶ Run Code
js
console.info(Artplayer.utils);

For the full list of utility functions, please refer to the following address:

artplayer/types/utils.d.ts

scheme ​

Returns the validation scheme for the player options

▶ Run Code
js
console.info(Artplayer.scheme);

Emitter ​

Returns the constructor for the event dispatcher

▶ Run Code
js
console.info(Artplayer.Emitter);

validator ​

Returns the validation function for options

▶ Run Code
js
console.info(Artplayer.validator);

kindOf ​

Returns the function tool for type checking

▶ Run Code
js
console.info(Artplayer.kindOf);

html ​

Returns the html string required for the player

▶ Run Code
js
console.info(Artplayer.html);

option ​

Returns the player's default options

▶ Run Code
js
console.info(Artplayer.option);
- +console.info([...Artplayer.instances]);

version ​

Returns the version information of the player.

▶ Run Code
js
console.info(Artplayer.version);

env ​

Returns the environment variables of the player.

▶ Run Code
js
console.info(Artplayer.env);

build ​

Returns the build time of the player.

▶ Run Code
js
console.info(Artplayer.build);

config ​

Returns the default configuration for videos.

▶ Run Code
js
console.info(Artplayer.config);

utils ​

Returns the collection of utility functions for the player.

▶ Run Code
js
console.info(Artplayer.utils);

For all utility functions, please refer to the following address:

artplayer/types/utils.d.ts

scheme ​

Returns the validation schema for player options.

▶ Run Code
js
console.info(Artplayer.scheme);

Emitter ​

Returns the constructor function for the event emitter.

▶ Run Code
js
console.info(Artplayer.Emitter);

validator ​

Returns the validation function for options.

▶ Run Code
js
console.info(Artplayer.validator);

kindOf ​

Returns the utility function for type detection.

▶ Run Code
js
console.info(Artplayer.kindOf);

html ​

Returns the html string required by the player.

▶ Run Code
js
console.info(Artplayer.html);

option ​

Returns the default options for the player.

▶ Run Code
js
console.info(Artplayer.option);
+ \ No newline at end of file diff --git a/docs/document/en/advanced/event.html b/docs/document/en/advanced/event.html index bda86d905..193ff9ce7 100644 --- a/docs/document/en/advanced/event.html +++ b/docs/document/en/advanced/event.html @@ -3,17 +3,17 @@ - Example Events | Artplayer.js + Instance Events | Artplayer.js - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

Example Events ​

Player events are divided into two types, one is the video's native events (prefix video:), the other is custom events

Listening to events:

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Instance Events ​

Player events are divided into two types: native events (prefixed with video:) and custom events.

Listen to an event:

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -42,7 +42,7 @@
     url: '/assets/sample/video.mp4',
 });
 
-art.emit('focus');

Remove an event:

▶ Run Code
js
var art = new Artplayer({
+art.emit('focus');

Remove an event listener:

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -52,14 +52,14 @@
     art.off('ready', onReady);
 }
 
-art.on('ready', onReady);

For a full list of events, please refer to the following address:

artplayer/types/events.d.ts

ready ​

Triggered when the player is able to play for the first time

▶ Run Code
js
var art = new Artplayer({
+art.on('ready', onReady);

For a complete list of events, please refer to:

artplayer/types/events.d.ts

ready ​

Triggered when the player is ready for the first time

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     console.info('ready');
-});

restart ​

Triggered when the player switches the address and is able to play

▶ Run Code
js
var art = new Artplayer({
+});

restart ​

Triggered when the player switches URL and becomes playable

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -84,7 +84,7 @@
 
 art.on('play', () => {
     console.info('play');
-});

hotkey ​

Triggered when a hotkey on the player is pressed

▶ Run Code
js
var art = new Artplayer({
+});

hotkey ​

Triggered when a hotkey is pressed on the player

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -130,42 +130,51 @@
 
 art.on('click', (event) => {
     console.info('click', event);
-});

error ​

Triggered when an error occurs while the player is loading the video

▶ Run Code
js
var art = new Artplayer({
+});

error ​

Triggered when an error occurs while loading the video

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
 });
 
 art.on('error', (error, reconnectTime) => {
     console.info(error, reconnectTime);
-});

hover ​

Triggered when the player is hovered or unhovered by the mouse

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('hover', (state, event) => {
-    console.info('hover', state, event);
-});

mousemove ​

Triggered when the mouse moves over the player

▶ Run Code
js
var art = new Artplayer({
+## `hover`
+
+Triggered when the mouse enters or leaves the player
+
+<div className="run-code">▶ Run Code</div>
+
+```js{6}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('hover', (state, event) => {
+    console.info('hover', state, event);
+});

mousemove ​

Triggered when the mouse moves over the player

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('mousemove', (event) => {
     console.info('mousemove', event);
-});

resize ​

Triggered when the player size changes

▶ Run Code
js
var art = new Artplayer({
+});

resize ​

Triggered when the player's dimensions change

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('resize', () => {
     console.info('resize');
-});

view ​

Triggered when the player appears in the viewport

▶ Run Code
js
var art = new Artplayer({
+});

view ​

Triggered when the player enters or leaves the viewport

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('view', (state) => {
     console.info('view', state);
-});

lock ​

On mobile, triggered when the locked state changes

▶ Run Code
js
var art = new Artplayer({
+});

lock ​

Triggered when the lock state changes on mobile devices

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lock: true,
@@ -173,7 +182,7 @@
 
 art.on('lock', (state) => {
     console.info('lock', state);
-});

aspectRatio ​

Triggered when the aspect ratio of the player changes

▶ Run Code
js
var art = new Artplayer({
+});

aspectRatio ​

Triggered when the player's aspect ratio changes

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     aspectRatio: true,
@@ -182,7 +191,7 @@
 
 art.on('aspectRatio', (aspectRatio) => {
     console.info('aspectRatio', aspectRatio);
-});

autoHeight ​

Triggered when the player automatically sets the height

▶ Run Code
js
var art = new Artplayer({
+});

autoHeight ​

Triggered when the player automatically adjusts its height

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -193,7 +202,7 @@
 
 art.on('autoHeight', (height) => {
     console.info('autoHeight', height);
-});

autoSize ​

Triggered when the player automatically sets the size

▶ Run Code
js
var art = new Artplayer({
+});

autoSize ​

Triggered when the player automatically adjusts its size

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoSize: true,
@@ -201,7 +210,7 @@
 
 art.on('autoSize', () => {
     console.info('autoSize');
-});

flip ​

Triggered when the player flips

▶ Run Code
js
var art = new Artplayer({
+});

flip ​

Triggered when the player is flipped

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     flip: true,
@@ -210,7 +219,7 @@
 
 art.on('flip', (flip) => {
     console.info('flip', flip);
-});

fullscreen ​

Triggered when the player goes into full screen

▶ Run Code
js
var art = new Artplayer({
+});

fullscreen ​

Triggered when the player enters or exits window fullscreen mode

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreen: true,
@@ -218,7 +227,7 @@
 
 art.on('fullscreen', (state) => {
     console.info('fullscreen', state);
-});

fullscreenError ​

Triggered when the player goes into full screen error

▶ Run Code
js
var art = new Artplayer({
+});

fullscreenError ​

Triggered when a window fullscreen error occurs

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -229,7 +238,7 @@
 
 art.on('fullscreenError', (event) => {
     console.info('fullscreenError', event);
-});

fullscreenWeb ​

Triggered when the player enters web fullscreen

▶ Run Code
js
var art = new Artplayer({
+});

fullscreenWeb ​

Triggered when the player enters or exits web fullscreen mode

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
@@ -237,7 +246,7 @@
 
 art.on('fullscreenWeb', (state) => {
     console.info('fullscreenWeb', state);
-});

mini ​

Triggered when the player enters mini mode

▶ Run Code
js
var art = new Artplayer({
+});

mini ​

Triggered when the player enters or exits mini mode

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -248,7 +257,7 @@
 
 art.on('mini', (state) => {
     console.info('mini', state);
-});

pip ​

Triggered when the player enters Picture-in-Picture mode

▶ Run Code
js
var art = new Artplayer({
+});

pip ​

Triggered when the player enters or exits picture-in-picture mode

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     pip: true,
@@ -256,22 +265,31 @@
 
 art.on('pip', (state) => {
     console.info('pip', state);
-});

screenshot ​

Triggered when the player takes a screenshot

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    screenshot: true,
 });
 
-art.on('screenshot', (dataUri) => {
-    console.info('screenshot', dataUri);
-});

seek ​

Triggered when the player jumps in time

▶ Run Code
js
var art = new Artplayer({
+## `screenshot`
+
+Triggered when the player captures a screenshot
+
+<div className="run-code">▶ Run Code</div>
+
+```js{7}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    screenshot: true,
+});
+
+art.on('screenshot', (dataUri) => {
+    console.info('screenshot', dataUri);
+});

seek ​

Triggered when the player performs a time seek

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('seek', (currentTime) => {
     console.info('seek', currentTime);
-});

subtitleOffset ​

Triggered when the subtitle offset occurs in the player

▶ Run Code
js
var art = new Artplayer({
+});

subtitleOffset ​

Triggered when subtitle offset changes in the player

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitleOffset: true,
@@ -293,7 +311,7 @@
 
 art.on('subtitleBeforeUpdate', (cues) => {
     console.info('subtitleBeforeUpdate', cues);
-});

subtitleAfterUpdate ​

Triggered when the subtitles are updated

▶ Run Code
js
var art = new Artplayer({
+});

subtitleAfterUpdate ​

Triggered after subtitles are updated

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -303,7 +321,7 @@
 
 art.on('subtitleAfterUpdate', (cues) => {
     console.info('subtitleAfterUpdate', cues);
-});

subtitleLoad ​

Triggered when the subtitle loads

▶ Run Code
js
var art = new Artplayer({
+});

subtitleLoad ​

Triggered when subtitles are loaded

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -313,28 +331,28 @@
 
 art.on('subtitleLoad', (option, cues) => {
     console.info('subtitleLoad', cues, option);
-});

info ​

Triggered when the information panel is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

info ​

Triggered when the info panel is shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('info', (state) => {
     console.log(state);
-});

layer ​

Triggered when a custom layer is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

layer ​

Triggered when custom layers are shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('layer', (state) => {
     console.log(state);
-});

loading ​

Triggered when a loader is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

loading ​

Triggered when the loader is shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('loading', (state) => {
     console.log(state);
-});

mask ​

Triggered when a mask layer is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

mask ​

Triggered when the mask layer is shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -348,14 +366,14 @@
 
 art.on('subtitle', (state) => {
     console.log(state);
-});

contextmenu ​

Triggered when the right-click menu is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

contextmenu ​

Triggered when the context menu is shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('contextmenu', (state) => {
     console.log(state);
-});

control ​

Triggered when the controller is shown or hidden

▶ Run Code
js
var art = new Artplayer({
+});

control ​

Triggered when the controls are shown or hidden

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -370,22 +388,31 @@
 
 art.on('setting', (state) => {
     console.log(state);
-});

muted ​

Triggered when the muted state changes

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('muted', (state) => {
-    console.log(state);
-});

keydown ​

Listen to the keydown event from document

▶ Run Code
js
var art = new Artplayer({
+## `muted`
+
+Triggered when the mute state changes
+
+<div className="run-code">▶ Run Code</div>
+
+```js{6}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('muted', (state) => {
+    console.log(state);
+});

keydown ​

Listens for keydown events from the document

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('keydown', (event) => {
     console.log(event.code);
-});

video:canplay ​

The browser can play the media file, but estimates there is not enough data to play through to the end without having to stop for further buffering

video:canplaythrough ​

The browser estimates it can play the media through to the end without stopping for content buffering

video:complete ​

OfflineAudioContext rendering is complete

video:durationchange ​

Triggered when the value of the duration property changes

video:emptied ​

The media content becomes empty; for example, when this media has been completely loaded (or partially loaded), this event is sent and the load() method is called to reload it

video:ended ​

The video has stopped because the media reached the end point

video:error ​

An error occurred while fetching media data, or the resource type is not a supported media format

video:loadeddata ​

The first frame of the media has finished loading

video:loadedmetadata ​

Metadata has been loaded

video:pause ​

Playback has been paused

video:play ​

Playback has started

video:playing ​

Playback is ready to start following a pause or delay due to lack of data

video:progress ​

Periodically triggered while the browser is loading resources

video:ratechange ​

The playback rate has changed

video:seeked ​

A seek (frame skipping) operation has completed

video:seeking ​

A seek (frame skipping) operation has started

video:stalled ​

The user agent is trying to fetch media data, but the data unexpectedly has not appeared

video:suspend ​

Media data loading has been suspended

video:timeupdate ​

The time specified by the currentTime attribute has changed

video:volumechange ​

Volume changed

video:waiting ​

Playback has stopped due to temporarily missing data

- +});

video:canplay ​

The browser can start playing the media, but estimates there isn't enough data to play through to the end without having to stop for further buffering

video:canplaythrough ​

The browser estimates it can play the media through to the end without stopping to buffer content

video:complete ​

OfflineAudioContext rendering is complete

video:durationchange ​

Triggered when the value of the duration property changes

video:emptied ​

The media has become empty; for example, this event is sent when the media has already been loaded (or partially loaded), and the load() method is called to reload it

video:ended ​

Playback has stopped because the media has reached its end point

video:error ​

An error occurred while fetching media data, or the resource type is not a supported media format

video:loadeddata ​

The first frame of the media has finished loading

video:loadedmetadata ​

Metadata has been loaded

video:pause ​

Playback has been paused

video:play ​

Playback has begun

video:playing ​

Playback is ready to start after having been paused or delayed due to lack of data

video:progress ​

Periodically triggered while the browser is loading the resource

video:ratechange ​

The playback rate has changed

video:seeked ​

A seek operation has completed

video:seeking ​

A seek operation has begun

video:stalled ​

The user agent is trying to fetch media data, but data is unexpectedly not forthcoming

video:suspend ​

Media data loading has been suspended

video:timeupdate ​

The time indicated by the currentTime attribute has been updated

video:volumechange ​

The volume has changed

video:waiting ​

Playback has stopped due to temporary lack of data

+ \ No newline at end of file diff --git a/docs/document/en/advanced/global.html b/docs/document/en/advanced/global.html index 61ad66b99..ec955e06e 100644 --- a/docs/document/en/advanced/global.html +++ b/docs/document/en/advanced/global.html @@ -3,17 +3,17 @@ - Global Attributes | Artplayer.js + Global Properties | Artplayer.js - + - + - + @@ -23,22 +23,22 @@ -
Skip to content

Global Attributes ​

Here, Global Attributes refer to the first-level properties mounted on the constructor. Property names are all in uppercase, subject to change in the future and basically not needed.

DEBUG ​

Whether to start debug mode, which can print out all built-in events of the video by default is turned off.

▶ Run Code
js
Artplayer.DEBUG = true;
+    
Skip to content

Global Properties ​

These global properties refer to the top-level properties mounted on the constructor. The property names are all in uppercase. They are subject to change in the future and are generally not used.

DEBUG ​

Whether to enable debug mode, which can print all built-in events of the video. Default is off.

▶ Run Code
js
Artplayer.DEBUG = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

STYLE ​

Returns the player style text

▶ Run Code
js
console.log(Artplayer.STYLE);

CONTEXTMENU ​

Whether to enable the right-click context menu, enabled by default.

▶ Run Code
js
Artplayer.CONTEXTMENU = false;
+});

STYLE ​

Returns the player style text.

▶ Run Code
js
console.log(Artplayer.STYLE);

CONTEXTMENU ​

Whether to enable the context menu. Default is on.

▶ Run Code
js
Artplayer.CONTEXTMENU = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

NOTICE_TIME ​

The display duration of the notification message, in milliseconds, defaults to 2000

▶ Run Code
js
Artplayer.NOTICE_TIME = 5000;
+});

NOTICE_TIME ​

The display duration for notification messages, in milliseconds. Default is 2000.

▶ Run Code
js
Artplayer.NOTICE_TIME = 5000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

SETTING_WIDTH ​

The default width of the settings panel, in pixels, defaults to 250

▶ Run Code
js
Artplayer.SETTING_WIDTH = 300;
+});

SETTING_WIDTH ​

The default width of the settings panel, in pixels. Default is 250.

▶ Run Code
js
Artplayer.SETTING_WIDTH = 300;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -48,7 +48,7 @@
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

SETTING_ITEM_WIDTH ​

Set the default width of the settings items in the panel, in pixels, the default is 200.

▶ Run Code
js
Artplayer.SETTING_ITEM_WIDTH = 300;
+});

SETTING_ITEM_WIDTH ​

The default width of settings items in the settings panel, in pixels. Default is 200.

▶ Run Code
js
Artplayer.SETTING_ITEM_WIDTH = 300;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -58,7 +58,7 @@
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

SETTING_ITEM_HEIGHT ​

Set the default height of the settings items in the panel, in pixels, the default is 35.

▶ Run Code
js
Artplayer.SETTING_ITEM_HEIGHT = 40;
+});

SETTING_ITEM_HEIGHT ​

The default height of settings items in the settings panel, in pixels. Default is 35.

▶ Run Code
js
Artplayer.SETTING_ITEM_HEIGHT = 40;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -68,7 +68,7 @@
     flip: true,
     playbackRate: true,
     aspectRatio: true,
-});

RESIZE_TIME ​

Throttle time for the resize event, in milliseconds, defaults to 200

▶ Run Code
js
Artplayer.RESIZE_TIME = 500;
+});

RESIZE_TIME ​

The throttle time for the resize event, in milliseconds. Default is 200.

▶ Run Code
js
Artplayer.RESIZE_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -77,7 +77,7 @@
 
 art.on('resize', () => {
     console.log('resize');
-});

SCROLL_TIME ​

Throttle time for the scroll event, in milliseconds, defaults to 200

▶ Run Code
js
Artplayer.SCROLL_TIME = 500;
+});

SCROLL_TIME ​

The throttle time for the scroll event, in milliseconds. Default is 200.

▶ Run Code
js
Artplayer.SCROLL_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -86,7 +86,7 @@
 
 art.on('scroll', () => {
     console.log('scroll');
-});

SCROLL_GAP ​

The boundary tolerance distance for the view event, in pixels, default is 50

▶ Run Code
js
Artplayer.SCROLL_GAP = 100;
+});

SCROLL_GAP ​

The boundary tolerance distance for the view event, in pixels. Default is 50.

▶ Run Code
js
Artplayer.SCROLL_GAP = 100;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -95,40 +95,49 @@
 
 art.on('scroll', () => {
     console.log('scroll');
-});

AUTO_PLAYBACK_MAX ​

The maximum number of records for the automatic playback feature, default is 10

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_MAX = 20;
+});

AUTO_PLAYBACK_MAX ​

The maximum record count for the auto-playback feature. Default is 10.

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_MAX = 20;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

AUTO_PLAYBACK_MIN ​

The minimum duration for the auto playback feature, in seconds, with a default of 5.

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_MIN = 10;
+});

AUTO_PLAYBACK_MIN ​

The minimum record duration for the auto-playback feature, in seconds. Default is 5.

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_MIN = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

AUTO_PLAYBACK_TIMEOUT ​

The delay duration for hiding the auto playback feature, in milliseconds, with a default of 3000.

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_TIMEOUT = 5000;
+});

AUTO_PLAYBACK_TIMEOUT ​

The hide delay duration for the auto-playback feature, in milliseconds. Default is 3000.

▶ Run Code
js
Artplayer.AUTO_PLAYBACK_TIMEOUT = 5000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoPlayback: true,
-});

RECONNECT_TIME_MAX ​

The maximum number of automatic reconnection attempts when a connection error occurs, default is 5

▶ Run Code
js
Artplayer.RECONNECT_TIME_MAX = 10;
+});

RECONNECT_TIME_MAX ​

The maximum number of automatic reconnection attempts when a connection error occurs. Default is 5.

▶ Run Code
js
Artplayer.RECONNECT_TIME_MAX = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
-});

RECONNECT_SLEEP_TIME ​

The delay time for the automatic reconnection attempt when a connection error occurs, in milliseconds, default is 1000

▶ Run Code
js
Artplayer.RECONNECT_SLEEP_TIME = 3000;
+});

RECONNECT_SLEEP_TIME ​

The delay time for automatic reconnection when a connection error occurs, in milliseconds. Default is 1000.

▶ Run Code
js
Artplayer.RECONNECT_SLEEP_TIME = 3000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/404.mp4',
-});

CONTROL_HIDE_TIME ​

...

Auto-hide delay time for the bottom control bar, measured in milliseconds, default is 3000

▶ Run Code
js
Artplayer.CONTROL_HIDE_TIME = 5000;
+});
 
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

DBCLICK_TIME ​

Double-click event delay time, measured in milliseconds, default is 300

▶ Run Code
js
Artplayer.DBCLICK_TIME = 500;
+## CONTROL_HIDE_TIME
+
+The delay time in milliseconds for auto-hiding the bottom control bar. Default is `3000`.
+
+<div className="run-code">▶ Run Code</div>
+
+```js
+Artplayer.CONTROL_HIDE_TIME = 5000;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});

DBCLICK_TIME ​

The delay time in milliseconds for double-click events. Default is 300.

▶ Run Code
js
Artplayer.DBCLICK_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -137,67 +146,62 @@
 
 art.on('dblclick', () => {
     console.log('dblclick');
-});

DBCLICK_FULLSCREEN ​

On desktop, whether to switch to fullscreen on double click, default is true

▶ Run Code
js
Artplayer.DBCLICK_FULLSCREEN = false;
+});

DBCLICK_FULLSCREEN ​

On desktop, whether double-click toggles fullscreen mode. Default is true.

▶ Run Code
js
Artplayer.DBCLICK_FULLSCREEN = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

MOBILE_DBCLICK_PLAY ​

On mobile, whether to toggle play/pause on double click, default is true

▶ Run Code
js
Artplayer.MOBILE_DBCLICK_PLAY = false;
+});

MOBILE_DBCLICK_PLAY ​

On mobile devices, whether double-click toggles play/pause. Default is true.

▶ Run Code
js
Artplayer.MOBILE_DBCLICK_PLAY = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

MOBILE_CLICK_PLAY ​

On mobile, whether to play/pause on single click, default is false

▶ Run Code
js
Artplayer.MOBILE_CLICK_PLAY = true;
+});

MOBILE_CLICK_PLAY ​

On mobile devices, whether single-click toggles play/pause. Default is false.

▶ Run Code
js
Artplayer.MOBILE_CLICK_PLAY = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

On mobile devices, whether a tap toggles play/pause, defaults to false

▶ Run Code
js
Artplayer.MOBILE_CLICK_PLAY = true;
-
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

AUTO_ORIENTATION_TIME ​

On mobile devices, the delay time for auto-rotation, in milliseconds, defaults to 200

▶ Run Code
js
Artplayer.AUTO_ORIENTATION_TIME = 500;
+});

AUTO_ORIENTATION_TIME ​

On mobile devices, the delay time in milliseconds for automatic screen rotation. Default is 200.

▶ Run Code
js
Artplayer.AUTO_ORIENTATION_TIME = 500;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoOrientation: true,
-});

INFO_LOOP_TIME ​

Info panel refresh time, unit in milliseconds, default is 1000

▶ Run Code
js
Artplayer.INFO_LOOP_TIME = 2000;
+});

INFO_LOOP_TIME ​

The refresh interval in milliseconds for the information panel. Default is 1000.

▶ Run Code
js
Artplayer.INFO_LOOP_TIME = 2000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
-art.info.show = true;

FAST_FORWARD_VALUE ​

On mobile, the multiplier rate of the speed when long-pressing for fast-forward, default is 3

▶ Run Code
js
Artplayer.FAST_FORWARD_VALUE = 5;
+art.info.show = true;

FAST_FORWARD_VALUE ​

On mobile devices, the speed multiplier for fast-forward during long-press. Default is 3.

▶ Run Code
js
Artplayer.FAST_FORWARD_VALUE = 5;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

FAST_FORWARD_TIME ​

The time, in milliseconds, to fast-forward when double-tapped, default is 10 On mobile, the delay time of the long-press acceleration, in milliseconds, default is 1000

▶ Run Code
js
Artplayer.FAST_FORWARD_TIME = 2000;
+});

FAST_FORWARD_TIME ​

On mobile devices, the delay time in milliseconds for activating fast-forward during long-press. Default is 1000.

▶ Run Code
js
Artplayer.FAST_FORWARD_TIME = 2000;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

TOUCH_MOVE_RATIO ​

On mobile, the ratio of the speed of sliding left and right to seek, default is 0.5

▶ Run Code
js
Artplayer.TOUCH_MOVE_RATIO = 1;
+});

TOUCH_MOVE_RATIO ​

On mobile devices, the speed multiplier for seeking when swiping left/right. Default is 0.5.

▶ Run Code
js
Artplayer.TOUCH_MOVE_RATIO = 1;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

VOLUME_STEP ​

The step ratio of adjusting volume with shortcuts, default is 0.1

▶ Run Code
js
Artplayer.VOLUME_STEP = 0.2;
+});

VOLUME_STEP ​

The volume adjustment step for keyboard shortcuts. Default is 0.1.

▶ Run Code
js
Artplayer.VOLUME_STEP = 0.2;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

SEEK_STEP ​

The increment by which the playback progress is adjusted via keyboard shortcuts, in seconds, the default is 5

▶ Run Code
js
Artplayer.SEEK_STEP = 10;
+});

SEEK_STEP ​

The seeking step in seconds for keyboard shortcuts. Default is 5.

▶ Run Code
js
Artplayer.SEEK_STEP = 10;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

PLAYBACK_RATE ​

The list of built-in playback speeds, by default [0.5, 0.75, 1, 1.25, 1.5, 2]

▶ Run Code
js
Artplayer.PLAYBACK_RATE = [0.5, 1, 2, 3, 4, 5];
+});

PLAYBACK_RATE ​

The built-in list of playback rates. Default is [0.5, 0.75, 1, 1.25, 1.5, 2].

▶ Run Code
js
Artplayer.PLAYBACK_RATE = [0.5, 1, 2, 3, 4, 5];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -207,7 +211,7 @@
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

ASPECT_RATIO ​

Built-in list of video aspect ratios, default is ['default', '4:3', '16:9']

▶ Run Code
js
Artplayer.ASPECT_RATIO = ['default', '1:1', '2:1', '4:3', '6:5'];
+art.setting.show = true;

ASPECT_RATIO ​

The built-in list of video aspect ratios. Default is ['default', '4:3', '16:9'].

▶ Run Code
js
Artplayer.ASPECT_RATIO = ['default', '1:1', '2:1', '4:3', '6:5'];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -217,7 +221,7 @@
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FLIP ​

Built-in list of video flips, defaults to ['normal', 'horizontal', 'vertical']

▶ Run Code
js
Artplayer.FLIP = ['normal', 'horizontal'];
+art.setting.show = true;

FLIP ​

The built-in list of video flip modes. Default is ['normal', 'horizontal', 'vertical'].

▶ Run Code
js
Artplayer.FLIP = ['normal', 'horizontal'];
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -227,25 +231,42 @@
 });
 
 art.contextmenu.show = true;
-art.setting.show = true;

FULLSCREEN_WEB_IN_BODY ​

When in web fullscreen, whether to mount the player under the body element, defaults to false

▶ Run Code
js
Artplayer.FULLSCREEN_WEB_IN_BODY = true;
+art.setting.show = true;
+
+## FULLSCREEN_WEB_IN_BODY
+
+Determines whether to mount the player under the `body` element during web fullscreen mode. Defaults to `true`.
+
+<div className="run-code">▶ Run Code</div>
+
+```js
+Artplayer.FULLSCREEN_WEB_IN_BODY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    fullscreenWeb: true,
+});

LOG_VERSION ​

Sets whether to print the player version. Defaults to true.

▶ Run Code
js
Artplayer.LOG_VERSION = false;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-    fullscreenWeb: true,
-});

LOG_VERSION ​

Setting whether to print the player version, the default is true

▶ Run Code
js
Artplayer.LOG_VERSION = false;
-
-var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-});

USE_RAF ​

Setting whether to use requestAnimationFrame, the default is false, currently mainly used for smooth progress bar effects

▶ Run Code
js
Artplayer.USE_RAF = true;
+});

USE_RAF ​

Sets whether to use requestAnimationFrame. Defaults to false. Currently mainly used for smooth progress bar effects.

▶ Run Code
js
Artplayer.USE_RAF = true;
 
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     miniProgressBar: true,
-});
- +});

REMOVE_SRC_WHEN_DESTROY ​

Determines whether to remove the video's src attribute and call load() to actively release media resources when destroying the player. Defaults to true.

When enabled, this can reduce video resource usage in single-page applications or scenarios where players are frequently created/destroyed. If you wish to preserve the video element's state and only remove the UI, set this to false.

▶ Run Code
js
Artplayer.REMOVE_SRC_WHEN_DESTROY = false;
+
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+// Only destroys the UI, does not actively clear src
+art.destroy();
+ \ No newline at end of file diff --git a/docs/document/en/advanced/plugin.html b/docs/document/en/advanced/plugin.html index 018370660..b33702455 100644 --- a/docs/document/en/advanced/plugin.html +++ b/docs/document/en/advanced/plugin.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

Writing Plugins ​

Once you know the player's properties, methods, and events, writing plugins is very simple.

You can load plugin functions during instantiation.

▶ Run Code
js
function myPlugin(art) {
+    
Skip to content

Writing Plugins ​

Once you are familiar with the player's properties, methods, and events, writing plugins becomes very straightforward.

You can load plugin functions during instantiation:

▶ Run Code
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -42,7 +42,7 @@
 
 art.on('ready', () => {
     console.info(art.plugins.myPlugin);
-});

You can also load plugins after instantiation:

▶ Run Code
js
function myPlugin(art) {
+});

You can also load plugin functions after instantiation:

▶ Run Code
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -62,7 +62,7 @@
 
 art.on('ready', () => {
     console.info(art.plugins.myPlugin);
-});

For example, I want to write a plugin that displays an image advertisement after the video is paused.

js
function adsPlugin(option) {
+});

For example, let's say I want to write a plugin that displays an image ad when the video is paused:

▶ Run Code
js
function adsPlugin(option) {
     return (art) => {
         art.layers.add({
             name: 'ads',
@@ -121,8 +121,8 @@
             url: '/assets/sample/layer.png'
         })
     ],
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/advanced/property.html b/docs/document/en/advanced/property.html index b5d5c72ed..39fb8a081 100644 --- a/docs/document/en/advanced/property.html +++ b/docs/document/en/advanced/property.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,16 +23,15 @@ -
Skip to content

Instance Properties ​

Here, instance properties refer to the primary properties mounted on the instance, which are quite commonly used.

play ​

  • Type: Function

Play video

▶ Run Code
js

-var art = new Artplayer({
+    
Skip to content

Instance Properties ​

Here, Instance Properties refer to the first-level properties mounted on the instance, which are commonly used.

play ​

  • Type: Function

Play the video.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
 });
 
-art.on('ready', () => {
-    art.play();
-});

pause ​

  • Type: Function

Pause video

▶ Run Code
js
var art = new Artplayer({
+art.on('ready', () => {
+    art.play();
+});

pause ​

  • Type: Function

Pause the video.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -44,7 +43,7 @@
     setTimeout(() => {
         art.pause();
     }, 3000);
-});

toggle ​

  • Type: Function

Toggle the play and pause state of the video

▶ Run Code
js
var art = new Artplayer({
+});

toggle ​

  • Type: Function

Toggle video playback and pause.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -56,14 +55,22 @@
     setTimeout(() => {
         art.toggle();
     }, 3000);
-});

destroy ​

  • Type: Function
  • Parameter: Boolean

Destroy the player. Accepts a parameter indicating whether to remove the player's html after destruction, which defaults to true

▶ Run Code
js
var art = new Artplayer({
+});

destroy ​

  • Type: Function
  • Parameter: Boolean

Destroy the player. Accepts a parameter indicating whether to remove the player's html after destruction. Defaults to true.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.destroy();
-});

seek ​

  • Type: Setter
  • Parameter: Number

Jump to a specific time in the video, in seconds.

▶ Run Code
js
var art = new Artplayer({
+});

reset ​

  • Type: Function

Reset the player's video element: removes the current src and calls load() once. Commonly used to manually release media resources or reinitialize the video tag in single-page applications.

Note: The global configuration Artplayer.REMOVE_SRC_WHEN_DESTROY will also automatically execute similar logic when destroy() is called.

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    // Only reset the video, do not remove the interface
+    art.reset();
+});

seek ​

  • Type: Setter
  • Parameter: Number

Seek to a specific time in the video, in seconds.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -77,7 +84,7 @@
 
 art.on('ready', () => {
     art.forward = 5;
-});

backward ​

  • Type: Setter
  • Parameter: Number

Video rewind time in seconds

▶ Run Code
js
var art = new Artplayer({
+});

backward ​

  • Type: Setter
  • Parameter: Number

Rewind the video time, in seconds.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -88,7 +95,7 @@
     setTimeout(() => {
         art.backward = 2;
     }, 3000);
-});

volume ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the video volume, which ranges from [0, 1]

▶ Run Code
js
var art = new Artplayer({
+});

volume ​

  • Type: Setter/Getter
  • Parameter: Number

Set and get the video volume, range: [0, 1].

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -97,14 +104,14 @@
     console.info(art.volume);
     art.volume = 0.5;
     console.info(art.volume);
-});

url ​

  • Type: Setter/Getter
  • Parameter: String

Set and retrieve the video address

▶ Run Code
js
var art = new Artplayer({
+});

url ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the video URL.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.url = '/assets/sample/video.mp4?t=0';
-});

switch ​

  • Type: Setter
  • Parameter: String

Set the video address, which is similar to art.url, but performs some optimization operations

▶ Run Code
js
var art = new Artplayer({
+});

switch ​

  • Type: Setter
  • Parameter: String

Set the video URL. Similar to art.url when setting, but performs some optimization operations.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -114,7 +121,7 @@
     setTimeout(() => {
         art.switch = '/assets/sample/video.mp4?t=0';
     }, 3000);
-});

switchUrl ​

  • Type: Function
  • Parameter: String

Set the video address, similar to setting art.url, but some optimization operations will be executed.

▶ Run Code
js
var art = new Artplayer({
+});

switchUrl ​

  • Type: Function
  • Parameter: String

Set the video URL. Similar to art.url when setting, but performs some optimization operations.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -124,17 +131,35 @@
     setTimeout(() => {
         art.switchUrl('/assets/sample/video.mp4?t=0');
     }, 3000);
-});

Warning

art.switch and art.switchUrl have the same functionality. However, the art.switchUrl method will return a Promise. When it resolves, it indicates that the new address can be played; when it rejects, it indicates there was an error loading the new address.

switchQuality ​

  • Type: Function
  • Parameter: String

Set video quality address, similar to art.switchUrl, but it will carry over the previous playback progress.

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
 });
 
-art.on('ready', () => {
-    art.seek = 10;
-    setTimeout(() => {
-        art.switchQuality('/assets/sample/video.mp4?t=0');
-    }, 3000);
-});

muted ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get whether the video is muted.

▶ Run Code
js
var art = new Artplayer({
+:::warning Note
+
+`art.switch` and `art.switchUrl` have the same functionality, but the `art.switchUrl` method returns a `Promise`. It `resolve`s when the new URL is playable and `reject`s when the new URL fails to load.
+
+:::
+
+## `switchQuality`
+
+-   Type: `Function`
+-   Parameter: `String`
+
+Sets the video quality URL. Similar to `art.switchUrl`, but retains the previous playback progress.
+
+<div className="run-code">▶ Run Code</div>
+
+```js{9}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.seek = 10;
+    setTimeout(() => {
+        art.switchQuality('/assets/sample/video.mp4?t=0');
+    }, 3000);
+});

muted ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets whether the video is muted.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -143,7 +168,7 @@
     console.info(art.muted);
     art.muted = true;
     console.info(art.muted);
-});

currentTime ​

  • Type: Setter/Getter
  • Parameter: Number

Set and get the current time of the video. Setting the time is similar to seek, but it does not trigger additional events.

▶ Run Code
js
var art = new Artplayer({
+});

currentTime ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the current playback time of the video. Setting the time is similar to seek, but it does not trigger additional events.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -152,29 +177,29 @@
     console.info(art.currentTime);
     art.currentTime = 5;
     console.info(art.currentTime);
-});

duration ​

  • Type: Getter

Get the video duration

▶ Run Code
js
var art = new Artplayer({
+});

duration ​

  • Type: Getter

Gets the duration of the video.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     console.info(art.duration);
-});

Note

Some videos do not have a duration, such as videos that are being live streamed or videos that have not been fully decoded, in which case the obtained duration will be 0

screenshot ​

  • Type: Function

Download a screenshot of the current video frame, optional parameter is the screenshot name

▶ Run Code
js
var art = new Artplayer({
+});

Note

Some videos may not have a duration, such as live streams or videos that have not been fully decoded. In these cases, the obtained duration will be 0.

screenshot ​

  • Type: Function

Downloads a screenshot of the current video frame. An optional parameter specifies the screenshot filename.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.screenshot('your-name');
-});

getDataURL ​

  • Type: Function

Gets the base64 address of the screenshot of the current video frame, which returns a Promise.

▶ Run Code
js
var art = new Artplayer({
+});

getDataURL ​

  • Type: Function

Gets the base64 URL of a screenshot of the current video frame. Returns a Promise.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', async () => {
     const url = await art.getDataURL();
-    console.info(url)
-});

getBlobUrl ​

  • Type: Function

Gets the blob address of the screenshot of the current video frame, which returns a Promise.

▶ Run Code
js
var art = new Artplayer({
+	console.info(url)
+});

getBlobUrl ​

  • Type: Function

Gets the blob URL of a screenshot of the current video frame. Returns a Promise.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -182,7 +207,7 @@
 art.on('ready', async () => {
     const url = await art.getBlobUrl();
     console.info(url);
-});

fullscreen ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player window fullscreen

▶ Run Code
js
var art = new Artplayer({
+});

fullscreen ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's window fullscreen state.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -194,7 +219,7 @@
             },
         },
     ],
-});

Note

Due to browser security mechanisms, before triggering the window to fullscreen, the page must have had an interaction (e.g. user clicked on the page).

fullscreenWeb ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player web page full screen

▶ Run Code
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, the page must have prior user interaction (e.g., the user has clicked on the page) before triggering window fullscreen.

fullscreenWeb ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's web page fullscreen state.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
@@ -206,7 +231,7 @@
     setTimeout(() => {
         art.fullscreenWeb = false;
     }, 3000);
-});

pip ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player picture-in-picture mode

▶ Run Code
js
var art = new Artplayer({
+});

pip ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's Picture-in-Picture mode.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -218,7 +243,7 @@
             },
         },
     ],
-});

Warning

Due to browser security mechanisms, user interaction (e.g., a user click on the page) must occur before triggering picture-in-picture.

poster ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the video poster, the poster effect is visible only before the video starts playing.

▶ Run Code
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, the page must have prior user interaction (e.g., the user has clicked on the page) before triggering Picture-in-Picture.

poster ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the video poster. The poster effect is only visible before video playback starts.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     poster: '/assets/sample/poster.jpg',
@@ -228,14 +253,14 @@
     console.info(art.poster);
     art.poster = '/assets/sample/poster.jpg?t=0';
     console.info(art.poster);
-});

mini ​

  • Type: Setter/Getter
  • Parameter: Boolean

Set and get the player's mini mode

▶ Run Code
js
var art = new Artplayer({
+});

mini ​

  • Type: Setter/Getter
  • Parameter: Boolean

Sets and gets the player's mini mode.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.mini = true;
-});

playing ​

  • Type: Getter
  • Parameter: Boolean

Get whether the video is currently playing

▶ Run Code
js
var art = new Artplayer({
+});

playing ​

  • Type: Getter
  • Parameter: Boolean

Gets whether the video is currently playing.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
@@ -243,21 +268,36 @@
 
 art.on('ready', () => {
     console.info(art.playing);
-});

autoSize ​

  • Type: Function

Sets whether the video should auto adjust its size

▶ Run Code
js
var art = new Artplayer({
+});

state ​

  • Type: Setter/Getter
  • Parameter: String

Gets or sets the player's current state. Supported values: standard (normal), mini (mini window), pip (picture-in-picture), fullscreen (fullscreen window), fullscreenWeb (webpage fullscreen).

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.state); // Default: standard
+    art.state = 'mini';
+});

autoSize ​

  • Type: Function

Sets whether the video adapts its size automatically.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     art.autoSize();
-});

rect ​

  • Type: Getter

Gets the size and position information of the player

▶ Run Code
js
var art = new Artplayer({
+});

rect ​

  • Type: Getter

Gets the player's dimensions and coordinate information.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('ready', () => {
     console.info(JSON.stringify(art.rect));
-});

Warning

The size and coordinates are obtained via getBoundingClientRect

flip ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the player flip, supports normal, horizontal, vertical

▶ Run Code
js
var art = new Artplayer({
+});

Note

The dimension and coordinate information is obtained via getBoundingClientRect.

bottom / top / left / right / x / y / width / height ​

  • Type: Getter

These properties provide shortcut access to rect:

  • bottom, top, left, right, x, y: Correspond to the fields of the same name in DOMRect
  • width, height: The player's current visible width and height
▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    console.info(art.width, art.height, art.left, art.top);
+});

flip ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the player flip state. Supported values: normal, horizontal, vertical.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -266,7 +306,7 @@
     console.info(art.flip);
     art.flip = 'horizontal';
     console.info(art.flip);
-});

playbackRate ​

  • Type: Setter/Getter
  • Parameter: Number Set and get the playback speed of the player
▶ Run Code
js
var art = new Artplayer({
+});

playbackRate ​

  • Type: Setter/Getter
  • Parameter: Number

Sets and gets the player's playback rate.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -275,7 +315,7 @@
     console.info(art.playbackRate);
     art.playbackRate = 2;
     console.info(art.playbackRate);
-});

aspectRatio ​

  • Type: Setter/Getter
  • Parameter: String

Set and get the aspect ratio of the player

▶ Run Code
js
var art = new Artplayer({
+});

aspectRatio ​

  • Type: Setter/Getter
  • Parameter: String

Sets and gets the player's aspect ratio.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -284,7 +324,7 @@
     console.info(art.aspectRatio);
     art.aspectRatio = '16:9';
     console.info(art.aspectRatio);
-});

autoHeight ​

  • Type: Function

When the container has only width, this attribute can automatically calculate and set the height of the video

▶ Run Code
js
var art = new Artplayer({
+});

autoHeight ​

  • Type: Function

When the container only has a defined width, this property can automatically calculate and set the video height.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -295,7 +335,7 @@
 
 art.on('resize', () => {
     art.autoHeight();
-});

Warning

When your container has only width but you do not know the exact height, this property is very useful as it can automatically calculate the video's height, but you need to make sure when to set this property.

attr ​

  • Type: Function
  • Parameter: String

Dynamically get and set the attributes of the video element

▶ Run Code
js
var art = new Artplayer({
+});

Note

This property is useful when your container has only a defined width but an unknown height. It automatically calculates the video height, but you need to determine the appropriate timing to set this property.

attr ​

  • Type: Function
  • Parameter: String

Dynamically gets and sets attributes of the video element.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -304,7 +344,7 @@
     console.info(art.attr('playsInline'));
     art.attr('playsInline', true);
     console.info(art.attr('playsInline'));
-});

type ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically get and set the video type

▶ Run Code
js
var art = new Artplayer({
+});

type ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically gets and sets the video type.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -313,7 +353,7 @@
     console.info(art.type);
     art.type = 'm3u8';
     console.info(art.type);
-});

theme ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically get and set the player's theme color

▶ Run Code
js
var art = new Artplayer({
+});

theme ​

  • Type: Setter/Getter
  • Parameter: String

Dynamically gets and sets the player's theme color.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -322,7 +362,7 @@
     console.info(art.theme);
     art.theme = '#000';
     console.info(art.theme);
-});

airplay ​

  • Type: Function

Activate airplay

▶ Run Code
js
var art = new Artplayer({
+});

airplay ​

  • Type: Function

Initiates AirPlay.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -334,21 +374,28 @@
             },
         },
     ],
-});

loaded ​

  • Type: Getter

The proportion of the video that is cached, ranging from [0, 1], commonly used with the video:timeupdate event.

▶ Run Code
js
var art = new Artplayer({
+});

loaded ​

  • Type: Getter

The proportion of the video that has been buffered, ranging from [0, 1]. Often used with the video:timeupdate event.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('video:timeupdate', () => {
     console.info(art.loaded);
-});

played ​

  • Type: Getter

The proportion of the video that has been played, ranging from [0, 1], commonly used with the video:timeupdate event.

▶ Run Code
js
var art = new Artplayer({
+});

loadedTime ​

  • Type: Getter

The amount of media that has been buffered, in seconds. Typically used alongside loaded to display detailed buffering progress.

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+});
+
+art.on('video:timeupdate', () => {
+    console.info(art.loadedTime);
+});

played ​

  • Type: Getter

The proportion of the video that has been played, ranging from [0, 1]. Often used with the video:timeupdate event.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.on('video:timeupdate', () => {
     console.info(art.played);
-});

proxy ​

  • Type: Function

A proxy function for DOM events, which essentially proxies addEventListener and removeEventListener. When using proxy to handle events, the event will automatically be destroyed when the player is destroyed.

▶ Run Code
js
var container = document.querySelector('.artplayer-app');
+});

proxy ​

  • Type: Function

A proxy function for DOM events, essentially proxying addEventListener and removeEventListener. When using proxy to handle events, the event is automatically removed when the player is destroyed.

▶ Run Code
js
var container = document.querySelector('.artplayer-app');
 
 var art = new Artplayer({
 	container: container,
@@ -357,17 +404,17 @@
 
 art.proxy(container, 'click', event => {
 	console.info(event);
-});

Tip

If you need some DOM events to exist only during the lifespan of the player, it is highly recommended to use this function to avoid causing memory leaks.

query ​

  • Type: Function

DOM query function, similar to document.querySelector, but the object being queried is limited within the current player, which can prevent errors due to having the same class name.

▶ Run Code
js
var art = new Artplayer({
+});

Note

If you need DOM events to exist only for the duration of the player's lifecycle, it is strongly recommended to use this function to avoid memory leaks.

query ​

  • Type: Function

A DOM query function, similar to document.querySelector, but the search is scoped to the current player instance, preventing errors from duplicate class names.

▶ Run Code
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
 
-console.info(art.query('.art-video'));

video ​

  • Type: Element

A shortcut to return the video element of the player.

▶ Run Code
js
var art = new Artplayer({
+console.info(art.query('.art-video'));

video ​

  • Type: Element

Quickly returns the player's video element.

▶ Run Code
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
 
-console.info(art.video);

cssVar ​

  • Type: Function

Dynamically getting or setting css variables

▶ Run Code
js
var art = new Artplayer({
+console.info(art.video);

cssVar ​

  • Type: Function

Dynamically gets or sets CSS variables.

▶ Run Code
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 });
@@ -376,7 +423,7 @@
     console.log(art.cssVar('--art-theme'));
     art.cssVar('--art-theme', 'green');
     console.log(art.cssVar('--art-theme'));
-});

quality ​

  • Type: Setter
  • Parameter: Array

Dynamically setting the list of qualities

▶ Run Code
js
var art = new Artplayer({
+});

quality ​

  • Type: Setter
  • Parameter: Array

Dynamically sets the list of available quality levels.

▶ Run Code
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
 	quality: [
@@ -406,18 +453,30 @@
 			},
 		];
 	}, 3000);
-})

thumbnails ​

  • Type: Setter/Getter
  • Parameter: Object

Dynamically set thumbnails

▶ Run Code
js
var art = new Artplayer({
-	container: '.artplayer-app',
-	url: '/assets/sample/video.mp4',
-});
+})
 
-art.on('ready', () => {
-    art.thumbnails = {
-        url: '/assets/sample/thumbnails.png',
-        number: 60,
-        column: 10,
-    };
-});

subtitleOffset ​

  • Type: Setter/Getter
  • Parameter: Number

Dynamically set subtitle offset

▶ Run Code
js
var art = new Artplayer({
+## `thumbnails`
+
+-   Type: `Setter/Getter`
+-   Parameter: `Object`
+
+Dynamically set thumbnails
+
+<div className="run-code">▶ Run Code</div>
+
+```js
+var art = new Artplayer({
+	container: '.artplayer-app',
+	url: '/assets/sample/video.mp4',
+});
+
+art.on('ready', () => {
+    art.thumbnails = {
+        url: '/assets/sample/thumbnails.png',
+        number: 60,
+        column: 10,
+    };
+});

subtitleOffset ​

  • Type: Setter/Getter
  • Parameter: Number

Dynamically set subtitle offset

▶ Run Code
js
var art = new Artplayer({
 	container: '.artplayer-app',
 	url: '/assets/sample/video.mp4',
     subtitle: {
@@ -427,8 +486,8 @@
 
 art.on('ready', () => {
     art.subtitleOffset = 1;
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/component/contextmenu.html b/docs/document/en/component/contextmenu.html index 5712f7b5f..db0e879bd 100644 --- a/docs/document/en/component/contextmenu.html +++ b/docs/document/en/component/contextmenu.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

Context Menu ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique name of the component, used for marking the class name
indexNumberComponent index, used for display priority
htmlString, ElementThe DOM element of the component
styleObjectStyle object for the component
clickFunctionClick event for the component
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component

Creation ​

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Context Menu ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique component name for CSS class
indexNumberComponent index for display priority
htmlString, ElementComponent DOM element
styleObjectComponent style object
clickFunctionComponent click event
mountedFunctionTriggered after component mount
tooltipStringComponent tooltip text

Creation ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -41,7 +41,7 @@
 art.contextmenu.show = true;
 
 // Get the Element of contextmenu by name
-console.info(art.contextmenu['your-menu']);

Add ​

▶ Run Code
js
var art = new Artplayer({
+console.info(art.contextmenu['your-menu']);

Addition ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
@@ -58,7 +58,7 @@
 art.contextmenu.show = true;
 
 // Get the Element of contextmenu by name
-console.info(art.contextmenu['your-menu']);

Delete ​

▶ Run Code
js
var art = new Artplayer({
+console.info(art.contextmenu['your-menu']);

Removal ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -77,10 +77,10 @@
 
 art.on('ready', () => {
     setTimeout(() => {
-        // Delete the context menu by name
+        // Delete the contextmenu by name
         art.contextmenu.remove('your-menu')
     }, 3000);
-});

Updates ​

▶ Run Code
js
var art = new Artplayer({
+});

Update ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -105,8 +105,8 @@
             html: 'Your New Menu',
         })
     }, 3000);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/component/controls.html b/docs/document/en/component/controls.html index 706928bfa..46612bdbe 100644 --- a/docs/document/en/component/controls.html +++ b/docs/document/en/component/controls.html @@ -3,17 +3,17 @@ - Controller | Artplayer.js + Controls | Artplayer.js - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

Controller ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringThe unique name of the component for class identification
indexNumberThe index of the component, used for display priority
htmlString, ElementThe component's DOM element
styleObjectThe style object for the component
clickFunctionComponent click event
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component
positionStringleft and right control the position of the controller
selectorArrayAn array of objects for the selection list
onSelectFunctionFunction triggered when an item from the selection list is clicked

Creation ​

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Controls ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the control
nameStringUnique control name for CSS class identification
indexNumberControl index for display priority
htmlString, ElementControl's DOM element
styleObjectControl style object
clickFunctionControl click event handler
mountedFunctionTriggered after control is mounted
tooltipStringControl tooltip text
positionStringleft or right - controls display position
selectorArrayArray of selector list objects
onSelectFunctionFunction triggered when selector item is clicked

Creation ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -89,7 +89,7 @@
 });
 
 // Get the Element of control by name
-console.info(art.controls['button1']);

Delete ​

▶ Run Code
js
var art = new Artplayer({
+console.info(art.controls['button1']);

Removal ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -111,7 +111,7 @@
         // Delete the control by name
         art.controls.remove('button1');
     }, 3000);
-});

Update ​

▶ Run Code
js
var art = new Artplayer({
+});

Updating ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -152,8 +152,8 @@
             ],
         });
     }, 3000);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/component/layers.html b/docs/document/en/component/layers.html index 5e68a6148..8ec2cabe5 100644 --- a/docs/document/en/component/layers.html +++ b/docs/document/en/component/layers.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,15 +23,15 @@ -
Skip to content

Layer ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique name of the component, used for marking class name
indexNumberComponent index, used for display priority
htmlString, ElementThe DOM element of the component
styleObjectStyle object for the component
clickFunctionClick event for the component
mountedFunctionTriggered after the component is mounted
tooltipStringTooltip text for the component

Creation ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
+    
Skip to content

Layer ​

Configuration ​

PropertyTypeDescription
disableBooleanWhether to disable the component
nameStringUnique component name for CSS class
indexNumberComponent index for display priority
htmlString, ElementComponent DOM element
styleObjectComponent style object
clickFunctionComponent click event
mountedFunctionTriggered after component mount
tooltipStringComponent tooltip text

Creation ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: `<img style="width: 100px" src="${img}">`,
-            tooltip: 'Poster Tip',
+            tooltip: 'Potser Tip',
             style: {
                 position: 'absolute',
                 top: '50px',
@@ -48,16 +48,16 @@
 });
 
 // Get the Element of layer by name
-console.info(art.layers['poster']);

Add ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
+console.info(art.layers['potser']);

Addition ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
 });
 
 art.layers.add({
-    name: 'poster',
+    name: 'potser',
     html: `<img style="width: 100px" src="${img}">`,
-    tooltip: 'Poster Tip',
+    tooltip: 'Potser Tip',
     style: {
         position: 'absolute',
         top: '50px',
@@ -72,13 +72,13 @@
 });
 
 // Get the Element of layer by name
-console.info(art.layers['poster']);

Delete ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
+console.info(art.layers['potser']);

Removal ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: `<img style="width: 100px" src="${img}">`,
             style: {
                 position: 'absolute',
@@ -92,7 +92,7 @@
 art.on('ready', () => {
     setTimeout(() => {
         // Delete the layer by name
-        art.layers.remove('poster');
+        art.layers.remove('potser');
     }, 3000);
 });

Update ​

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
@@ -100,7 +100,7 @@
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: `<img style="width: 100px" src="${img}">`,
             style: {
                 position: 'absolute',
@@ -115,7 +115,7 @@
     setTimeout(() => {
         // Update the layer by name
         art.layers.update({
-            name: 'poster',
+            name: 'potser',
             html: `<img style="width: 200px" src="${img}">`,
             style: {
                 position: 'absolute',
@@ -124,8 +124,8 @@
             },
         });
     }, 3000);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/component/setting.html b/docs/document/en/component/setting.html index 6d9817ab3..2b2080c01 100644 --- a/docs/document/en/component/setting.html +++ b/docs/document/en/component/setting.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,15 +23,15 @@ -
Skip to content

Settings Panel ​

Built-in ​

First, open the settings panel, and then it comes with four built-in items: flip, playbackRate, aspectRatio, subtitleOffset

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Settings Panel ​

Built-in ​

First, you need to open the settings panel. It comes with four built-in items: flip, playbackRate, aspectRatio, subtitleOffset

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-    setting: true,
+	setting: true,
     flip: true,
     playbackRate: true,
     aspectRatio: true,
     subtitleOffset: true,
-});

Create - Button ​

PropertyTypeDescription
htmlString, ElementItem DOM
iconString, ElementItem Icon
onClickFunctionClick event
widthNumberList Width
tooltipStringTooltip text
▶ Run Code
js
var art = new Artplayer({
+});

Creating - Buttons ​

PropertyTypeDescription
htmlString, ElementElement DOM
iconString, ElementElement icon
onClickFunctionElement click event
widthNumberList width
tooltipStringTooltip text
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -46,7 +46,7 @@
 			}
         },
     ],
-});

Create - Selection List ​

PropertyTypeDescription
htmlString, ElementItem DOM
iconString, ElementItem Icon
selectorArrayItem selector
onSelectFunctionClick event
widthNumberList Width
tooltipStringTooltip text
▶ Run Code
js
var art = new Artplayer({
+});

Creating - Selection Lists ​

PropertyTypeDescription
htmlString, ElementElement DOM
iconString, ElementElement icon
selectorArrayElement list
onSelectFunctionElement click event
widthNumberList width
tooltipStringTooltip text
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -141,26 +141,41 @@
             ],
         },
     ],
-});

Create - Toggle Button ​

PropertyTypeDescription
htmlString, ElementElement's DOM element
iconString, ElementElement's icon
switchBooleanButton's default state
onSwitchFunctionButton toggle event
tooltipStringTooltip text
▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    setting: true,
-    settings: [
-        {
-            html: 'PIP Mode',
-            tooltip: 'Close',
-            icon: '<img width="22" height="22" src="/assets/img/state.svg">',
-            switch: false,
-            onSwitch: function (item, $dom, event) {
-                console.info(item, $dom, event);
-                const nextState = !item.switch;
-                art.pip = nextState;
-                item.tooltip = nextState ? 'Open' : 'Close';
-                return nextState;
-            },
-        },
-    ],
-});

Create - Range Slider ​

AttributeTypeDescription
htmlString, ElementThe element's DOM element
iconString, ElementThe element's icon
rangeArrayDefault state array
onRangeFunctionEvent triggered upon completion
onChangeFunctionEvent triggered on change
tooltipStringTooltip text
js
const range = [5, 1, 10, 1];
+});
+
+## Create - Toggle Button
+
+| Property   | Type                | Description               |
+| ---------- | ------------------- | ------------------------- |
+| `html`     | `String`, `Element` | DOM element of the item   |
+| `icon`     | `String`, `Element` | Icon of the item          |
+| `switch`   | `Boolean`           | Default state of the button |
+| `onSwitch` | `Function`          | Button toggle event       |
+| `tooltip`  | `String`            | Tooltip text              |
+
+<div className="run-code">▶ Run Code</div>
+
+```js
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    setting: true,
+    settings: [
+        {
+            html: 'PIP Mode',
+            tooltip: 'Close',
+            icon: '<img width="22" height="22" src="/assets/img/state.svg">',
+            switch: false,
+            onSwitch: function (item, $dom, event) {
+                console.info(item, $dom, event);
+                const nextState = !item.switch;
+                art.pip = nextState;
+                item.tooltip = nextState ? 'Open' : 'Close';
+                return nextState;
+            },
+        },
+    ],
+});

Create - Range Slider ​

PropertyTypeDescription
htmlString, ElementDOM element of the item
iconString, ElementIcon of the item
rangeArrayDefault state array
onRangeFunctionEvent triggered on completion
onChangeFunctionEvent triggered on change
tooltipStringTooltip text
js
const range = [5, 1, 10, 1];
 const value = range[0];
 const min = range[1];
 const max = range[2];
@@ -193,7 +208,7 @@
     tooltip: '5x',
     icon: '<img width="22" height="22" src="/assets/img/state.svg">',
     range: [5, 1, 10, 1],
-});

Delete ​

▶ Run Code
js
var art = new Artplayer({
+});

Remove ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -216,7 +231,7 @@
         // Delete the setting by name
         art.setting.remove('slider');
     }, 3000);
-});

Updates ​

▶ Run Code
js
var art = new Artplayer({
+});

Update ​

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -244,8 +259,8 @@
             switch: false,
         });
     }, 3000);
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/index.html b/docs/document/en/index.html index 187ef74ae..f6c2429b1 100644 --- a/docs/document/en/index.html +++ b/docs/document/en/index.html @@ -3,17 +3,17 @@ - Installation and Usage | Artplayer.js + Installation & Usage | Artplayer.js - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

Installation and Usage ​

Installation ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

Usage ​

html
<html>
+    
Skip to content

Installation & Usage ​

Installation ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

Usage ​

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -44,7 +44,7 @@
           });
         </script>
     </body>
-</html>

Warning

The player's size depends on the size of the container container, so your container container must have a size.

You can find more usage examples at the link below

/packages/artplayer-template

Vue.js ​

vue
<template>
+</html>

Note

The player's dimensions depend on the size of its container container, so your container must have defined dimensions.

See more usage examples at the following link:

/packages/artplayer-template

Vue.js ​

vue
<template>
   <div ref="$container" />
 </template>
 
@@ -76,7 +76,7 @@
   art.value.destroy(false)
 })
 </script>
vue
<template>
-  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
+  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
 </template>
 
 <script setup>
@@ -96,7 +96,7 @@
 function getInstance(art) {
   console.log(art)
 }
-</script>

Artplayer Not Responsive:

Modifying option directly in Vue.js will not change the player

React.js ​

jsx
import Artplayer from 'artplayer'
+</script>

Artplayer is not reactive:

Directly modifying option in Vue.js will not update the player.

React.js ​

jsx
import Artplayer from 'artplayer'
 import { useEffect, useRef } from 'react'
 
 export default function Player({ option, getInstance, ...rest }) {
@@ -136,13 +136,13 @@
   )
 }
 
-export default App

Non-responsive Artplayer

In React.js, directly modifying the option will not change the player

TypeScript ​

Importing Artplayer will automatically import artplayer.d.ts

Vue.js ​

vue
<script setup>
+export default App

Artplayer is not reactive:

Directly modifying option in React.js will not update the player.

TypeScript ​

artplayer.d.ts is automatically imported when importing Artplayer.

Vue.js ​

vue
<script setup>
 import Artplayer from 'artplayer';
 const art = shallowRef<Artplayer>(null);
 art.value = new Artplayer();
 </script>

React.js ​

jsx
import Artplayer from 'artplayer';
 const art = useRef<Artplayer>(null);
-art.current = new Artplayer();

Option ​

You can also use the option type

ts
import Artplayer, { type Option } from 'artplayer';
+art.current = new Artplayer();

Option ​

You can also use the option type.

ts
import Artplayer, { type Option } from 'artplayer';
 
 const option: Option = {
     container: '.artplayer-app',
@@ -151,15 +151,15 @@
 
 option.volume = 0.5;
 
-const art = new Artplayer(option);

Complete TypeScript Definitions

packages/artplayer/types

JavaScript ​

Sometimes your js file may lose the TypeScript type hints, in this case, you can manually import the types

Variables:

js
/**
+const art = new Artplayer(option);

Full TypeScript definitions

packages/artplayer/types

JavaScript ​

Sometimes your js files may lose TypeScript type hints. In such cases, you can manually import the types.

Variable:

js
/**
  * @type {import("artplayer")}
  */
-let art = null;

Parameters:

js
/**
+let art = null;

Parameter:

js
/**
  * @param {import("artplayer")} art
  */
 function getInstance(art) {
   //
-}

Properties:

js
export default {
+}

Property:

js
export default {
   data() {
     return {
       /**
@@ -168,7 +168,7 @@
       art: null,
     }
   }
-}

Options:

js
/**
+}

Option:

js
/**
  * @type {import("artplayer/types/option").Option}
  */
 
@@ -179,7 +179,7 @@
 
 option.volume = 0.5;
 
-const art8 = new Artplayer(option);

Ancient Browsers ​

The production build of artplayer.js is only compatible with the latest major version of Chrome: last 1 Chrome version

For ancient browsers, you can use the artplayer.legacy.js file, which is compatible up to: IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

If you need to support even older browsers, please modify the following configuration and then build it yourself:

Build configuration: scripts/build.js

Refer to documentation: browserslist

ECMAScript Module ​

Starting from 5.2.6, artplayer and all plugins will also provide an ESM version of mjs, such as:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
+const art8 = new Artplayer(option);

Legacy Browsers ​

The production build artplayer.js only supports the latest major version of Chrome: last 1 Chrome version

For legacy browsers, you can use the artplayer.legacy.js file, which supports compatibility down to: IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

If you need to support even older browsers, modify the following configuration and build it yourself:

Build configuration: scripts/build.js

Reference documentation: browserslist

ECMAScript Module ​

Starting from 5.2.6, artplayer and all plugins also provide an ESM version mjs, such as:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
 <html lang="en">
 
 <head>
@@ -196,7 +196,7 @@
     <script type="importmap">
     {
         "imports": {
-            "artplayer": "https://unpkg.com/artplayer/dist/artplayer.mjs"
+            "artplayer": "https://unpkg.com/artplayer/dist/artplayer.esm.js"
         }
     }
     </script>
@@ -214,7 +214,7 @@
     </script>
 </body>
 
-</html>

Custom userAgent ​

Currently, the determination of mobile devices is not accurate. Sometimes, you may want to adjust the player UI by changing the userAgent. Therefore, starting in version 5.2.4, we added a new globalThis.CUSTOM_USER_AGENT global variable.

html
<html>
+</html>

Custom userAgent ​

Currently, the detection for whether a device is mobile is not entirely accurate. Sometimes you may want to adjust the player's UI by changing the userAgent. Therefore, starting from 5.2.4, a new global variable globalThis.CUSTOM_USER_AGENT has been added.

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -236,8 +236,8 @@
           });
         </script>
     </body>
-</html>

Warning

You need to modify it before import the Artplayer for it to take effect

- +</html>

Note

You need to modify it before importing the Artplayer dependency for it to take effect.

+ \ No newline at end of file diff --git a/docs/document/en/start/i18n.html b/docs/document/en/start/i18n.html index ae04152d5..d1e63be70 100644 --- a/docs/document/en/start/i18n.html +++ b/docs/document/en/start/i18n.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,11 +23,11 @@ -
Skip to content

Language Settings ​

DANGER

Given the increasing number of bundled multilingual packs, starting from version 5.1.0, the core code of artplayer.js will no longer include other languages besides Simplified Chinese and English. You need to import the required languages on your own.

WARNING

When a language cannot be matched, English will be displayed by default. For i18n usage, refer to: artplayer/types/i18n.d.ts

Default Languages ​

The default languages are: en, zh-cn, which do not require manual import.

js
var art = new Artplayer({
+    
Skip to content

Language Settings ​

DANGER

Due to the increasing number of bundled multilingual resources, starting from version 5.1.0, the core artplayer.js code will only include Simplified Chinese and English. Other languages are no longer bundled by default and must be imported manually as needed.

WARNING

When a language cannot be matched, English will be displayed by default. For i18n implementation reference, see: artplayer/types/i18n.d.ts

Default Languages ​

The default languages are: en, zh-cn. No manual import is required.

js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'zh-cn', // or 'en'
-});

Importing Languages ​

Language files before packaging are located in: artplayer/src/i18n/*.js.

Packaged language files are located at: artplayer/dist/i18n/*.js.

js
import id from 'artplayer/i18n/id';
+});

Importing Languages ​

Language files before bundling are located at: artplayer/src/i18n/*.js. Contributions to add your language are welcome.

Language files after bundling are located at: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
 import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
@@ -49,7 +49,7 @@
         'zh-tw': window['artplayer-i18n-zh-tw'],
     },
     lang: 'zh-tw',
-});

Add Language ​

js
var art = new Artplayer({
+});

Adding a New Language ​

js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'your-lang',
@@ -58,7 +58,7 @@
             Play: 'Your Play'
         },
     },
-});

Modify Language ​

js
import zhTw from 'artplayer/i18n/zh-tw';
+});

Modifying Languages ​

js
import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
     container: '.artplayer-app',
@@ -74,8 +74,8 @@
             Play: 'Your Play'
         },
     },
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/en/start/option.html b/docs/document/en/start/option.html index 7cc4b2976..dda3db29e 100644 --- a/docs/document/en/start/option.html +++ b/docs/document/en/start/option.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,29 +23,29 @@ -
Skip to content

Basic Options ​

container ​

  • Type: String, Element
  • Default: #artplayer

The DOM container where the player mounts

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

Basic Options ​

container ​

  • Type: String, Element
  • Default: #artplayer

The DOM container where the player is mounted.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app', 
     // container: document.querySelector('.artplayer-app'),
     url: '/assets/sample/video.mp4',
-});

You may need to initialize the size of the container element, like:

css
.artplayer-app {
+});

You may need to initialize the size of the container element, for example:

css
.artplayer-app {
     width: 400px;
     height: 300px;
 }

Or use aspect-ratio:

css
.artplayer-app {
     aspect-ratio: 16/9;
-}

Tip

Among all options, only container is mandatory.

url ​

  • Type: String
  • Default: ''

The video source address

▶ Run Code
js
var art = new Artplayer({
+}

Note

Among all options, only container is required.

url ​

  • Type: String
  • Default: ''

The video source URL.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

Sometimes the url is not known so quickly, in which case you can set the url asynchronously.

▶ Run Code
js
var art = new Artplayer({
+});

Sometimes the url is not known immediately; in such cases, you can set the url asynchronously.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
 });
 
 setTimeout(() => {
     art.url = '/assets/sample/video.mp4';
-}, 1000);

Note

The default support is for three video file formats: .mp4, .ogg, .webm.

If you need to play other formats such as .m3u8 or .flv, please refer to the Third-party Libraries on the left side.

id ​

  • Type: String
  • Default: ''

The unique identifier of the player, currently used only for remembering playback with autoplayback

▶ Run Code
js
var art = new Artplayer({
+}, 1000);

Note

By default, three video file formats are supported: .mp4, .ogg, .webm.

To play other formats like .m3u8 or .flv, please refer to the Third-party Libraries section on the left.

id ​

  • Type: String
  • Default: ''

The unique identifier for the player, currently only used for playback resumption autoplayback.

▶ Run Code
js
var art = new Artplayer({
     id: 'your-url-id',
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
-});

onReady ​

  • Type: Function
  • Default: undefined

The constructor accepts a function as the second argument, which is triggered when the player is successfully initialized and the video is ready to play, similar to the ready event

▶ Run Code
js
var art = new Artplayer(
+});

onReady ​

  • Type: Function
  • Default: undefined

The constructor accepts a function as the second parameter, which is triggered when the player is successfully initialized and the video is ready to play, similar to the ready event.

▶ Run Code
js
var art = new Artplayer(
     {
         container: '.artplayer-app',
         url: '/assets/sample/video.mp4',
@@ -62,87 +62,103 @@
 
 art.on('ready', () => {
     art.play();
-});

Warning

The this inside the callback function refers to the player instance, but if an arrow function is used for the callback, this will not point to the player instance.

poster ​

  • Type: String
  • Default: ''

The poster of the video, which only appears when the player is initialized and before it starts playing.

▶ Run Code
js
var art = new Artplayer({
+});

Note

Inside the callback function, this refers to the player instance. However, if an arrow function is used for the callback, this will not point to the player instance.

poster ​

  • Type: String
  • Default: ''

The video poster image, which only appears when the player is initialized and not yet playing.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     poster: '/assets/sample/poster.jpg',
-});

theme ​

  • Type: String
  • Default: #f00

Player theme color, currently used for progress bar and highlight elements

▶ Run Code
js
var art = new Artplayer({
+});

theme ​

  • Type: String
  • Default: #f00

The player's theme color, currently used for the progress bar and highlighted elements.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     theme: '#ffad00',
-});

volume ​

  • Type: Number
  • Default: 0.7

The default volume of the player

▶ Run Code
js
var art = new Artplayer({
+});

volume ​

  • Type: Number
  • Default: 0.7

The default volume of the player.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     volume: 0.5,
-});

Warning

The player will cache the size of the last volume. When the player is initialized next time (such as refreshing the page), it will read this cached value.

isLive ​

  • Type: Boolean
  • Default: false

Use live mode, which will hide the progress bar and playback time

▶ Run Code
js
var art = new Artplayer({
+});

Note

The player caches the last volume level; upon next initialization (e.g., page refresh), the player will read this cached value.

isLive ​

  • Type: Boolean
  • Default: false

Enable live streaming mode, which hides the progress bar and playback time.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     isLive: true,
-});

muted ​

  • Type: Boolean
  • Default: false

Whether to mute by default

▶ Run Code
js
var art = new Artplayer({
+});

muted ​

  • Type: Boolean
  • Default: false

Whether to mute by default.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     muted: true,
-});

autoplay ​

  • Type: Boolean
  • Default: false

Whether to play automatically

  • Default: false

Autoplay

▶ Run Code
js
var art = new Artplayer({
+});

autoplay ​

  • Type: Boolean
  • Default: false

Whether to autoplay.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoplay: true,
     muted: true,
-});

Warning

If you want the video to autoplay by default upon entering the page, muted must be set to true. For more information, please read Autoplay Policy Changes

autoSize ​

  • Type: Boolean
  • Default: false

The size of the player will by default fill the entire container, which often results in black bars. This value can automatically adjust the player size to hide the black bars, similar to css's object-fit: cover;

▶ Run Code
js
var art = new Artplayer({
+});

Note

If you want the video to autoplay immediately upon page load, muted must be set to true. For more information, please read Autoplay Policy Changes.

autoSize ​

  • Type: Boolean
  • Default: false

By default, the player's dimensions fill the entire container size, often resulting in black bars. This option automatically adjusts the player size to hide the black bars, similar to object-fit: cover; in CSS.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoSize: true,
-});

autoMini ​

  • Type: Boolean
  • Default: false

Automatically enter mini mode when the player scrolls out of the browser viewport

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    autoMini: true,
-});

loop ​

  • Type: Boolean
  • Default: false

Whether to loop the video

▶ Run Code
js
var art = new Artplayer({
+});
+
+## `autoMini`
+
+-   Type: `Boolean`
+-   Default: `false`
+
+Automatically enters `mini player` mode when the player scrolls out of the browser viewport.
+
+<div className="run-code">▶ Run Code</div>
+
+```js{4}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    autoMini: true,
+});

loop ​

  • Type: Boolean
  • Default: false

Whether to enable video looping.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     loop: true,
-});

flip ​

  • Type: Boolean
  • Default: false

Whether to show the video flip feature, currently only available in Settings Panel and Context Menu

▶ Run Code
js
var art = new Artplayer({
+});

flip ​

  • Type: Boolean
  • Default: false

Whether to display the video flip functionality. Currently appears in the Settings Panel and Context Menu.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     flip: true,
     setting: true,
-});

playbackRate ​

  • Type: Boolean
  • Default: false

Whether to show the playback speed feature of the video, it will appear in Settings Panel and Context Menu

▶ Run Code
js
var art = new Artplayer({
+});

playbackRate ​

  • Type: Boolean
  • Default: false

Whether to display the video playback rate functionality. Appears in the Settings Panel and Context Menu.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     playbackRate: true,
     setting: true,
-});

aspectRatio ​

  • Type: Boolean
  • Default: false

Displays the video aspect ratio feature, it will appear in the Settings Panel and Context Menu

▶ Run Code
js
var art = new Artplayer({
+});

aspectRatio ​

  • Type: Boolean
  • Default: false

Whether to display the video aspect ratio functionality. Appears in the Settings Panel and Context Menu.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     aspectRatio: true,
     setting: true,
-});

screenshot ​

  • Type: Boolean
  • Default: false

Whether to show the screenshot button, it will appear in the toolbar and context menu Display Screenshot function in the bottom control bar

▶ Run Code
js
var art = new Artplayer({
+});

screenshot ​

  • Type: Boolean
  • Default: false

Whether to display the Video Screenshot functionality in the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     screenshot: true,
-});

Warning

Due to browser security mechanisms, if the video source address and the website are cross-origin, screenshot failure may occur

setting ​

  • Type: Boolean
  • Default: false

Display the toggle button for the Settings Panel in the bottom control bar

▶ Run Code
js
var art = new Artplayer({
+});

Note

Due to browser security mechanisms, screenshot capture may fail if the video source URL is cross-origin with the website.

setting ​

  • Type: Boolean
  • Default: false

Whether to display the toggle button for the Settings Panel in the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
-});

hotkey ​

  • Type: Boolean
  • Default: true

Whether to use hotkeys

▶ Run Code
js
var art = new Artplayer({
+});

hotkey ​

  • Type: Boolean
  • Default: true

Whether to enable hotkeys.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     hotkey: true,
-});
HotkeyDescription
↑Increase volume
↓Decrease volume
←Fast forward video
→Rewind video
spaceToggle play/pause

Tip

These hotkeys will only work after the player gains focus (such as after clicking on the player).

pip ​

  • Type: Boolean
  • Default: false Show the Picture in Picture switch button on the bottom control bar
▶ Run Code
js
var art = new Artplayer({
+});
HotkeyDescription
↑Increase volume
↓Decrease volume
←Seek forward
→Seek backward
spaceToggle play/pause

Note

These hotkeys only take effect after the player gains focus (e.g., by clicking on the player).

pip ​

  • Type: Boolean
  • Default: false

Whether to display the Picture-in-Picture toggle button in the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     pip: true,
-});

mutex ​

  • Type: Boolean
  • Default: true

If there are multiple players on the page, should only one player be allowed to play at a time

▶ Run Code
js
var art = new Artplayer({
+});

mutex ​

  • Type: Boolean
  • Default: true

If multiple players exist simultaneously on the page, whether only one player is allowed to play at a time.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     mutex: true,
-});

fullscreen ​

  • Type: Boolean
  • Default: false Display the Window Fullscreen button on the control bar at the bottom
▶ Run Code
js
var art = new Artplayer({
+});

backdrop ​

  • Type: Boolean
  • Default: true

Whether to enable the backdrop blur effect for the player UI. When enabled, overlays such as the settings panel, context menu, and volume bar will apply a backdrop-filter frosted glass effect for a more transparent appearance. However, this may cause performance or compatibility issues on some low-performance devices or older browsers.

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    backdrop: false, // Disable frosted glass effect
+});

fullscreen ​

  • Type: Boolean
  • Default: false

Whether to display the player Window Fullscreen button in the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreen: true,
-});

fullscreenWeb ​

  • Type: Boolean
  • Default: false

Display the Web Fullscreen button on the control bar at the bottom

▶ Run Code
js
var art = new Artplayer({
+});

fullscreenWeb ​

  • Type: Boolean
  • Default: false

Whether to display the player Webpage Fullscreen button in the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fullscreenWeb: true,
-});

subtitleOffset ​

  • Type: Boolean

  • Default: false

Subtitle time offset, the range is [-5s, 5s], appearing in the Settings panel

▶ Run Code
js
var art = new Artplayer({
+});

subtitleOffset ​

  • Type: Boolean
  • Default: false

Subtitle timing offset, range within [-5s, 5s]. Appears in the Settings Panel.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitleOffset: true,
@@ -150,28 +166,40 @@
         url: '/assets/sample/subtitle.srt',
     },
     setting: true,
-});

miniProgressBar ​

  • Type: Boolean
  • Default: false

Mini progress bar, only appears when the player loses focus and is playing

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    miniProgressBar: true,
-});

useSSR ​

  • Type: Boolean
  • Default: false

Whether to use SSR (Server-Side Rendering) mount mode, useful if you want to pre-render the player's required HTML before the player mounts

You can access the player's required HTML through Artplayer.html

▶ Run Code
js
var $container = document.querySelector('.artplayer-app');
+});
+
+## `miniProgressBar`
+
+-   Type: `Boolean`
+-   Default: `false`
+
+Mini progress bar that appears only when the player loses focus and is playing.
+
+<div className="run-code">▶ Run Code</div>
+
+```js{4}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    miniProgressBar: true,
+});

useSSR ​

  • Type: Boolean
  • Default: false

Whether to use SSR mount mode. Useful if you want to pre-render the player's required HTML before mounting.

You can access the player's required HTML via Artplayer.html.

▶ Run Code
js
var $container = document.querySelector('.artplayer-app');
 $container.innerHTML = Artplayer.html;
 
 var art = new Artplayer({
     container: $container,
     url: '/assets/sample/video.mp4',
     useSSR: true,
-});

playsInline ​

  • Type: Boolean
  • Default: true

Whether to use playsInline mode on mobile devices

▶ Run Code
js
var art = new Artplayer({
+});

playsInline ​

  • Type: Boolean
  • Default: true

Whether to use playsInline mode on mobile devices.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     playsInline: true,
-});

layers ​

  • Type: Array
  • Default: []

Initializes custom layers

▶ Run Code
js
var img = '/assets/sample/layer.png';
+});

layers ​

  • Type: Array
  • Default: []

Initialize custom layers.

▶ Run Code
js
var img = '/assets/sample/layer.png';
 var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     layers: [
         {
-            name: 'poster',
+            name: 'potser',
             html: `<img style="width: 100px" src="${img}">`,
             style: {
                 position: 'absolute',
@@ -188,7 +216,7 @@
             },
         },
     ],
-});

Component Configuration Please refer to the following address:

/component/layers.html

settings ​

  • Type: Array
  • Default: []

Initializes custom settings panel

▶ Run Code
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/layers.html

settings ​

  • Type: Array
  • Default: []

Initialize custom settings panel.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     setting: true,
@@ -222,7 +250,7 @@
             },
         },
     ],
-});

Settings Panel Please refer to the following address

/component/setting.html

contextmenu ​

  • Type: Array
  • Default: []

Initialize custom context menu

▶ Run Code
js
var art = new Artplayer({
+});

For Settings Panel, please refer to:

/component/setting.html

contextmenu ​

  • Type: Array
  • Default: []

Initialize custom context menu.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     contextmenu: [
@@ -234,7 +262,7 @@
             },
         },
     ],
-});

Component Configuration Please refer to the following address:

/component/contextmenu.html- Type:

controls ​

  • Type: Array
  • Default: []

Initializes custom bottom control bar

▶ Run Code
js
var art = new Artplayer({
+});

For Component Configuration, please refer to:

/component/contextmenu.html

controls ​

  • Type: Array
  • Default: []

Initialize custom bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -250,21 +278,45 @@
             },
         },
     ],
-});

Component Configuration Refer to the following address:

/component/controls.html

quality ​

  • Type: Array
  • Default: []

Whether to show the quality selection list in the bottom control bar

PropertyTypeDescription
defaultBooleanDefault quality
htmlStringQuality name
urlStringQuality URL
▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    quality: [
-        {
-            default: true,
-            html: 'SD 480P',
-            url: '/assets/sample/video.mp4',
-        },
-        {
-            html: 'HD 720P',
-            url: '/assets/sample/video.mp4',
-        },
-    ],
-});

highlight ​

  • Type: Array
  • Default: []

Show highlight information on the progress bar

PropertyTypeDescription
timeNumberHighlight time (in seconds)
textStringHighlight text
▶ Run Code
js
var art = new Artplayer({
+});
+
+:::warning For `Component Configuration`, please refer to:
+
+[/component/controls.html](/component/controls.html)
+
+:::
+
+## `quality`
+
+-   Type: `Array`
+-   Default: `[]`
+
+Whether to display the `Quality Selection` list in the bottom control bar.
+
+| Property  | Type      | Description      |
+| --------- | --------- | ---------------- |
+| `default` | `Boolean` | Default quality  |
+| `html`    | `String`  | Quality name     |
+| `url`     | `String`  | Quality URL      |
+
+<div className="run-code">▶ Run Code</div>
+
+```js{4-14}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    quality: [
+        {
+            default: true,
+            html: 'SD 480P',
+            url: '/assets/sample/video.mp4',
+        },
+        {
+            html: 'HD 720P',
+            url: '/assets/sample/video.mp4',
+        },
+    ],
+});

highlight ​

  • Type: Array
  • Default: []

Display Highlight Information on the progress bar.

PropertyTypeDescription
timeNumberHighlight time (in seconds)
textStringHighlight text
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     highlight: [
@@ -289,7 +341,7 @@
             text: '--终わり--',
         },
     ],
-});

plugins ​

  • Type: Array
  • Default: []

Initialize custom plugins

▶ Run Code
js
function myPlugin(art) {
+});

plugins ​

  • Type: Array
  • Default: []

Initialize custom plugins.

▶ Run Code
js
function myPlugin(art) {
     console.info(art);
     return {
         name: 'myPlugin',
@@ -304,7 +356,7 @@
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     plugins: [myPlugin],
-});

thumbnails ​

  • Type: Object
  • Default: {}

Set thumbnails on the progress bar

PropertyTypeDescription
urlStringThumbnail URL
numberNumberNumber of thumbnails
columnNumberColumns of thumbnails
widthNumberThumbnail width
heightNumberThumbnail height
scaleNumberThumbnail scale
▶ Run Code
js
var art = new Artplayer({
+});

thumbnails ​

  • Type: Object
  • Default: {}

Set Preview Thumbnails on the progress bar.

PropertyTypeDescription
urlStringThumbnail image URL
numberNumberNumber of thumbnails
columnNumberNumber of thumbnail columns
widthNumberThumbnail width
heightNumberThumbnail height
scaleNumberThumbnail scale
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     thumbnails: {
@@ -312,7 +364,7 @@
         number: 60,
         column: 10,
     },
-});

Online thumbnail generation

artplayer-tool-thumbnail

subtitle ​

  • Type: Object
  • Default: {}

Set the video subtitles, supporting subtitle formats: vtt, srt, ass

PropertyTypeDescription
nameStringSubtitle name
urlStringSubtitle URL
typeStringSubtitle type, options: vtt, srt, ass
styleObjectSubtitle style
encodingStringSubtitle encoding, default utf-8
escapeBooleanWhether to escape html tags, default true
onVttLoadFunctionFunction to modify vtt text
▶ Run Code
js
var art = new Artplayer({
+});

Generate Thumbnails Online

artplayer-tool-thumbnail

subtitle ​

  • Type: Object
  • Default: {}

Set the video subtitle. Supported subtitle formats: vtt, srt, ass.

PropertyTypeDescription
nameStringSubtitle name
urlStringSubtitle URL
typeStringSubtitle type, options: vtt, srt, ass
styleObjectSubtitle style
encodingStringSubtitle encoding, default: utf-8
escapeBooleanWhether to escape html tags, default: true
onVttLoadFunctionFunction for modifying vtt text
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     subtitle: {
@@ -325,25 +377,37 @@
             'font-size': '30px',
         },
     },
-});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'}

Additional video attributes, these attributes will be directly written into the video element

▶ Run Code
js
var art = new Artplayer({
+});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'} (In Safari, it automatically adjusts to preload: 'auto' for better loading experience).

More video attributes. These attributes will be directly written into the video element.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     moreVideoAttr: {
         'webkit-playsinline': true,
         playsInline: true,
     },
-});

icons ​

  • Type: Object
  • Default: {}

Used to replace default icons, supports Html strings and HTMLElement

▶ Run Code
js
var art = new Artplayer({
-    container: '.artplayer-app',
-    url: '/assets/sample/video.mp4',
-    icons: {
-        loading: '<img src="/assets/img/loading.gif">',
-        state: '<img src="/assets/img/state.png">',
-    },
-});

Definition of all icons

artplayer/types/icons.d.ts

type ​

  • Type: String
  • Default: ''

Used to specify the format of the video, which is used in conjunction with customType. By default, the video format is the same as the file extension of the video URL (such as .m3u8, .mkv, .ts). However, sometimes the video URL does not have the correct file extension, so it needs to be specifically stated.

▶ Run Code
js
var art = new Artplayer({
+});
+
+## `icons`
+
+-   Type: `Object`
+-   Default: `{}`
+
+Used to replace default icons, supports both `Html` strings and `HTMLElement`.
+
+<div className="run-code">▶ Run Code</div>
+
+```js{4-7}
+var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    icons: {
+        loading: '<img src="/assets/img/ploading.gif">',
+        state: '<img src="/assets/img/state.png">',
+    },
+});

All Icon Definitions

artplayer/types/icons.d.ts

type ​

  • Type: String
  • Default: ''

Used to specify the video format. It needs to be used in conjunction with customType. By default, the video format is determined by the suffix of the video URL (e.g., .m3u8, .mkv, .ts). However, sometimes the video URL lacks the correct suffix, so explicit specification is necessary.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.m3u8',
     type: 'm3u8',
-});

Recognition of file extensions

The player can only parse this type of file extension: /assets/sample/video.m3u8

But it cannot parse this type of file extension: /assets/sample/video?type=m3u8

Therefore, if you use customType, it is best to specify type as well

customType ​

  • Type: Object
  • Default: {}

Matches the video's type to delegate the video decoding to a third-party program for processing. The processing function can receive three parameters:

  • video: Video DOM element
  • url: Video address
  • art: Current instance
▶ Run Code
js
var art = new Artplayer({
+});

Suffix Recognition

The player can only parse suffixes like this: /assets/sample/video.m3u8

But cannot parse suffixes like this: /assets/sample/video?type=m3u8

Therefore, if you use customType, it is best to also specify the type.

customType ​

  • Type: Object
  • Default: {}

Matches based on the video's type and delegates video decoding to third-party programs. The handler function receives three parameters:

  • video: The video DOM element
  • url: The video URL
  • art: The current instance
▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.m3u8',
     customType: {
@@ -351,11 +415,11 @@
             //
         },
     },
-});

lang ​

  • Type: String
  • Default: navigator.language.toLowerCase()

Default display language, currently supports: en, zh-cn

▶ Run Code
js
var art = new Artplayer({
+});

lang ​

  • Type: String
  • Default: navigator.language.toLowerCase()

The default display language. Currently supported: en, zh-cn.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'en',
-});

More language settings

/start/i18n.html

i18n ​

  • Type: Object
  • Default: {}

Custom i18n configuration, which will be deeply merged with the built-in i18n

Add your language:

▶ Run Code
js
var art = new Artplayer({
+});

More Language Settings

/start/i18n.html

i18n ​

  • Type: Object
  • Default: {}

Custom i18n configuration. This configuration will be deeply merged with the built-in i18n.

Add your language:

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'your-lang',
@@ -364,7 +428,7 @@
             Play: 'Your Play'
         },
     },
-});

Modifying the existing language

▶ Run Code
js
var art = new Artplayer({
+});

Modify an existing language:

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     i18n: {
@@ -375,43 +439,43 @@
             Play: 'Your Play'
         },
     },
-});

More language settings

/start/i18n.html

lock ​

  • Type: Boolean
  • Default: false

Whether to display a lock button on mobile to hide the bottom control bar

▶ Run Code
js
var art = new Artplayer({
+});

More Language Settings

/start/i18n.html

lock ​

  • Type: Boolean
  • Default: false

Whether to display a lock button on mobile devices to hide the bottom control bar.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lock: true,
-});

gesture ​

  • Type: Boolean
  • Default: true

Whether to enable gesture events on video elements on mobile devices

▶ Run Code
js
var art = new Artplayer({
+});

gesture ​

  • Type: Boolean
  • Default: true

Whether to enable gesture events on the video element on mobile devices.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     gesture: false,
-});

fastForward ​

  • Type: Boolean
  • Default: false

Whether to add fast forward function by long pressing on the video on mobile devices

▶ Run Code
js
var art = new Artplayer({
+});

fastForward ​

  • Type: Boolean
  • Default: false

Whether to add a long-press video fast-forward feature on mobile devices.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     fastForward: true,
-});

autoPlayback ​

  • Type: Boolean
  • Default: false

Whether to use the automatic playback feature

▶ Run Code
js
var art = new Artplayer({
+});

autoPlayback ​

  • Type: Boolean
  • Default: false

Whether to use the automatic playback feature.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     id: 'your-url-id',
     autoPlayback: true,
-});

Warning

Because the player by default uses url as the key to cache the playback progress

But if the url of the same video is different, then you need to use id to identify the unique key of the video

autoOrientation ​

  • Type: Boolean
  • Default: false

Whether to rotate the player on mobile web pages in full screen according to the video size and the viewport dimensions

▶ Run Code
js
var art = new Artplayer({
+});

Note

By default, the player uses the url as the key to cache the playback progress.

However, if the same video has different urls, you need to use the id to identify the unique key for the video.

autoOrientation ​

  • Type: Boolean
  • Default: false

Whether to rotate the player during fullscreen mode on mobile web, based on the video dimensions and viewport size.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     autoOrientation: true,
-});

airplay ​

  • Type: Boolean
  • Default: false

Whether to display the airplay button, currently only some browsers support this feature

▶ Run Code
js
var art = new Artplayer({
+});

airplay ​

  • Type: Boolean
  • Default: false

Whether to display the airplay button. Currently, only some browsers support this feature.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     airplay: true,
-});

cssVar ​

  • Type: Object
  • Default: {}

Used to change built-in CSS variables

▶ Run Code
js
var art = new Artplayer({
+});

cssVar ​

  • Type: Object
  • Default: {}

Used to modify built-in CSS variables.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     cssVar: {
         //
     },
-});

Reference for cssVar syntax

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

The function can return a third-party HTMLCanvasElement or HTMLVideoElement, for example, it can proxy an existing video DOM element

▶ Run Code
js
var art = new Artplayer({
+});

CSS Variable Reference

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

The function can return a third-party HTMLCanvasElement or HTMLVideoElement. For example, it can proxy an existing video DOM element.

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     proxy: () => document.createElement('video')
-});
- +});
+ \ No newline at end of file diff --git a/docs/document/hashmap.json b/docs/document/hashmap.json index d09f3344b..67e156df0 100644 --- a/docs/document/hashmap.json +++ b/docs/document/hashmap.json @@ -1 +1 @@ -{"advanced_built-in.md":"B5ccy6gK","advanced_class.md":"Da3aE0pP","advanced_event.md":"mrsB0MsK","advanced_global.md":"C-56tmUD","advanced_plugin.md":"B3Pobmcq","advanced_property.md":"D59FnDH1","component_contextmenu.md":"ClKmcIKr","component_controls.md":"Cl62yW1F","component_layers.md":"Cys52VMi","component_setting.md":"BP5674ir","en_advanced_built-in.md":"CY71IZlq","en_advanced_class.md":"C3V-LDO3","en_advanced_event.md":"D5Yv5LYW","en_advanced_global.md":"BbhNIAMt","en_advanced_plugin.md":"hspsx5uD","en_advanced_property.md":"COS94_z7","en_component_contextmenu.md":"DgD64wIy","en_component_controls.md":"Bj2oItzY","en_component_layers.md":"BNGRBNoB","en_component_setting.md":"Dqvlpr4j","en_index.md":"CS_tThma","en_start_i18n.md":"CXVsjwvu","en_start_option.md":"6JX4hU8Q","index.md":"BiU-7WW0","plugin_danmuku.md":"oENZOFMk","start_i18n.md":"Dd9hEcJD","start_option.md":"B5CHO-We"} +{"advanced_built-in.md":"DiyRIcIA","advanced_class.md":"Da3aE0pP","advanced_event.md":"mrsB0MsK","advanced_global.md":"Bdw3azKs","advanced_plugin.md":"B3Pobmcq","advanced_property.md":"CA7GaeI3","component_contextmenu.md":"ClKmcIKr","component_controls.md":"Cl62yW1F","component_layers.md":"Cys52VMi","component_setting.md":"BP5674ir","en_advanced_built-in.md":"XdT81JC0","en_advanced_class.md":"BLyA7rxa","en_advanced_event.md":"CtQl1IYg","en_advanced_global.md":"D5Nz8wyo","en_advanced_plugin.md":"BOuMu80J","en_advanced_property.md":"urRMaqHe","en_component_contextmenu.md":"COLfX45a","en_component_controls.md":"BbQsn0wJ","en_component_layers.md":"CX93a7QS","en_component_setting.md":"C6o2AWtX","en_index.md":"C1_6xfSn","en_start_i18n.md":"B_wMV7AZ","en_start_option.md":"Bk4YXvof","index.md":"BfiYqSM4","plugin_danmuku.md":"B7E5dRUy","start_i18n.md":"CO8qytwE","start_option.md":"D52S8Ynf"} diff --git a/docs/document/index.html b/docs/document/index.html index 295724af6..5db4c5879 100644 --- a/docs/document/index.html +++ b/docs/document/index.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

安装使用 ​

安装 ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

使用 ​

html
<html>
+    
Skip to content

安装使用 ​

安装 ​

bash
npm install artplayer
bash
yarn add artplayer
bash
pnpm add artplayer
html
<script src="path/to/artplayer.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js
bash
https://unpkg.com/artplayer/dist/artplayer.js

使用 ​

html
<html>
     <head>
         <title>ArtPlayer Demo</title>
         <meta charset="UTF-8" />
@@ -44,7 +44,7 @@
           });
         </script>
     </body>
-</html>

提示

播放器的尺寸依赖于容器 container 的尺寸,所以你的容器 container 必须是有尺寸的

以下链接可以看到更多的使用例子

/packages/artplayer-template

Vue.js ​

vue
<template>
+</html>

提示

播放器的尺寸依赖于容器 container 的尺寸,所以你的容器 container 必须是有尺寸的

以下链接可以看到更多的使用例子

/packages/artplayer-template

Vue.js ​

vue
<template>
   <div ref="$container" />
 </template>
 
@@ -76,7 +76,7 @@
   art.value.destroy(false)
 })
 </script>
vue
<template>
-  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
+  <Artplayer :option="option" :style="style" @get-instance="getInstance" />
 </template>
 
 <script setup>
@@ -96,7 +96,7 @@
 function getInstance(art) {
   console.log(art)
 }
-</script>

Artplayer 非响应式:

在 Vue.js 里直接修改 option 是不会改变播放器的

React.js ​

jsx
import Artplayer from 'artplayer'
+</script>

Artplayer 非响应式:

在 Vue.js 里直接修改 option 是不会改变播放器的

React.js ​

jsx
import Artplayer from 'artplayer'
 import { useEffect, useRef } from 'react'
 
 export default function Player({ option, getInstance, ...rest }) {
@@ -179,7 +179,7 @@
 
 option.volume = 0.5;
 
-const art8 = new Artplayer(option);

古老的浏览器 ​

生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version

对于古老的浏览器,可以使用 artplayer.legacy.js 文件,可以兼容到:IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

假如你要兼容更古老的浏览器时,请修改以下配置然后自行构建:

构建配置:scripts/build.js

参考文档:browserslist

ECMAScript Module ​

从 5.2.6 开始,artplayer 和所有插件还会提供一个 ESM 版本的 mjs,如:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
+const art8 = new Artplayer(option);

古老的浏览器 ​

生产构建的 artplayer.js 只兼容最新一个主版本的 Chrome:last 1 Chrome version

对于古老的浏览器,可以使用 artplayer.legacy.js 文件,可以兼容到:IE 11

js
import Artplayer from 'artplayer/legacy'
bash
https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.legacy.js
bash
https://unpkg.com/artplayer/dist/artplayer.legacy.js

假如你要兼容更古老的浏览器时,请修改以下配置然后自行构建:

构建配置:scripts/build.js

参考文档:browserslist

ECMAScript Module ​

从 5.2.6 开始,artplayer 和所有插件还会提供一个 ESM 版本的 mjs,如:

  • artplayer/dist/artplayer.mjs
  • artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.mjs
html
<!DOCTYPE html>
 <html lang="en">
 
 <head>
@@ -237,7 +237,7 @@
         </script>
     </body>
 </html>

提示

你需要在引入 Artplayer 依赖前来修改它才会生效

- + \ No newline at end of file diff --git a/docs/document/plugin/danmuku.html b/docs/document/plugin/danmuku.html index 6f9cd87a7..69bb6c8b1 100644 --- a/docs/document/plugin/danmuku.html +++ b/docs/document/plugin/danmuku.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

弹幕库 ​

演示 ​

👉 查看完整演示

安装 ​

bash
npm install artplayer-plugin-danmuku
bash
yarn add artplayer-plugin-danmuku
bash
pnpm add artplayer-plugin-danmuku
html
<script src="path/to/artplayer-plugin-danmuku.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js
bash
https://unpkg.com/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js

弹幕结构 ​

每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数

js
{
+    
Skip to content

弹幕库 ​

演示 ​

👉 查看完整演示

安装 ​

bash
npm install artplayer-plugin-danmuku
bash
yarn add artplayer-plugin-danmuku
bash
pnpm add artplayer-plugin-danmuku
html
<script src="path/to/artplayer-plugin-danmuku.js"></script>

CDN ​

bash
https://cdn.jsdelivr.net/npm/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js
bash
https://unpkg.com/artplayer-plugin-danmuku/dist/artplayer-plugin-danmuku.js

弹幕结构 ​

每一个弹幕是一个对象,多个弹幕组成的数组就是弹幕库,通常只需要text就可以发送一个弹幕,其余都是非必要参数

js
{
     text: '', // 弹幕文本
     time: 10, // 弹幕时间, 默认为当前播放器时间
     mode: 0, // 弹幕模式: 0: 滚动(默认),1: 顶部,2: 底部
@@ -367,7 +367,7 @@
 art.on('artplayerPluginDanmuku:destroy', () => {
     console.info('弹幕销毁');
 });
- + \ No newline at end of file diff --git a/docs/document/start/i18n.html b/docs/document/start/i18n.html index bed6277b6..2409d60c5 100644 --- a/docs/document/start/i18n.html +++ b/docs/document/start/i18n.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,11 +23,11 @@ -
Skip to content

语言设置 ​

DANGER

鉴于捆绑的多国语言越来越多, 从 5.1.0 版本开始, artplayer.js 核心代码除了包含 简体中文 和 英文 外, 不再捆绑其它多国语言, 需要自行导入需要的语言。

WARNING

当无法匹配到语言时, 会默认显示英文, i18n 写法参考: artplayer/types/i18n.d.ts

默认语言 ​

默认语言有: en, zh-cn, 无需手动导入

js
var art = new Artplayer({
+    
Skip to content

语言设置 ​

DANGER

鉴于捆绑的多国语言越来越多, 从 5.1.0 版本开始, artplayer.js 核心代码除了包含 简体中文 和 英文 外, 不再捆绑其它多国语言, 需要自行导入需要的语言。

WARNING

当无法匹配到语言时, 会默认显示英文, i18n 写法参考: artplayer/types/i18n.d.ts

默认语言 ​

默认语言有: en, zh-cn, 无需手动导入

js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     lang: 'zh-cn', // or 'en'
-});

导入语言 ​

打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言

打包后的语言文件存放于: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
+});

导入语言 ​

打包前的语言文件存放于: artplayer/src/i18n/*.js, 欢迎来添加你的语言

打包后的语言文件存放于: artplayer/dist/i18n/*.js

js
import id from 'artplayer/i18n/id';
 import zhTw from 'artplayer/i18n/zh-tw';
 
 var art = new Artplayer({
@@ -75,7 +75,7 @@
         },
     },
 });
- + \ No newline at end of file diff --git a/docs/document/start/option.html b/docs/document/start/option.html index d77be3659..5e0d6966e 100644 --- a/docs/document/start/option.html +++ b/docs/document/start/option.html @@ -9,11 +9,11 @@ - + - + - + @@ -23,7 +23,7 @@ -
Skip to content

基础选项 ​

container ​

  • Type: String, Element
  • Default: #artplayer

播放器挂载的 DOM 容器

▶ Run Code
js
var art = new Artplayer({
+    
Skip to content

基础选项 ​

container ​

  • Type: String, Element
  • Default: #artplayer

播放器挂载的 DOM 容器

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app', 
     // container: document.querySelector('.artplayer-app'),
     url: '/assets/sample/video.mp4',
@@ -134,6 +134,10 @@
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     mutex: true,
+});

backdrop ​

  • Type: Boolean
  • Default: true

是否开启播放器 UI 的背景虚化效果。开启后,设置面板、右键菜单、音量条等浮层会应用 backdrop-filter 毛玻璃效果,看起来更通透,但在部分低性能设备或老旧浏览器上可能会有性能或兼容性问题。

▶ Run Code
js
var art = new Artplayer({
+    container: '.artplayer-app',
+    url: '/assets/sample/video.mp4',
+    backdrop: false, // 关闭毛玻璃效果
 });

fullscreen ​

  • Type: Boolean
  • Default: false

是否在底部控制栏里显示播放器 窗口全屏 按钮

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
@@ -234,7 +238,7 @@
             },
         },
     ],
-});

组件配置 请参考以下地址:

/component/contextmenu.html- Type:

controls ​

  • Type: Array
  • Default: []

初始化自定义的底部 控制栏

▶ Run Code
js
var art = new Artplayer({
+});

组件配置 请参考以下地址:

/component/contextmenu.html

controls ​

  • Type: Array
  • Default: []

初始化自定义的底部 控制栏

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     controls: [
@@ -325,7 +329,7 @@
             'font-size': '30px',
         },
     },
-});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false,'preload': 'metadata'}

更多视频属性,这些属性将直接写入视频元素里

▶ Run Code
js
var art = new Artplayer({
+});

moreVideoAttr ​

  • Type: Object
  • Default: {'controls': false, 'preload': 'metadata'}(Safari 中会自动调整为 preload: 'auto' 以提升加载体验)

更多视频属性,这些属性将直接写入视频元素里

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     moreVideoAttr: {
@@ -406,12 +410,12 @@
     cssVar: {
         //
     },
-});

proxy ​

  • Type: function
  • Default: undefined

函数可以返回一个第三方的 HTMLCanvasElement 或者 HTMLVideoElement,例如可以代理一个已经存在的 video dom元素

▶ Run Code
js
var art = new Artplayer({
+});

cssVar 写法参考

artplayer/types/cssVar.d.ts

proxy ​

  • Type: function
  • Default: undefined

函数可以返回一个第三方的 HTMLCanvasElement 或者 HTMLVideoElement,例如可以代理一个已经存在的 video dom元素

▶ Run Code
js
var art = new Artplayer({
     container: '.artplayer-app',
     url: '/assets/sample/video.mp4',
     proxy: () => document.createElement('video')
-});
- +});
+ \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index b9cc8d88b..82c3a2495 100644 --- a/docs/index.html +++ b/docs/index.html @@ -123,6 +123,9 @@ artplayer-proxy-canvas +
  • + artplayer-proxy-mediabunny +
    • Tools
    • diff --git a/docs/uncompiled/artplayer-proxy-mediabunny/index.js b/docs/uncompiled/artplayer-proxy-mediabunny/index.js new file mode 100644 index 000000000..ea997adb4 --- /dev/null +++ b/docs/uncompiled/artplayer-proxy-mediabunny/index.js @@ -0,0 +1,16613 @@ +// modules are defined as an array +// [ module function, map of requires ] +// +// map of requires is short require name -> numeric require +// +// anything defined in a previous bundle is accessed via the +// orig method which is the require for previous bundles + +(function ( + modules, + entry, + mainEntry, + parcelRequireName, + externals, + distDir, + publicUrl, + devServer +) { + /* eslint-disable no-undef */ + var globalObject = + typeof globalThis !== 'undefined' + ? globalThis + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : {}; + /* eslint-enable no-undef */ + + // Save the require from previous bundle to this closure if any + var previousRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + + var importMap = previousRequire.i || {}; + var cache = previousRequire.cache || {}; + // Do not use `require` to prevent Webpack from trying to bundle this call + var nodeRequire = + typeof module !== 'undefined' && + typeof module.require === 'function' && + module.require.bind(module); + + function newRequire(name, jumped) { + if (!cache[name]) { + if (!modules[name]) { + if (externals[name]) { + return externals[name]; + } + // if we cannot find the module within our internal map or + // cache jump to the current global require ie. the last bundle + // that was added to the page. + var currentRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + if (!jumped && currentRequire) { + return currentRequire(name, true); + } + + // If there are other bundles on this page the require from the + // previous one is saved to 'previousRequire'. Repeat this as + // many times as there are bundles until the module is found or + // we exhaust the require chain. + if (previousRequire) { + return previousRequire(name, true); + } + + // Try the node require function if it exists. + if (nodeRequire && typeof name === 'string') { + return nodeRequire(name); + } + + var err = new Error("Cannot find module '" + name + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + + localRequire.resolve = resolve; + localRequire.cache = {}; + + var module = (cache[name] = new newRequire.Module(name)); + + modules[name][0].call( + module.exports, + localRequire, + module, + module.exports, + globalObject + ); + } + + return cache[name].exports; + + function localRequire(x) { + var res = localRequire.resolve(x); + return res === false ? {} : newRequire(res); + } + + function resolve(x) { + var id = modules[name][1][x]; + return id != null ? id : x; + } + } + + function Module(moduleName) { + this.id = moduleName; + this.bundle = newRequire; + this.require = nodeRequire; + this.exports = {}; + } + + newRequire.isParcelRequire = true; + newRequire.Module = Module; + newRequire.modules = modules; + newRequire.cache = cache; + newRequire.parent = previousRequire; + newRequire.distDir = distDir; + newRequire.publicUrl = publicUrl; + newRequire.devServer = devServer; + newRequire.i = importMap; + newRequire.register = function (id, exports) { + modules[id] = [ + function (require, module) { + module.exports = exports; + }, + {}, + ]; + }; + + // Only insert newRequire.load when it is actually used. + // The code in this file is linted against ES5, so dynamic import is not allowed. + // INSERT_LOAD_HERE + + Object.defineProperty(newRequire, 'root', { + get: function () { + return globalObject[parcelRequireName]; + }, + }); + + globalObject[parcelRequireName] = newRequire; + + for (var i = 0; i < entry.length; i++) { + newRequire(entry[i]); + } + + if (mainEntry) { + // Expose entry point to Node, AMD or browser globals + // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js + var mainExports = newRequire(mainEntry); + + // CommonJS + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = mainExports; + + // RequireJS + } else if (typeof define === 'function' && define.amd) { + define(function () { + return mainExports; + }); + } + } +})({"gqawh":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>artplayerProxyMediabunny); +var _canvasProxyJs = require("./proxy/canvasProxy.js"); +var _canvasProxyJsDefault = parcelHelpers.interopDefault(_canvasProxyJs); +function artplayerProxyMediabunny(option = {}) { + return (art)=>{ + return (0, _canvasProxyJsDefault.default)(art, option); + }; +} +if (typeof window !== 'undefined') window.artplayerProxyMediabunny = artplayerProxyMediabunny; + +},{"./proxy/canvasProxy.js":"gycKW","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"gycKW":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>createCanvasProxy); +var _mediabunnyVideoShimJs = require("../shim/mediabunnyVideoShim.js"); +var _mediabunnyVideoShimJsDefault = parcelHelpers.interopDefault(_mediabunnyVideoShimJs); +function createCanvasProxy(art, option) { + const { constructor } = art; + const { createElement } = constructor.utils; + const canvas = createElement('canvas'); + const ctx = canvas.getContext('2d'); + const shim = (0, _mediabunnyVideoShimJsDefault.default)({ + art, + canvas, + ctx, + option + }); + const originalCanvasMethods = {}; + for(const prop in canvas)if (typeof canvas[prop] === 'function') originalCanvasMethods[prop] = canvas[prop].bind(canvas); + for(const prop in shim)if (!(prop in canvas)) Object.defineProperty(canvas, prop, { + get () { + const value = shim[prop]; + return typeof value === 'function' ? value.bind(shim) : value; + }, + set (v) { + shim[prop] = v; + }, + configurable: true, + enumerable: true + }); + for(const prop in originalCanvasMethods)canvas[prop] = (...args)=>originalCanvasMethods[prop](...args); + art.on('destroy', ()=>{ + shim.destroy(); + }); + function resize() { + const player = art.template?.$player; + if (!player || art.option.autoSize) return; + Object.assign(canvas.style, { + width: '100%', + height: '100%', + objectFit: 'contain' + }); + } + art.on('resize', resize); + art.on('video:loadedmetadata', resize); + return canvas; +} + +},{"../shim/mediabunnyVideoShim.js":"bWh4b","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"bWh4b":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>createMediabunnyVideoShim); +var _mediabunnyEngineJs = require("../engine/mediabunnyEngine.js"); +var _mediabunnyEngineJsDefault = parcelHelpers.interopDefault(_mediabunnyEngineJs); +var _clampJs = require("../utils/clamp.js"); +var _clampJsDefault = parcelHelpers.interopDefault(_clampJs); +var _videoEventsJs = require("./videoEvents.js"); +function createMediabunnyVideoShim({ art, canvas, ctx, option }) { + const events = (0, _videoEventsJs.createVideoEventTarget)(); + const engine = (0, _mediabunnyEngineJsDefault.default)({ + canvas, + ctx, + events, + option + }); + let _src = null; + let _volume = option.volume ?? 0.7; + let _muted = !!option.muted; + let _playbackRate = 1; + engine.setVolume(_volume, _muted); + const { events: artEvents } = art.constructor.config; + artEvents.forEach((name)=>{ + events.addEventListener(name, (e)=>{ + art.emit(`video:${e.type}`, e); + }); + }); + const shim = { + addEventListener: events.addEventListener, + removeEventListener: events.removeEventListener, + get src () { + return _src; + }, + set src (v){ + _src = v; + if (v) engine.load(v); + }, + get currentTime () { + return engine.currentTime; + }, + set currentTime (t){ + engine.seek(Number(t) || 0); + }, + get duration () { + return engine.duration; + }, + get buffered () { + const duration = engine.duration; + if (!duration || Number.isNaN(duration)) return { + length: 0, + start: ()=>0, + end: ()=>0 + }; + return { + length: 1, + start: ()=>0, + end: ()=>duration + }; + }, + get played () { + const duration = engine.duration; + const currentTime = engine.currentTime; + if (!duration || Number.isNaN(duration) || currentTime <= 0) return { + length: 0, + start: ()=>0, + end: ()=>0 + }; + return { + length: 1, + start: ()=>0, + end: ()=>currentTime + }; + }, + get paused () { + return engine.paused; + }, + get playing () { + return !engine.paused && !engine.ended; + }, + get ended () { + return engine.ended; + }, + get readyState () { + return engine.readyState; + }, + get networkState () { + return engine.networkState; + }, + get error () { + return engine.error; + }, + get seeking () { + return engine.seeking; + }, + get seekable () { + const duration = engine.duration; + if (!duration || Number.isNaN(duration)) return { + length: 0, + start: ()=>0, + end: ()=>0 + }; + return { + length: 1, + start: ()=>0, + end: ()=>duration + }; + }, + get playbackRate () { + return _playbackRate; + }, + set playbackRate (v){ + const rate = Number(v); + if (Number.isNaN(rate) || rate <= 0) return; + _playbackRate = rate; + engine.setPlaybackRate(rate); + events.emit('ratechange'); + }, + get volume () { + return _volume; + }, + set volume (v){ + _volume = (0, _clampJsDefault.default)(v, 0, 1); + _muted = false; + engine.setVolume(_volume, _muted); + events.emit('volumechange'); + }, + get muted () { + return _muted; + }, + set muted (v){ + _muted = !!v; + engine.setVolume(_volume, _muted); + events.emit('volumechange'); + }, + play () { + return engine.play(); + }, + pause () { + engine.pause(); + }, + load () { + if (_src) engine.load(_src); + }, + destroy () { + engine.destroy(); + }, + get videoWidth () { + return engine.videoWidth; + }, + get videoHeight () { + return engine.videoHeight; + }, + get playsInline () { + return true; + }, + set playsInline (v){}, + get autoplay () { + return option.autoplay || false; + }, + set autoplay (v){}, + get loop () { + return option.loop || false; + }, + set loop (v){}, + get controls () { + return false; + }, + set controls (v){}, + get crossOrigin () { + return option.crossOrigin || ''; + }, + set crossOrigin (v){}, + get currentSrc () { + return _src; + }, + get poster () { + return option.poster || ''; + }, + set poster (v){ + option.poster = v; + }, + get preload () { + return 'auto'; + }, + set preload (v){}, + get defaultMuted () { + return false; + }, + set defaultMuted (v){}, + get defaultPlaybackRate () { + return 1; + }, + set defaultPlaybackRate (v){}, + canPlayType (_type) { + return 'maybe'; + }, + getBoundingClientRect () { + return canvas.getBoundingClientRect(); + }, + requestVideoFrameCallback (callback) { + const id = requestAnimationFrame((time)=>{ + callback(time, { + presentationTime: engine.currentTime, + expectedDisplayTime: time + 16.6, + width: engine.videoWidth, + height: engine.videoHeight, + mediaTime: engine.currentTime, + presentedFrames: 0, + processingDuration: 0, + captureTime: time, + receiveTime: time, + rtpTimestamp: 0 + }); + }); + return id; + }, + cancelVideoFrameCallback (id) { + cancelAnimationFrame(id); + }, + setAttribute (name, value) { + if (name === 'src') this.src = value; + else if (name === 'autoplay') this.autoplay = value; + else if (name === 'loop') this.loop = value; + else if (name === 'muted') this.muted = true; + else canvas.setAttribute(name, value); + } + }; + if (option.source) shim.src = option.source; + else if (art.option?.url) shim.src = art.option.url; + return shim; +} + +},{"../engine/mediabunnyEngine.js":"18g6U","../utils/clamp.js":"78ov3","./videoEvents.js":"9BYHB","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"18g6U":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>createMediabunnyEngine); +var _audioEngineJs = require("./audioEngine.js"); +var _audioEngineJsDefault = parcelHelpers.interopDefault(_audioEngineJs); +var _videoEngineJs = require("./videoEngine.js"); +var _videoEngineJsDefault = parcelHelpers.interopDefault(_videoEngineJs); +function createMediabunnyEngine({ canvas, ctx, events, option = {} }) { + const defaults = { + timeupdateInterval: 250, + avSyncTolerance: 0.12, + loadTimeout: 12000, + dropLateFrames: false, + poster: '' + }; + const audio = (0, _audioEngineJsDefault.default)(events); + const video = (0, _videoEngineJsDefault.default)({ + canvas, + ctx, + events, + timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval, + avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance, + dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames, + poster: option.poster ?? defaults.poster, + preflightRange: option.preflightRange ?? false + }); + let _paused = true; + let _ended = false; + let _readyState = 0; + let _networkState = 0; + let _error = null; + let _seeking = false; + let loadSeq = 0; + events.addEventListener?.('ended', ()=>{ + _ended = true; + _paused = true; + }); + async function load(src) { + const id = ++loadSeq; + pause(); + _ended = false; + _error = null; + _networkState = 2; + _readyState = 0; + setTimeout(()=>events.emit('waiting'), 0); + setTimeout(()=>events.emit('loadstart'), 0); + const loadTimeout = Number.isFinite(option.loadTimeout) ? option.loadTimeout : defaults.loadTimeout; + let timer = null; + const timeoutPromise = loadTimeout > 0 ? new Promise((_, reject)=>{ + timer = setTimeout(()=>reject(new Error('Load timeout')), loadTimeout); + }) : null; + const loadTask = (async ()=>{ + try { + let videoMetadataLoaded = false; + let audioMetadataLoaded = false; + const checkMetadata = ()=>{ + if (videoMetadataLoaded && audioMetadataLoaded) { + _readyState = 1; + events.emit('loadedmetadata'); + events.emit('durationchange'); + } + }; + const p1 = video.load(src, ()=>{ + if (id !== loadSeq) return; + videoMetadataLoaded = true; + checkMetadata(); + }); + const p2 = audio.load(src, ()=>{ + if (id !== loadSeq) return; + audioMetadataLoaded = true; + checkMetadata(); + }); + await Promise.all([ + p1, + p2 + ]); + if (id !== loadSeq) return; + _readyState = 4; + _networkState = 1; + events.emit('loadeddata'); + events.emit('canplay'); + events.emit('canplaythrough'); + } catch (err) { + if (id !== loadSeq) return; + _error = { + code: 4, + message: err.message + }; + _networkState = 3; + events.emit('error'); + console.error(err); + } finally{ + if (timer) clearTimeout(timer); + } + })(); + if (timeoutPromise) try { + await Promise.race([ + loadTask, + timeoutPromise + ]); + } catch (err) { + if (id !== loadSeq) return; + loadSeq++; + _error = { + code: 4, + message: err.message + }; + _networkState = 3; + events.emit('error'); + } + else await loadTask; + } + async function play() { + if (!_paused) return; + _paused = false; + await audio.play(); + video.start(audio); + events.emit('play'); + events.emit('playing'); + } + function pause() { + if (_paused) return; + _paused = true; + audio.pause(); + video.stop(); + events.emit('pause'); + } + async function seek(time) { + const shouldResume = !_paused; + _seeking = true; + events.emit('seeking'); + events.emit('waiting'); + pause(); + await audio.seek(time); + await video.seek(time); + _seeking = false; + events.emit('seeked'); + if (shouldResume && !_ended) await play(); + } + function destroy() { + pause(); + audio.destroy(); + video.destroy(); + } + return { + load, + play, + pause, + seek, + destroy, + setVolume: audio.setVolume, + setPlaybackRate (rate) { + audio.setPlaybackRate(rate); + video.setPlaybackRate(rate); + }, + get currentTime () { + return audio.currentTime; + }, + get duration () { + return audio.duration || video.duration; + }, + get paused () { + return _paused; + }, + get seeking () { + return _seeking; + }, + get ended () { + return _ended; + }, + get readyState () { + return _readyState; + }, + get networkState () { + return _networkState; + }, + get error () { + return _error; + }, + get videoWidth () { + return video.width; + }, + get videoHeight () { + return video.height; + } + }; +} + +},{"./audioEngine.js":"5E7zo","./videoEngine.js":"iSVKr","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"5E7zo":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>createAudioEngine); +var _mediabunny = require("mediabunny"); +function createAudioEngine(events) { + let input = null; + let audioSink = null; + let audioContext = null; + let gainNode = null; + let audioIterator = null; + let audioContextStartTime = 0; + let playbackTimeAtStart = 0; + let latestScheduledEndTime = 0; + let _duration = Number.NaN; + let _paused = true; + let _volume = 0.7; + let _muted = false; + let _playbackRate = 1; + let asyncId = 0; + const queuedNodes = new Set(); + function getCurrentTime() { + if (_paused) return playbackTimeAtStart; + return (audioContext.currentTime - audioContextStartTime) * _playbackRate + playbackTimeAtStart; + } + function updateGain() { + if (!gainNode) return; + const v = _muted ? 0 : _volume; + gainNode.gain.value = v * v; + } + function ensureAudioContext(sampleRate) { + if (audioContext) return; + const AudioContext = window.AudioContext || window.webkitAudioContext; + try { + audioContext = new AudioContext({ + sampleRate + }); + } catch { + audioContext = new AudioContext(); + } + gainNode = audioContext.createGain(); + gainNode.connect(audioContext.destination); + updateGain(); + } + function stopQueuedNodes() { + for (const node of queuedNodes)node.stop(); + queuedNodes.clear(); + } + async function stopIterator() { + await audioIterator?.return(); + audioIterator = null; + } + function normalizeSource(src) { + if (typeof src === 'string') return new (0, _mediabunny.UrlSource)(src); + if (src instanceof Blob) return new (0, _mediabunny.BlobSource)(src); + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) return new (0, _mediabunny.ReadableStreamSource)(src); + return src; + } + async function load(src, onMetadata) { + asyncId++; + const id = asyncId; + await stopIterator(); + stopQueuedNodes(); + _paused = true; + playbackTimeAtStart = 0; + audioContextStartTime = 0; + const source = normalizeSource(src); + if (!source) return; + input = new (0, _mediabunny.Input)({ + source, + formats: (0, _mediabunny.ALL_FORMATS) + }); + _duration = await input.computeDuration(); + if (id !== asyncId) return; + const audioTrack = await input.getPrimaryAudioTrack(); + if (!audioTrack) { + audioSink = null; + ensureAudioContext(); + if (onMetadata) onMetadata(); + return; + } + if (audioTrack.codec === null || !await audioTrack.canDecode()) { + audioSink = null; + ensureAudioContext(); + if (onMetadata) onMetadata(); + return; + } + ensureAudioContext(audioTrack.sampleRate); + audioSink = new (0, _mediabunny.AudioBufferSink)(audioTrack); + if (onMetadata) onMetadata(); + } + async function runIterator(localId) { + if (!audioSink) return; + await stopIterator(); + audioIterator = audioSink.buffers(getCurrentTime()); + while(true){ + if (localId !== asyncId) return; + if (_paused) return; + const nextPromise = audioIterator.next(); + const checkStarvation = setInterval(()=>{ + if (localId !== asyncId || _paused) { + clearInterval(checkStarvation); + return; + } + if (audioContext.state === 'running' && audioContext.currentTime >= latestScheduledEndTime - 0.2) { + audioContext.suspend(); + events.emit('waiting'); + } + }, 50); + let result; + try { + result = await nextPromise; + } catch (e) { + console.error(e); + break; + } finally{ + clearInterval(checkStarvation); + } + if (localId !== asyncId) return; + if (_paused) return; + if (audioContext.state === 'suspended') { + await audioContext.resume(); + events.emit('canplay'); + events.emit('playing'); + } + if (result.done) break; + const { buffer, timestamp } = result.value; + const node = audioContext.createBufferSource(); + node.buffer = buffer; + node.connect(gainNode); + node.playbackRate.value = _playbackRate; + const startAt = audioContextStartTime + (timestamp - playbackTimeAtStart) / _playbackRate; + const duration = buffer.duration; + const endAt = startAt + duration / _playbackRate; + if (endAt > latestScheduledEndTime) latestScheduledEndTime = endAt; + if (startAt >= audioContext.currentTime) node.start(startAt); + else node.start(audioContext.currentTime, (audioContext.currentTime - startAt) * _playbackRate); + queuedNodes.add(node); + node.onended = ()=>queuedNodes.delete(node); + } + } + async function play() { + if (!_paused) return; + if (!audioContext) ensureAudioContext(); + if (audioContext.state === 'suspended') await audioContext.resume(); + audioContextStartTime = audioContext.currentTime; + latestScheduledEndTime = audioContextStartTime; + _paused = false; + asyncId++; + runIterator(asyncId); + } + function pause() { + if (_paused) return; + playbackTimeAtStart = getCurrentTime(); + _paused = true; + stopIterator(); + stopQueuedNodes(); + } + async function seek(time) { + playbackTimeAtStart = Math.max(0, time); + audioContextStartTime = audioContext.currentTime; + latestScheduledEndTime = audioContextStartTime; + asyncId++; + if (!_paused) runIterator(asyncId); + } + function destroy() { + asyncId++; + pause(); + audioContext?.close(); + audioContext = null; + input = null; + audioSink = null; + } + return { + load, + play, + pause, + seek, + destroy, + setVolume (v, muted) { + _volume = v; + _muted = muted; + updateGain(); + }, + setPlaybackRate (rate) { + if (rate === _playbackRate) return; + if (!_paused) { + playbackTimeAtStart = getCurrentTime(); + audioContextStartTime = audioContext.currentTime; + } + _playbackRate = rate; + if (!_paused) { + asyncId++; + runIterator(asyncId); + } + }, + get currentTime () { + return getCurrentTime(); + }, + get duration () { + return _duration; + }, + get paused () { + return _paused; + } + }; +} + +},{"mediabunny":"6p2EH","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"6p2EH":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ /// +/// +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Output", ()=>(0, _outputJs.Output)); +parcelHelpers.export(exports, "OutputFormat", ()=>(0, _outputFormatJs.OutputFormat)); +parcelHelpers.export(exports, "AdtsOutputFormat", ()=>(0, _outputFormatJs.AdtsOutputFormat)); +parcelHelpers.export(exports, "FlacOutputFormat", ()=>(0, _outputFormatJs.FlacOutputFormat)); +parcelHelpers.export(exports, "IsobmffOutputFormat", ()=>(0, _outputFormatJs.IsobmffOutputFormat)); +parcelHelpers.export(exports, "MkvOutputFormat", ()=>(0, _outputFormatJs.MkvOutputFormat)); +parcelHelpers.export(exports, "MovOutputFormat", ()=>(0, _outputFormatJs.MovOutputFormat)); +parcelHelpers.export(exports, "Mp3OutputFormat", ()=>(0, _outputFormatJs.Mp3OutputFormat)); +parcelHelpers.export(exports, "Mp4OutputFormat", ()=>(0, _outputFormatJs.Mp4OutputFormat)); +parcelHelpers.export(exports, "OggOutputFormat", ()=>(0, _outputFormatJs.OggOutputFormat)); +parcelHelpers.export(exports, "WavOutputFormat", ()=>(0, _outputFormatJs.WavOutputFormat)); +parcelHelpers.export(exports, "WebMOutputFormat", ()=>(0, _outputFormatJs.WebMOutputFormat)); +parcelHelpers.export(exports, "MediaSource", ()=>(0, _mediaSourceJs.MediaSource)); +parcelHelpers.export(exports, "VideoSource", ()=>(0, _mediaSourceJs.VideoSource)); +parcelHelpers.export(exports, "AudioSource", ()=>(0, _mediaSourceJs.AudioSource)); +parcelHelpers.export(exports, "SubtitleSource", ()=>(0, _mediaSourceJs.SubtitleSource)); +parcelHelpers.export(exports, "AudioBufferSource", ()=>(0, _mediaSourceJs.AudioBufferSource)); +parcelHelpers.export(exports, "AudioSampleSource", ()=>(0, _mediaSourceJs.AudioSampleSource)); +parcelHelpers.export(exports, "CanvasSource", ()=>(0, _mediaSourceJs.CanvasSource)); +parcelHelpers.export(exports, "EncodedAudioPacketSource", ()=>(0, _mediaSourceJs.EncodedAudioPacketSource)); +parcelHelpers.export(exports, "EncodedVideoPacketSource", ()=>(0, _mediaSourceJs.EncodedVideoPacketSource)); +parcelHelpers.export(exports, "MediaStreamAudioTrackSource", ()=>(0, _mediaSourceJs.MediaStreamAudioTrackSource)); +parcelHelpers.export(exports, "MediaStreamVideoTrackSource", ()=>(0, _mediaSourceJs.MediaStreamVideoTrackSource)); +parcelHelpers.export(exports, "TextSubtitleSource", ()=>(0, _mediaSourceJs.TextSubtitleSource)); +parcelHelpers.export(exports, "VideoSampleSource", ()=>(0, _mediaSourceJs.VideoSampleSource)); +parcelHelpers.export(exports, "VIDEO_CODECS", ()=>(0, _codecJs.VIDEO_CODECS)); +parcelHelpers.export(exports, "AUDIO_CODECS", ()=>(0, _codecJs.AUDIO_CODECS)); +parcelHelpers.export(exports, "PCM_AUDIO_CODECS", ()=>(0, _codecJs.PCM_AUDIO_CODECS)); +parcelHelpers.export(exports, "NON_PCM_AUDIO_CODECS", ()=>(0, _codecJs.NON_PCM_AUDIO_CODECS)); +parcelHelpers.export(exports, "SUBTITLE_CODECS", ()=>(0, _codecJs.SUBTITLE_CODECS)); +parcelHelpers.export(exports, "canEncode", ()=>(0, _encodeJs.canEncode)); +parcelHelpers.export(exports, "canEncodeVideo", ()=>(0, _encodeJs.canEncodeVideo)); +parcelHelpers.export(exports, "canEncodeAudio", ()=>(0, _encodeJs.canEncodeAudio)); +parcelHelpers.export(exports, "canEncodeSubtitles", ()=>(0, _encodeJs.canEncodeSubtitles)); +parcelHelpers.export(exports, "getEncodableCodecs", ()=>(0, _encodeJs.getEncodableCodecs)); +parcelHelpers.export(exports, "getEncodableVideoCodecs", ()=>(0, _encodeJs.getEncodableVideoCodecs)); +parcelHelpers.export(exports, "getEncodableAudioCodecs", ()=>(0, _encodeJs.getEncodableAudioCodecs)); +parcelHelpers.export(exports, "getEncodableSubtitleCodecs", ()=>(0, _encodeJs.getEncodableSubtitleCodecs)); +parcelHelpers.export(exports, "getFirstEncodableVideoCodec", ()=>(0, _encodeJs.getFirstEncodableVideoCodec)); +parcelHelpers.export(exports, "getFirstEncodableAudioCodec", ()=>(0, _encodeJs.getFirstEncodableAudioCodec)); +parcelHelpers.export(exports, "getFirstEncodableSubtitleCodec", ()=>(0, _encodeJs.getFirstEncodableSubtitleCodec)); +parcelHelpers.export(exports, "Quality", ()=>(0, _encodeJs.Quality)); +parcelHelpers.export(exports, "QUALITY_VERY_LOW", ()=>(0, _encodeJs.QUALITY_VERY_LOW)); +parcelHelpers.export(exports, "QUALITY_LOW", ()=>(0, _encodeJs.QUALITY_LOW)); +parcelHelpers.export(exports, "QUALITY_MEDIUM", ()=>(0, _encodeJs.QUALITY_MEDIUM)); +parcelHelpers.export(exports, "QUALITY_HIGH", ()=>(0, _encodeJs.QUALITY_HIGH)); +parcelHelpers.export(exports, "QUALITY_VERY_HIGH", ()=>(0, _encodeJs.QUALITY_VERY_HIGH)); +parcelHelpers.export(exports, "Target", ()=>(0, _targetJs.Target)); +parcelHelpers.export(exports, "BufferTarget", ()=>(0, _targetJs.BufferTarget)); +parcelHelpers.export(exports, "FilePathTarget", ()=>(0, _targetJs.FilePathTarget)); +parcelHelpers.export(exports, "NullTarget", ()=>(0, _targetJs.NullTarget)); +parcelHelpers.export(exports, "StreamTarget", ()=>(0, _targetJs.StreamTarget)); +parcelHelpers.export(exports, "ALL_TRACK_TYPES", ()=>(0, _outputJs.ALL_TRACK_TYPES)); +parcelHelpers.export(exports, "Source", ()=>(0, _sourceJs.Source)); +parcelHelpers.export(exports, "BlobSource", ()=>(0, _sourceJs.BlobSource)); +parcelHelpers.export(exports, "BufferSource", ()=>(0, _sourceJs.BufferSource)); +parcelHelpers.export(exports, "FilePathSource", ()=>(0, _sourceJs.FilePathSource)); +parcelHelpers.export(exports, "StreamSource", ()=>(0, _sourceJs.StreamSource)); +parcelHelpers.export(exports, "ReadableStreamSource", ()=>(0, _sourceJs.ReadableStreamSource)); +parcelHelpers.export(exports, "UrlSource", ()=>(0, _sourceJs.UrlSource)); +parcelHelpers.export(exports, "InputFormat", ()=>(0, _inputFormatJs.InputFormat)); +parcelHelpers.export(exports, "AdtsInputFormat", ()=>(0, _inputFormatJs.AdtsInputFormat)); +parcelHelpers.export(exports, "IsobmffInputFormat", ()=>(0, _inputFormatJs.IsobmffInputFormat)); +parcelHelpers.export(exports, "MatroskaInputFormat", ()=>(0, _inputFormatJs.MatroskaInputFormat)); +parcelHelpers.export(exports, "Mp3InputFormat", ()=>(0, _inputFormatJs.Mp3InputFormat)); +parcelHelpers.export(exports, "Mp4InputFormat", ()=>(0, _inputFormatJs.Mp4InputFormat)); +parcelHelpers.export(exports, "OggInputFormat", ()=>(0, _inputFormatJs.OggInputFormat)); +parcelHelpers.export(exports, "QuickTimeInputFormat", ()=>(0, _inputFormatJs.QuickTimeInputFormat)); +parcelHelpers.export(exports, "WaveInputFormat", ()=>(0, _inputFormatJs.WaveInputFormat)); +parcelHelpers.export(exports, "WebMInputFormat", ()=>(0, _inputFormatJs.WebMInputFormat)); +parcelHelpers.export(exports, "FlacInputFormat", ()=>(0, _inputFormatJs.FlacInputFormat)); +parcelHelpers.export(exports, "ALL_FORMATS", ()=>(0, _inputFormatJs.ALL_FORMATS)); +parcelHelpers.export(exports, "ADTS", ()=>(0, _inputFormatJs.ADTS)); +parcelHelpers.export(exports, "MATROSKA", ()=>(0, _inputFormatJs.MATROSKA)); +parcelHelpers.export(exports, "MP3", ()=>(0, _inputFormatJs.MP3)); +parcelHelpers.export(exports, "MP4", ()=>(0, _inputFormatJs.MP4)); +parcelHelpers.export(exports, "OGG", ()=>(0, _inputFormatJs.OGG)); +parcelHelpers.export(exports, "QTFF", ()=>(0, _inputFormatJs.QTFF)); +parcelHelpers.export(exports, "WAVE", ()=>(0, _inputFormatJs.WAVE)); +parcelHelpers.export(exports, "WEBM", ()=>(0, _inputFormatJs.WEBM)); +parcelHelpers.export(exports, "FLAC", ()=>(0, _inputFormatJs.FLAC)); +parcelHelpers.export(exports, "Input", ()=>(0, _inputJs.Input)); +parcelHelpers.export(exports, "InputDisposedError", ()=>(0, _inputJs.InputDisposedError)); +parcelHelpers.export(exports, "InputTrack", ()=>(0, _inputTrackJs.InputTrack)); +parcelHelpers.export(exports, "InputVideoTrack", ()=>(0, _inputTrackJs.InputVideoTrack)); +parcelHelpers.export(exports, "InputAudioTrack", ()=>(0, _inputTrackJs.InputAudioTrack)); +parcelHelpers.export(exports, "EncodedPacket", ()=>(0, _packetJs.EncodedPacket)); +parcelHelpers.export(exports, "AudioSample", ()=>(0, _sampleJs.AudioSample)); +parcelHelpers.export(exports, "VideoSample", ()=>(0, _sampleJs.VideoSample)); +parcelHelpers.export(exports, "AudioBufferSink", ()=>(0, _mediaSinkJs.AudioBufferSink)); +parcelHelpers.export(exports, "AudioSampleSink", ()=>(0, _mediaSinkJs.AudioSampleSink)); +parcelHelpers.export(exports, "BaseMediaSampleSink", ()=>(0, _mediaSinkJs.BaseMediaSampleSink)); +parcelHelpers.export(exports, "CanvasSink", ()=>(0, _mediaSinkJs.CanvasSink)); +parcelHelpers.export(exports, "EncodedPacketSink", ()=>(0, _mediaSinkJs.EncodedPacketSink)); +parcelHelpers.export(exports, "VideoSampleSink", ()=>(0, _mediaSinkJs.VideoSampleSink)); +parcelHelpers.export(exports, "Conversion", ()=>(0, _conversionJs.Conversion)); +parcelHelpers.export(exports, "CustomVideoDecoder", ()=>(0, _customCoderJs.CustomVideoDecoder)); +parcelHelpers.export(exports, "CustomVideoEncoder", ()=>(0, _customCoderJs.CustomVideoEncoder)); +parcelHelpers.export(exports, "CustomAudioDecoder", ()=>(0, _customCoderJs.CustomAudioDecoder)); +parcelHelpers.export(exports, "CustomAudioEncoder", ()=>(0, _customCoderJs.CustomAudioEncoder)); +parcelHelpers.export(exports, "registerDecoder", ()=>(0, _customCoderJs.registerDecoder)); +parcelHelpers.export(exports, "registerEncoder", ()=>(0, _customCoderJs.registerEncoder)); +parcelHelpers.export(exports, "RichImageData", ()=>(0, _metadataJs.RichImageData)) // 🐡🦔 +; +parcelHelpers.export(exports, "AttachedFile", ()=>(0, _metadataJs.AttachedFile)); +var _outputJs = require("./output.js"); +var _outputFormatJs = require("./output-format.js"); +var _mediaSourceJs = require("./media-source.js"); +var _codecJs = require("./codec.js"); +var _encodeJs = require("./encode.js"); +var _targetJs = require("./target.js"); +var _sourceJs = require("./source.js"); +var _inputFormatJs = require("./input-format.js"); +var _inputJs = require("./input.js"); +var _inputTrackJs = require("./input-track.js"); +var _packetJs = require("./packet.js"); +var _sampleJs = require("./sample.js"); +var _mediaSinkJs = require("./media-sink.js"); +var _conversionJs = require("./conversion.js"); +var _customCoderJs = require("./custom-coder.js"); +var _metadataJs = require("./metadata.js"); + +},{"./output.js":false,"./output-format.js":false,"./media-source.js":false,"./codec.js":false,"./encode.js":false,"./target.js":false,"./source.js":"99VTc","./input-format.js":"fr7dQ","./input.js":"4IqVo","./input-track.js":false,"./packet.js":false,"./sample.js":false,"./media-sink.js":"6Ym7M","./conversion.js":false,"./custom-coder.js":false,"./metadata.js":false,"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"4oSIO":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "VIDEO_CODECS", ()=>VIDEO_CODECS); +parcelHelpers.export(exports, "PCM_AUDIO_CODECS", ()=>PCM_AUDIO_CODECS); +parcelHelpers.export(exports, "NON_PCM_AUDIO_CODECS", ()=>NON_PCM_AUDIO_CODECS); +parcelHelpers.export(exports, "AUDIO_CODECS", ()=>AUDIO_CODECS); +parcelHelpers.export(exports, "SUBTITLE_CODECS", ()=>SUBTITLE_CODECS); +parcelHelpers.export(exports, "VP9_LEVEL_TABLE", ()=>VP9_LEVEL_TABLE); +parcelHelpers.export(exports, "buildVideoCodecString", ()=>buildVideoCodecString); +parcelHelpers.export(exports, "generateVp9CodecConfigurationFromCodecString", ()=>generateVp9CodecConfigurationFromCodecString); +parcelHelpers.export(exports, "generateAv1CodecConfigurationFromCodecString", ()=>generateAv1CodecConfigurationFromCodecString); +parcelHelpers.export(exports, "extractVideoCodecString", ()=>extractVideoCodecString); +parcelHelpers.export(exports, "buildAudioCodecString", ()=>buildAudioCodecString); +parcelHelpers.export(exports, "extractAudioCodecString", ()=>extractAudioCodecString); +parcelHelpers.export(exports, "aacFrequencyTable", ()=>aacFrequencyTable); +parcelHelpers.export(exports, "aacChannelMap", ()=>aacChannelMap); +parcelHelpers.export(exports, "parseAacAudioSpecificConfig", ()=>parseAacAudioSpecificConfig); +parcelHelpers.export(exports, "buildAacAudioSpecificConfig", ()=>buildAacAudioSpecificConfig); +parcelHelpers.export(exports, "OPUS_SAMPLE_RATE", ()=>OPUS_SAMPLE_RATE); +parcelHelpers.export(exports, "parsePcmCodec", ()=>parsePcmCodec); +parcelHelpers.export(exports, "inferCodecFromCodecString", ()=>inferCodecFromCodecString); +parcelHelpers.export(exports, "getVideoEncoderConfigExtension", ()=>getVideoEncoderConfigExtension); +parcelHelpers.export(exports, "getAudioEncoderConfigExtension", ()=>getAudioEncoderConfigExtension); +parcelHelpers.export(exports, "validateVideoChunkMetadata", ()=>validateVideoChunkMetadata); +parcelHelpers.export(exports, "validateAudioChunkMetadata", ()=>validateAudioChunkMetadata); +parcelHelpers.export(exports, "validateSubtitleMetadata", ()=>validateSubtitleMetadata); +var _miscJs = require("./misc.js"); +const VIDEO_CODECS = [ + 'avc', + 'hevc', + 'vp9', + 'av1', + 'vp8' +]; +const PCM_AUDIO_CODECS = [ + 'pcm-s16', + 'pcm-s16be', + 'pcm-s24', + 'pcm-s24be', + 'pcm-s32', + 'pcm-s32be', + 'pcm-f32', + 'pcm-f32be', + 'pcm-f64', + 'pcm-f64be', + 'pcm-u8', + 'pcm-s8', + 'ulaw', + 'alaw' +]; +const NON_PCM_AUDIO_CODECS = [ + 'aac', + 'opus', + 'mp3', + 'vorbis', + 'flac' +]; +const AUDIO_CODECS = [ + ...NON_PCM_AUDIO_CODECS, + ...PCM_AUDIO_CODECS +]; +const SUBTITLE_CODECS = [ + 'webvtt' +]; // TODO add the rest +// https://en.wikipedia.org/wiki/Advanced_Video_Coding +const AVC_LEVEL_TABLE = [ + { + maxMacroblocks: 99, + maxBitrate: 64000, + level: 0x0A + }, + { + maxMacroblocks: 396, + maxBitrate: 192000, + level: 0x0B + }, + { + maxMacroblocks: 396, + maxBitrate: 384000, + level: 0x0C + }, + { + maxMacroblocks: 396, + maxBitrate: 768000, + level: 0x0D + }, + { + maxMacroblocks: 396, + maxBitrate: 2000000, + level: 0x14 + }, + { + maxMacroblocks: 792, + maxBitrate: 4000000, + level: 0x15 + }, + { + maxMacroblocks: 1620, + maxBitrate: 4000000, + level: 0x16 + }, + { + maxMacroblocks: 1620, + maxBitrate: 10000000, + level: 0x1E + }, + { + maxMacroblocks: 3600, + maxBitrate: 14000000, + level: 0x1F + }, + { + maxMacroblocks: 5120, + maxBitrate: 20000000, + level: 0x20 + }, + { + maxMacroblocks: 8192, + maxBitrate: 20000000, + level: 0x28 + }, + { + maxMacroblocks: 8192, + maxBitrate: 50000000, + level: 0x29 + }, + { + maxMacroblocks: 8704, + maxBitrate: 50000000, + level: 0x2A + }, + { + maxMacroblocks: 22080, + maxBitrate: 135000000, + level: 0x32 + }, + { + maxMacroblocks: 36864, + maxBitrate: 240000000, + level: 0x33 + }, + { + maxMacroblocks: 36864, + maxBitrate: 240000000, + level: 0x34 + }, + { + maxMacroblocks: 139264, + maxBitrate: 240000000, + level: 0x3C + }, + { + maxMacroblocks: 139264, + maxBitrate: 480000000, + level: 0x3D + }, + { + maxMacroblocks: 139264, + maxBitrate: 800000000, + level: 0x3E + } +]; +// https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding +const HEVC_LEVEL_TABLE = [ + { + maxPictureSize: 36864, + maxBitrate: 128000, + tier: 'L', + level: 30 + }, + { + maxPictureSize: 122880, + maxBitrate: 1500000, + tier: 'L', + level: 60 + }, + { + maxPictureSize: 245760, + maxBitrate: 3000000, + tier: 'L', + level: 63 + }, + { + maxPictureSize: 552960, + maxBitrate: 6000000, + tier: 'L', + level: 90 + }, + { + maxPictureSize: 983040, + maxBitrate: 10000000, + tier: 'L', + level: 93 + }, + { + maxPictureSize: 2228224, + maxBitrate: 12000000, + tier: 'L', + level: 120 + }, + { + maxPictureSize: 2228224, + maxBitrate: 30000000, + tier: 'H', + level: 120 + }, + { + maxPictureSize: 2228224, + maxBitrate: 20000000, + tier: 'L', + level: 123 + }, + { + maxPictureSize: 2228224, + maxBitrate: 50000000, + tier: 'H', + level: 123 + }, + { + maxPictureSize: 8912896, + maxBitrate: 25000000, + tier: 'L', + level: 150 + }, + { + maxPictureSize: 8912896, + maxBitrate: 100000000, + tier: 'H', + level: 150 + }, + { + maxPictureSize: 8912896, + maxBitrate: 40000000, + tier: 'L', + level: 153 + }, + { + maxPictureSize: 8912896, + maxBitrate: 160000000, + tier: 'H', + level: 153 + }, + { + maxPictureSize: 8912896, + maxBitrate: 60000000, + tier: 'L', + level: 156 + }, + { + maxPictureSize: 8912896, + maxBitrate: 240000000, + tier: 'H', + level: 156 + }, + { + maxPictureSize: 35651584, + maxBitrate: 60000000, + tier: 'L', + level: 180 + }, + { + maxPictureSize: 35651584, + maxBitrate: 240000000, + tier: 'H', + level: 180 + }, + { + maxPictureSize: 35651584, + maxBitrate: 120000000, + tier: 'L', + level: 183 + }, + { + maxPictureSize: 35651584, + maxBitrate: 480000000, + tier: 'H', + level: 183 + }, + { + maxPictureSize: 35651584, + maxBitrate: 240000000, + tier: 'L', + level: 186 + }, + { + maxPictureSize: 35651584, + maxBitrate: 800000000, + tier: 'H', + level: 186 + } +]; +const VP9_LEVEL_TABLE = [ + { + maxPictureSize: 36864, + maxBitrate: 200000, + level: 10 + }, + { + maxPictureSize: 73728, + maxBitrate: 800000, + level: 11 + }, + { + maxPictureSize: 122880, + maxBitrate: 1800000, + level: 20 + }, + { + maxPictureSize: 245760, + maxBitrate: 3600000, + level: 21 + }, + { + maxPictureSize: 552960, + maxBitrate: 7200000, + level: 30 + }, + { + maxPictureSize: 983040, + maxBitrate: 12000000, + level: 31 + }, + { + maxPictureSize: 2228224, + maxBitrate: 18000000, + level: 40 + }, + { + maxPictureSize: 2228224, + maxBitrate: 30000000, + level: 41 + }, + { + maxPictureSize: 8912896, + maxBitrate: 60000000, + level: 50 + }, + { + maxPictureSize: 8912896, + maxBitrate: 120000000, + level: 51 + }, + { + maxPictureSize: 8912896, + maxBitrate: 180000000, + level: 52 + }, + { + maxPictureSize: 35651584, + maxBitrate: 180000000, + level: 60 + }, + { + maxPictureSize: 35651584, + maxBitrate: 240000000, + level: 61 + }, + { + maxPictureSize: 35651584, + maxBitrate: 480000000, + level: 62 + } +]; +// https://en.wikipedia.org/wiki/AV1 +const AV1_LEVEL_TABLE = [ + { + maxPictureSize: 147456, + maxBitrate: 1500000, + tier: 'M', + level: 0 + }, + { + maxPictureSize: 278784, + maxBitrate: 3000000, + tier: 'M', + level: 1 + }, + { + maxPictureSize: 665856, + maxBitrate: 6000000, + tier: 'M', + level: 4 + }, + { + maxPictureSize: 1065024, + maxBitrate: 10000000, + tier: 'M', + level: 5 + }, + { + maxPictureSize: 2359296, + maxBitrate: 12000000, + tier: 'M', + level: 8 + }, + { + maxPictureSize: 2359296, + maxBitrate: 30000000, + tier: 'H', + level: 8 + }, + { + maxPictureSize: 2359296, + maxBitrate: 20000000, + tier: 'M', + level: 9 + }, + { + maxPictureSize: 2359296, + maxBitrate: 50000000, + tier: 'H', + level: 9 + }, + { + maxPictureSize: 8912896, + maxBitrate: 30000000, + tier: 'M', + level: 12 + }, + { + maxPictureSize: 8912896, + maxBitrate: 100000000, + tier: 'H', + level: 12 + }, + { + maxPictureSize: 8912896, + maxBitrate: 40000000, + tier: 'M', + level: 13 + }, + { + maxPictureSize: 8912896, + maxBitrate: 160000000, + tier: 'H', + level: 13 + }, + { + maxPictureSize: 8912896, + maxBitrate: 60000000, + tier: 'M', + level: 14 + }, + { + maxPictureSize: 8912896, + maxBitrate: 240000000, + tier: 'H', + level: 14 + }, + { + maxPictureSize: 35651584, + maxBitrate: 60000000, + tier: 'M', + level: 15 + }, + { + maxPictureSize: 35651584, + maxBitrate: 240000000, + tier: 'H', + level: 15 + }, + { + maxPictureSize: 35651584, + maxBitrate: 60000000, + tier: 'M', + level: 16 + }, + { + maxPictureSize: 35651584, + maxBitrate: 240000000, + tier: 'H', + level: 16 + }, + { + maxPictureSize: 35651584, + maxBitrate: 100000000, + tier: 'M', + level: 17 + }, + { + maxPictureSize: 35651584, + maxBitrate: 480000000, + tier: 'H', + level: 17 + }, + { + maxPictureSize: 35651584, + maxBitrate: 160000000, + tier: 'M', + level: 18 + }, + { + maxPictureSize: 35651584, + maxBitrate: 800000000, + tier: 'H', + level: 18 + }, + { + maxPictureSize: 35651584, + maxBitrate: 160000000, + tier: 'M', + level: 19 + }, + { + maxPictureSize: 35651584, + maxBitrate: 800000000, + tier: 'H', + level: 19 + } +]; +const VP9_DEFAULT_SUFFIX = '.01.01.01.01.00'; +const AV1_DEFAULT_SUFFIX = '.0.110.01.01.01.0'; +const buildVideoCodecString = (codec, width, height, bitrate)=>{ + if (codec === 'avc') { + const profileIndication = 0x64; // High Profile + const totalMacroblocks = Math.ceil(width / 16) * Math.ceil(height / 16); + // Determine the level based on the table + const levelInfo = AVC_LEVEL_TABLE.find((level)=>totalMacroblocks <= level.maxMacroblocks && bitrate <= level.maxBitrate) ?? (0, _miscJs.last)(AVC_LEVEL_TABLE); + const levelIndication = levelInfo ? levelInfo.level : 0; + const hexProfileIndication = profileIndication.toString(16).padStart(2, '0'); + const hexProfileCompatibility = '00'; + const hexLevelIndication = levelIndication.toString(16).padStart(2, '0'); + return `avc1.${hexProfileIndication}${hexProfileCompatibility}${hexLevelIndication}`; + } else if (codec === 'hevc') { + const profilePrefix = ''; // Profile space 0 + const profileIdc = 1; // Main Profile + const compatibilityFlags = '6'; // Taken from the example in ISO 14496-15 + const pictureSize = width * height; + const levelInfo = HEVC_LEVEL_TABLE.find((level)=>pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? (0, _miscJs.last)(HEVC_LEVEL_TABLE); + const constraintFlags = 'B0'; // Progressive source flag + return 'hev1.' + `${profilePrefix}${profileIdc}.` + `${compatibilityFlags}.` + `${levelInfo.tier}${levelInfo.level}.` + `${constraintFlags}`; + } else if (codec === 'vp8') return 'vp8'; // Easy, this one + else if (codec === 'vp9') { + const profile = '00'; // Profile 0 + const pictureSize = width * height; + const levelInfo = VP9_LEVEL_TABLE.find((level)=>pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? (0, _miscJs.last)(VP9_LEVEL_TABLE); + const bitDepth = '08'; // 8-bit + return `vp09.${profile}.${levelInfo.level.toString().padStart(2, '0')}.${bitDepth}`; + } else if (codec === 'av1') { + const profile = 0; // Main Profile, single digit + const pictureSize = width * height; + const levelInfo = AV1_LEVEL_TABLE.find((level)=>pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? (0, _miscJs.last)(AV1_LEVEL_TABLE); + const level = levelInfo.level.toString().padStart(2, '0'); + const bitDepth = '08'; // 8-bit + return `av01.${profile}.${level}${levelInfo.tier}.${bitDepth}`; + } + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new TypeError(`Unhandled codec '${codec}'.`); +}; +const generateVp9CodecConfigurationFromCodecString = (codecString)=>{ + // Reference: https://www.webmproject.org/docs/container/#vp9-codec-feature-metadata-codecprivate + const parts = codecString.split('.'); // We can derive the required values from the codec string + const profile = Number(parts[1]); + const level = Number(parts[2]); + const bitDepth = Number(parts[3]); + const chromaSubsampling = parts[4] ? Number(parts[4]) : 1; + return [ + 1, + 1, + profile, + 2, + 1, + level, + 3, + 1, + bitDepth, + 4, + 1, + chromaSubsampling + ]; +}; +const generateAv1CodecConfigurationFromCodecString = (codecString)=>{ + // Reference: https://aomediacodec.github.io/av1-isobmff/ + const parts = codecString.split('.'); // We can derive the required values from the codec string + const marker = 1; + const version = 1; + const firstByte = (marker << 7) + version; + const profile = Number(parts[1]); + const levelAndTier = parts[2]; + const level = Number(levelAndTier.slice(0, -1)); + const secondByte = (profile << 5) + level; + const tier = levelAndTier.slice(-1) === 'H' ? 1 : 0; + const bitDepth = Number(parts[3]); + const highBitDepth = bitDepth === 8 ? 0 : 1; + const twelveBit = 0; + const monochrome = parts[4] ? Number(parts[4]) : 0; + const chromaSubsamplingX = parts[5] ? Number(parts[5][0]) : 1; + const chromaSubsamplingY = parts[5] ? Number(parts[5][1]) : 1; + const chromaSamplePosition = parts[5] ? Number(parts[5][2]) : 0; // CSP_UNKNOWN + const thirdByte = (tier << 7) + (highBitDepth << 6) + (twelveBit << 5) + (monochrome << 4) + (chromaSubsamplingX << 3) + (chromaSubsamplingY << 2) + chromaSamplePosition; + const initialPresentationDelayPresent = 0; // Should be fine + const fourthByte = initialPresentationDelayPresent; + return [ + firstByte, + secondByte, + thirdByte, + fourthByte + ]; +}; +const extractVideoCodecString = (trackInfo)=>{ + const { codec, codecDescription, colorSpace, avcCodecInfo, hevcCodecInfo, vp9CodecInfo, av1CodecInfo } = trackInfo; + if (codec === 'avc') { + (0, _miscJs.assert)(trackInfo.avcType !== null); + if (avcCodecInfo) { + const bytes = new Uint8Array([ + avcCodecInfo.avcProfileIndication, + avcCodecInfo.profileCompatibility, + avcCodecInfo.avcLevelIndication + ]); + return `avc${trackInfo.avcType}.${(0, _miscJs.bytesToHexString)(bytes)}`; + } + if (!codecDescription || codecDescription.byteLength < 4) throw new TypeError('AVC decoder description is not provided or is not at least 4 bytes long.'); + return `avc${trackInfo.avcType}.${(0, _miscJs.bytesToHexString)(codecDescription.subarray(1, 4))}`; + } else if (codec === 'hevc') { + let generalProfileSpace; + let generalProfileIdc; + let compatibilityFlags; + let generalTierFlag; + let generalLevelIdc; + let constraintFlags; + if (hevcCodecInfo) { + generalProfileSpace = hevcCodecInfo.generalProfileSpace; + generalProfileIdc = hevcCodecInfo.generalProfileIdc; + compatibilityFlags = (0, _miscJs.reverseBitsU32)(hevcCodecInfo.generalProfileCompatibilityFlags); + generalTierFlag = hevcCodecInfo.generalTierFlag; + generalLevelIdc = hevcCodecInfo.generalLevelIdc; + constraintFlags = [ + ...hevcCodecInfo.generalConstraintIndicatorFlags + ]; + } else { + if (!codecDescription || codecDescription.byteLength < 23) throw new TypeError('HEVC decoder description is not provided or is not at least 23 bytes long.'); + const view = (0, _miscJs.toDataView)(codecDescription); + const profileByte = view.getUint8(1); + generalProfileSpace = profileByte >> 6 & 0x03; + generalProfileIdc = profileByte & 0x1F; + compatibilityFlags = (0, _miscJs.reverseBitsU32)(view.getUint32(2)); + generalTierFlag = profileByte >> 5 & 0x01; + generalLevelIdc = view.getUint8(12); + constraintFlags = []; + for(let i = 0; i < 6; i++)constraintFlags.push(view.getUint8(6 + i)); + } + let codecString = 'hev1.'; + codecString += [ + '', + 'A', + 'B', + 'C' + ][generalProfileSpace] + generalProfileIdc; + codecString += '.'; + codecString += compatibilityFlags.toString(16).toUpperCase(); + codecString += '.'; + codecString += generalTierFlag === 0 ? 'L' : 'H'; + codecString += generalLevelIdc; + while(constraintFlags.length > 0 && constraintFlags[constraintFlags.length - 1] === 0)constraintFlags.pop(); + if (constraintFlags.length > 0) { + codecString += '.'; + codecString += constraintFlags.map((x)=>x.toString(16).toUpperCase()).join('.'); + } + return codecString; + } else if (codec === 'vp8') return 'vp8'; // Easy, this one + else if (codec === 'vp9') { + if (!vp9CodecInfo) { + // Calculate level based on dimensions + const pictureSize = trackInfo.width * trackInfo.height; + let level = (0, _miscJs.last)(VP9_LEVEL_TABLE).level; // Default to highest level + for (const entry of VP9_LEVEL_TABLE)if (pictureSize <= entry.maxPictureSize) { + level = entry.level; + break; + } + // We don't really know better, so let's return a general-purpose, common codec string and hope for the best + return `vp09.00.${level.toString().padStart(2, '0')}.08`; + } + const profile = vp9CodecInfo.profile.toString().padStart(2, '0'); + const level = vp9CodecInfo.level.toString().padStart(2, '0'); + const bitDepth = vp9CodecInfo.bitDepth.toString().padStart(2, '0'); + const chromaSubsampling = vp9CodecInfo.chromaSubsampling.toString().padStart(2, '0'); + const colourPrimaries = vp9CodecInfo.colourPrimaries.toString().padStart(2, '0'); + const transferCharacteristics = vp9CodecInfo.transferCharacteristics.toString().padStart(2, '0'); + const matrixCoefficients = vp9CodecInfo.matrixCoefficients.toString().padStart(2, '0'); + const videoFullRangeFlag = vp9CodecInfo.videoFullRangeFlag.toString().padStart(2, '0'); + let string = `vp09.${profile}.${level}.${bitDepth}.${chromaSubsampling}`; + string += `.${colourPrimaries}.${transferCharacteristics}.${matrixCoefficients}.${videoFullRangeFlag}`; + if (string.endsWith(VP9_DEFAULT_SUFFIX)) string = string.slice(0, -VP9_DEFAULT_SUFFIX.length); + return string; + } else if (codec === 'av1') { + if (!av1CodecInfo) { + // Calculate level based on dimensions + const pictureSize = trackInfo.width * trackInfo.height; + let level = (0, _miscJs.last)(VP9_LEVEL_TABLE).level; // Default to highest level + for (const entry of VP9_LEVEL_TABLE)if (pictureSize <= entry.maxPictureSize) { + level = entry.level; + break; + } + // We don't really know better, so let's return a general-purpose, common codec string and hope for the best + return `av01.0.${level.toString().padStart(2, '0')}M.08`; + } + // https://aomediacodec.github.io/av1-isobmff/#codecsparam + const profile = av1CodecInfo.profile; // Single digit + const level = av1CodecInfo.level.toString().padStart(2, '0'); + const tier = av1CodecInfo.tier ? 'H' : 'M'; + const bitDepth = av1CodecInfo.bitDepth.toString().padStart(2, '0'); + const monochrome = av1CodecInfo.monochrome ? '1' : '0'; + const chromaSubsampling = 100 * av1CodecInfo.chromaSubsamplingX + 10 * av1CodecInfo.chromaSubsamplingY + 1 * (av1CodecInfo.chromaSubsamplingX && av1CodecInfo.chromaSubsamplingY ? av1CodecInfo.chromaSamplePosition : 0); + // The defaults are 1 (ITU-R BT.709) + const colorPrimaries = colorSpace?.primaries ? (0, _miscJs.COLOR_PRIMARIES_MAP)[colorSpace.primaries] : 1; + const transferCharacteristics = colorSpace?.transfer ? (0, _miscJs.TRANSFER_CHARACTERISTICS_MAP)[colorSpace.transfer] : 1; + const matrixCoefficients = colorSpace?.matrix ? (0, _miscJs.MATRIX_COEFFICIENTS_MAP)[colorSpace.matrix] : 1; + const videoFullRangeFlag = colorSpace?.fullRange ? 1 : 0; + let string = `av01.${profile}.${level}${tier}.${bitDepth}`; + string += `.${monochrome}.${chromaSubsampling.toString().padStart(3, '0')}`; + string += `.${colorPrimaries.toString().padStart(2, '0')}`; + string += `.${transferCharacteristics.toString().padStart(2, '0')}`; + string += `.${matrixCoefficients.toString().padStart(2, '0')}`; + string += `.${videoFullRangeFlag}`; + if (string.endsWith(AV1_DEFAULT_SUFFIX)) string = string.slice(0, -AV1_DEFAULT_SUFFIX.length); + return string; + } + throw new TypeError(`Unhandled codec '${codec}'.`); +}; +const buildAudioCodecString = (codec, numberOfChannels, sampleRate)=>{ + if (codec === 'aac') { + // If stereo or higher channels and lower sample rate, likely using HE-AAC v2 with PS + if (numberOfChannels >= 2 && sampleRate <= 24000) return 'mp4a.40.29'; // HE-AAC v2 (AAC LC + SBR + PS) + // If sample rate is low, likely using HE-AAC v1 with SBR + if (sampleRate <= 24000) return 'mp4a.40.5'; // HE-AAC v1 (AAC LC + SBR) + // Default to standard AAC-LC for higher sample rates + return 'mp4a.40.2'; // AAC-LC + } else if (codec === 'mp3') return 'mp3'; + else if (codec === 'opus') return 'opus'; + else if (codec === 'vorbis') return 'vorbis'; + else if (codec === 'flac') return 'flac'; + else if (PCM_AUDIO_CODECS.includes(codec)) return codec; + throw new TypeError(`Unhandled codec '${codec}'.`); +}; +const extractAudioCodecString = (trackInfo)=>{ + const { codec, codecDescription, aacCodecInfo } = trackInfo; + if (codec === 'aac') { + if (!aacCodecInfo) throw new TypeError('AAC codec info must be provided.'); + if (aacCodecInfo.isMpeg2) return 'mp4a.67'; + else { + const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription); + return `mp4a.40.${audioSpecificConfig.objectType}`; + } + } else if (codec === 'mp3') return 'mp3'; + else if (codec === 'opus') return 'opus'; + else if (codec === 'vorbis') return 'vorbis'; + else if (codec === 'flac') return 'flac'; + else if (codec && PCM_AUDIO_CODECS.includes(codec)) return codec; + throw new TypeError(`Unhandled codec '${codec}'.`); +}; +const aacFrequencyTable = [ + 96000, + 88200, + 64000, + 48000, + 44100, + 32000, + 24000, + 22050, + 16000, + 12000, + 11025, + 8000, + 7350 +]; +const aacChannelMap = [ + -1, + 1, + 2, + 3, + 4, + 5, + 6, + 8 +]; +const parseAacAudioSpecificConfig = (bytes)=>{ + if (!bytes || bytes.byteLength < 2) throw new TypeError('AAC description must be at least 2 bytes long.'); + const bitstream = new (0, _miscJs.Bitstream)(bytes); + let objectType = bitstream.readBits(5); + if (objectType === 31) objectType = 32 + bitstream.readBits(6); + const frequencyIndex = bitstream.readBits(4); + let sampleRate = null; + if (frequencyIndex === 15) sampleRate = bitstream.readBits(24); + else if (frequencyIndex < aacFrequencyTable.length) sampleRate = aacFrequencyTable[frequencyIndex]; + const channelConfiguration = bitstream.readBits(4); + let numberOfChannels = null; + if (channelConfiguration >= 1 && channelConfiguration <= 7) numberOfChannels = aacChannelMap[channelConfiguration]; + return { + objectType, + frequencyIndex, + sampleRate, + channelConfiguration, + numberOfChannels + }; +}; +const buildAacAudioSpecificConfig = (config)=>{ + let frequencyIndex = aacFrequencyTable.indexOf(config.sampleRate); + let customSampleRate = null; + if (frequencyIndex === -1) { + frequencyIndex = 15; + customSampleRate = config.sampleRate; + } + const channelConfiguration = aacChannelMap.indexOf(config.numberOfChannels); + if (channelConfiguration === -1) throw new TypeError(`Unsupported number of channels: ${config.numberOfChannels}`); + let bitCount = 13; + if (config.objectType >= 32) bitCount += 6; + if (frequencyIndex === 15) bitCount += 24; + const byteCount = Math.ceil(bitCount / 8); + const bytes = new Uint8Array(byteCount); + const bitstream = new (0, _miscJs.Bitstream)(bytes); + if (config.objectType < 32) bitstream.writeBits(5, config.objectType); + else { + bitstream.writeBits(5, 31); + bitstream.writeBits(6, config.objectType - 32); + } + bitstream.writeBits(4, frequencyIndex); + if (frequencyIndex === 15) bitstream.writeBits(24, customSampleRate); + bitstream.writeBits(4, channelConfiguration); + return bytes; +}; +const OPUS_SAMPLE_RATE = 48000; +const PCM_CODEC_REGEX = /^pcm-([usf])(\d+)+(be)?$/; +const parsePcmCodec = (codec)=>{ + (0, _miscJs.assert)(PCM_AUDIO_CODECS.includes(codec)); + if (codec === 'ulaw') return { + dataType: 'ulaw', + sampleSize: 1, + littleEndian: true, + silentValue: 255 + }; + else if (codec === 'alaw') return { + dataType: 'alaw', + sampleSize: 1, + littleEndian: true, + silentValue: 213 + }; + const match = PCM_CODEC_REGEX.exec(codec); + (0, _miscJs.assert)(match); + let dataType; + if (match[1] === 'u') dataType = 'unsigned'; + else if (match[1] === 's') dataType = 'signed'; + else dataType = 'float'; + const sampleSize = Number(match[2]) / 8; + const littleEndian = match[3] !== 'be'; + const silentValue = codec === 'pcm-u8' ? 128 : 0; + return { + dataType, + sampleSize, + littleEndian, + silentValue + }; +}; +const inferCodecFromCodecString = (codecString)=>{ + // Video codecs + if (codecString.startsWith('avc1') || codecString.startsWith('avc3')) return 'avc'; + else if (codecString.startsWith('hev1') || codecString.startsWith('hvc1')) return 'hevc'; + else if (codecString === 'vp8') return 'vp8'; + else if (codecString.startsWith('vp09')) return 'vp9'; + else if (codecString.startsWith('av01')) return 'av1'; + // Audio codecs + if (codecString.startsWith('mp4a.40') || codecString === 'mp4a.67') return 'aac'; + else if (codecString === 'mp3' || codecString === 'mp4a.69' || codecString === 'mp4a.6B' || codecString === 'mp4a.6b') return 'mp3'; + else if (codecString === 'opus') return 'opus'; + else if (codecString === 'vorbis') return 'vorbis'; + else if (codecString === 'flac') return 'flac'; + else if (codecString === 'ulaw') return 'ulaw'; + else if (codecString === 'alaw') return 'alaw'; + else if (PCM_CODEC_REGEX.test(codecString)) return codecString; + // Subtitle codecs + if (codecString === 'webvtt') return 'webvtt'; + return null; +}; +const getVideoEncoderConfigExtension = (codec)=>{ + if (codec === 'avc') return { + avc: { + format: 'avc' + } + }; + else if (codec === 'hevc') return { + hevc: { + format: 'hevc' + } + }; + return {}; +}; +const getAudioEncoderConfigExtension = (codec)=>{ + if (codec === 'aac') return { + aac: { + format: 'aac' + } + }; + else if (codec === 'opus') return { + opus: { + format: 'opus' + } + }; + return {}; +}; +const VALID_VIDEO_CODEC_STRING_PREFIXES = [ + 'avc1', + 'avc3', + 'hev1', + 'hvc1', + 'vp8', + 'vp09', + 'av01' +]; +const AVC_CODEC_STRING_REGEX = /^(avc1|avc3)\.[0-9a-fA-F]{6}$/; +const HEVC_CODEC_STRING_REGEX = /^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/; +const VP9_CODEC_STRING_REGEX = /^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/; +const AV1_CODEC_STRING_REGEX = /^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/; +const validateVideoChunkMetadata = (metadata)=>{ + if (!metadata) throw new TypeError('Video chunk metadata must be provided.'); + if (typeof metadata !== 'object') throw new TypeError('Video chunk metadata must be an object.'); + if (!metadata.decoderConfig) throw new TypeError('Video chunk metadata must include a decoder configuration.'); + if (typeof metadata.decoderConfig !== 'object') throw new TypeError('Video chunk metadata decoder configuration must be an object.'); + if (typeof metadata.decoderConfig.codec !== 'string') throw new TypeError('Video chunk metadata decoder configuration must specify a codec string.'); + if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some((prefix)=>metadata.decoderConfig.codec.startsWith(prefix))) throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry."); + if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).'); + if (!Number.isInteger(metadata.decoderConfig.codedHeight) || metadata.decoderConfig.codedHeight <= 0) throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).'); + if (metadata.decoderConfig.description !== undefined) { + if (!(0, _miscJs.isAllowSharedBufferSource)(metadata.decoderConfig.description)) throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view."); + } + if (metadata.decoderConfig.colorSpace !== undefined) { + const { colorSpace } = metadata.decoderConfig; + if (typeof colorSpace !== 'object') throw new TypeError('Video chunk metadata decoder configuration colorSpace, when provided, must be an object.'); + const primariesValues = Object.keys((0, _miscJs.COLOR_PRIMARIES_MAP)); + if (colorSpace.primaries != null && !primariesValues.includes(colorSpace.primaries)) throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of` + ` ${primariesValues.join(', ')}.`); + const transferValues = Object.keys((0, _miscJs.TRANSFER_CHARACTERISTICS_MAP)); + if (colorSpace.transfer != null && !transferValues.includes(colorSpace.transfer)) throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of` + ` ${transferValues.join(', ')}.`); + const matrixValues = Object.keys((0, _miscJs.MATRIX_COEFFICIENTS_MAP)); + if (colorSpace.matrix != null && !matrixValues.includes(colorSpace.matrix)) throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of` + ` ${matrixValues.join(', ')}.`); + if (colorSpace.fullRange != null && typeof colorSpace.fullRange !== 'boolean') throw new TypeError('Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.'); + } + if (metadata.decoderConfig.codec.startsWith('avc1') || metadata.decoderConfig.codec.startsWith('avc3')) { + // AVC-specific validation + if (!AVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381."); + // `description` may or may not be set, depending on if the format is AVCC or Annex B, so don't perform any + // validation for it. + // https://www.w3.org/TR/webcodecs-avc-codec-registration + } else if (metadata.decoderConfig.codec.startsWith('hev1') || metadata.decoderConfig.codec.startsWith('hvc1')) { + // HEVC-specific validation + if (!HEVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15."); + // `description` may or may not be set, depending on if the format is HEVC or Annex B, so don't perform any + // validation for it. + // https://www.w3.org/TR/webcodecs-hevc-codec-registration + } else if (metadata.decoderConfig.codec.startsWith('vp8')) { + // VP8-specific validation + if (metadata.decoderConfig.codec !== 'vp8') throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".'); + } else if (metadata.decoderConfig.codec.startsWith('vp09')) { + // VP9-specific validation + if (!VP9_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.'); + } else if (metadata.decoderConfig.codec.startsWith('av01')) { + // AV1-specific validation + if (!AV1_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.'); + } +}; +const VALID_AUDIO_CODEC_STRING_PREFIXES = [ + 'mp4a', + 'mp3', + 'opus', + 'vorbis', + 'flac', + 'ulaw', + 'alaw', + 'pcm' +]; +const validateAudioChunkMetadata = (metadata)=>{ + if (!metadata) throw new TypeError('Audio chunk metadata must be provided.'); + if (typeof metadata !== 'object') throw new TypeError('Audio chunk metadata must be an object.'); + if (!metadata.decoderConfig) throw new TypeError('Audio chunk metadata must include a decoder configuration.'); + if (typeof metadata.decoderConfig !== 'object') throw new TypeError('Audio chunk metadata decoder configuration must be an object.'); + if (typeof metadata.decoderConfig.codec !== 'string') throw new TypeError('Audio chunk metadata decoder configuration must specify a codec string.'); + if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some((prefix)=>metadata.decoderConfig.codec.startsWith(prefix))) throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry."); + if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) throw new TypeError('Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).'); + if (!Number.isInteger(metadata.decoderConfig.numberOfChannels) || metadata.decoderConfig.numberOfChannels <= 0) throw new TypeError('Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).'); + if (metadata.decoderConfig.description !== undefined) { + if (!(0, _miscJs.isAllowSharedBufferSource)(metadata.decoderConfig.description)) throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view."); + } + if (metadata.decoderConfig.codec.startsWith('mp4a') && metadata.decoderConfig.codec !== 'mp4a.69' && metadata.decoderConfig.codec !== 'mp4a.6B' && metadata.decoderConfig.codec !== 'mp4a.6b') { + // AAC-specific validation + const validStrings = [ + 'mp4a.40.2', + 'mp4a.40.02', + 'mp4a.40.5', + 'mp4a.40.05', + 'mp4a.40.29', + 'mp4a.67' + ]; + if (!validStrings.includes(metadata.decoderConfig.codec)) throw new TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/."); + if (!metadata.decoderConfig.description) throw new TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3."); + } else if (metadata.decoderConfig.codec.startsWith('mp3') || metadata.decoderConfig.codec.startsWith('mp4a')) { + // MP3-specific validation + if (metadata.decoderConfig.codec !== 'mp3' && metadata.decoderConfig.codec !== 'mp4a.69' && metadata.decoderConfig.codec !== 'mp4a.6B' && metadata.decoderConfig.codec !== 'mp4a.6b') throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".'); + } else if (metadata.decoderConfig.codec.startsWith('opus')) { + // Opus-specific validation + if (metadata.decoderConfig.codec !== 'opus') throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".'); + if (metadata.decoderConfig.description && metadata.decoderConfig.description.byteLength < 18) // Description is optional for Opus per-spec, so we shouldn't enforce it + throw new TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845."); + } else if (metadata.decoderConfig.codec.startsWith('vorbis')) { + // Vorbis-specific validation + if (metadata.decoderConfig.codec !== 'vorbis') throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".'); + if (!metadata.decoderConfig.description) throw new TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/."); + } else if (metadata.decoderConfig.codec.startsWith('flac')) { + // FLAC-specific validation + if (metadata.decoderConfig.codec !== 'flac') throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".'); + const minDescriptionSize = 42; // 'fLaC' + metadata block header + STREAMINFO block + if (!metadata.decoderConfig.description || metadata.decoderConfig.description.byteLength < minDescriptionSize) throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/."); + } else if (metadata.decoderConfig.codec.startsWith('pcm') || metadata.decoderConfig.codec.startsWith('ulaw') || metadata.decoderConfig.codec.startsWith('alaw')) { + // PCM-specific validation + if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) throw new TypeError('Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM' + ` codecs (${PCM_AUDIO_CODECS.join(', ')}).`); + } +}; +const validateSubtitleMetadata = (metadata)=>{ + if (!metadata) throw new TypeError('Subtitle metadata must be provided.'); + if (typeof metadata !== 'object') throw new TypeError('Subtitle metadata must be an object.'); + if (!metadata.config) throw new TypeError('Subtitle metadata must include a config object.'); + if (typeof metadata.config !== 'object') throw new TypeError('Subtitle metadata config must be an object.'); + if (typeof metadata.config.description !== 'string') throw new TypeError('Subtitle metadata config description must be a string.'); +}; + +},{"./misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"kkhLS":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "assert", ()=>assert); +parcelHelpers.export(exports, "normalizeRotation", ()=>normalizeRotation); +parcelHelpers.export(exports, "last", ()=>last); +parcelHelpers.export(exports, "isU32", ()=>isU32); +parcelHelpers.export(exports, "Bitstream", ()=>Bitstream); +parcelHelpers.export(exports, "readExpGolomb", ()=>readExpGolomb); +parcelHelpers.export(exports, "readSignedExpGolomb", ()=>readSignedExpGolomb); +parcelHelpers.export(exports, "writeBits", ()=>writeBits); +parcelHelpers.export(exports, "toUint8Array", ()=>toUint8Array); +parcelHelpers.export(exports, "toDataView", ()=>toDataView); +parcelHelpers.export(exports, "textDecoder", ()=>textDecoder); +parcelHelpers.export(exports, "textEncoder", ()=>textEncoder); +parcelHelpers.export(exports, "isIso88591Compatible", ()=>isIso88591Compatible); +parcelHelpers.export(exports, "COLOR_PRIMARIES_MAP", ()=>COLOR_PRIMARIES_MAP); +parcelHelpers.export(exports, "COLOR_PRIMARIES_MAP_INVERSE", ()=>COLOR_PRIMARIES_MAP_INVERSE); +parcelHelpers.export(exports, "TRANSFER_CHARACTERISTICS_MAP", ()=>TRANSFER_CHARACTERISTICS_MAP); +parcelHelpers.export(exports, "TRANSFER_CHARACTERISTICS_MAP_INVERSE", ()=>TRANSFER_CHARACTERISTICS_MAP_INVERSE); +parcelHelpers.export(exports, "MATRIX_COEFFICIENTS_MAP", ()=>MATRIX_COEFFICIENTS_MAP); +parcelHelpers.export(exports, "MATRIX_COEFFICIENTS_MAP_INVERSE", ()=>MATRIX_COEFFICIENTS_MAP_INVERSE); +parcelHelpers.export(exports, "colorSpaceIsComplete", ()=>colorSpaceIsComplete); +parcelHelpers.export(exports, "isAllowSharedBufferSource", ()=>isAllowSharedBufferSource); +parcelHelpers.export(exports, "AsyncMutex", ()=>AsyncMutex); +parcelHelpers.export(exports, "bytesToHexString", ()=>bytesToHexString); +parcelHelpers.export(exports, "reverseBitsU32", ()=>reverseBitsU32); +parcelHelpers.export(exports, "binarySearchExact", ()=>binarySearchExact); +parcelHelpers.export(exports, "binarySearchLessOrEqual", ()=>binarySearchLessOrEqual); +parcelHelpers.export(exports, "insertSorted", ()=>insertSorted); +parcelHelpers.export(exports, "promiseWithResolvers", ()=>promiseWithResolvers); +parcelHelpers.export(exports, "removeItem", ()=>removeItem); +parcelHelpers.export(exports, "findLast", ()=>findLast); +parcelHelpers.export(exports, "findLastIndex", ()=>findLastIndex); +parcelHelpers.export(exports, "toAsyncIterator", ()=>toAsyncIterator); +parcelHelpers.export(exports, "validateAnyIterable", ()=>validateAnyIterable); +parcelHelpers.export(exports, "assertNever", ()=>assertNever); +parcelHelpers.export(exports, "getUint24", ()=>getUint24); +parcelHelpers.export(exports, "getInt24", ()=>getInt24); +parcelHelpers.export(exports, "setUint24", ()=>setUint24); +parcelHelpers.export(exports, "setInt24", ()=>setInt24); +parcelHelpers.export(exports, "setInt64", ()=>setInt64); +parcelHelpers.export(exports, "mapAsyncGenerator", ()=>mapAsyncGenerator); +parcelHelpers.export(exports, "clamp", ()=>clamp); +parcelHelpers.export(exports, "UNDETERMINED_LANGUAGE", ()=>UNDETERMINED_LANGUAGE); +parcelHelpers.export(exports, "roundIfAlmostInteger", ()=>roundIfAlmostInteger); +parcelHelpers.export(exports, "roundToMultiple", ()=>roundToMultiple); +parcelHelpers.export(exports, "ilog", ()=>ilog); +parcelHelpers.export(exports, "isIso639Dash2LanguageCode", ()=>isIso639Dash2LanguageCode); +parcelHelpers.export(exports, "SECOND_TO_MICROSECOND_FACTOR", ()=>SECOND_TO_MICROSECOND_FACTOR); +parcelHelpers.export(exports, "mergeRequestInit", ()=>mergeRequestInit); +parcelHelpers.export(exports, "retriedFetch", ()=>retriedFetch); +parcelHelpers.export(exports, "computeRationalApproximation", ()=>computeRationalApproximation); +parcelHelpers.export(exports, "CallSerializer", ()=>CallSerializer); +parcelHelpers.export(exports, "isWebKit", ()=>isWebKit); +parcelHelpers.export(exports, "isFirefox", ()=>isFirefox); +parcelHelpers.export(exports, "isChromium", ()=>isChromium); +parcelHelpers.export(exports, "getChromiumVersion", ()=>getChromiumVersion); +parcelHelpers.export(exports, "coalesceIndex", ()=>coalesceIndex); +parcelHelpers.export(exports, "closedIntervalsOverlap", ()=>closedIntervalsOverlap); +parcelHelpers.export(exports, "keyValueIterator", ()=>keyValueIterator); +parcelHelpers.export(exports, "imageMimeTypeToExtension", ()=>imageMimeTypeToExtension); +parcelHelpers.export(exports, "base64ToBytes", ()=>base64ToBytes); +parcelHelpers.export(exports, "bytesToBase64", ()=>bytesToBase64); +parcelHelpers.export(exports, "uint8ArraysAreEqual", ()=>uint8ArraysAreEqual); +parcelHelpers.export(exports, "polyfillSymbolDispose", ()=>polyfillSymbolDispose); +parcelHelpers.export(exports, "isNumber", ()=>isNumber); +function assert(x) { + if (!x) throw new Error('Assertion failed.'); +} +const normalizeRotation = (rotation)=>{ + const mappedRotation = (rotation % 360 + 360) % 360; + if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) return mappedRotation; + else throw new Error(`Invalid rotation ${rotation}.`); +}; +const last = (arr)=>{ + return arr && arr[arr.length - 1]; +}; +const isU32 = (value)=>{ + return value >= 0 && value < 2 ** 32; +}; +class Bitstream { + constructor(bytes){ + this.bytes = bytes; + /** Current offset in bits. */ this.pos = 0; + } + seekToByte(byteOffset) { + this.pos = 8 * byteOffset; + } + readBit() { + const byteIndex = Math.floor(this.pos / 8); + const byte = this.bytes[byteIndex] ?? 0; + const bitIndex = 7 - (this.pos & 7); + const bit = (byte & 1 << bitIndex) >> bitIndex; + this.pos++; + return bit; + } + readBits(n) { + if (n === 1) return this.readBit(); + let result = 0; + for(let i = 0; i < n; i++){ + result <<= 1; + result |= this.readBit(); + } + return result; + } + writeBits(n, value) { + const end = this.pos + n; + for(let i = this.pos; i < end; i++){ + const byteIndex = Math.floor(i / 8); + let byte = this.bytes[byteIndex]; + const bitIndex = 7 - (i & 7); + byte &= ~(1 << bitIndex); + byte |= (value & 1 << end - i - 1) >> end - i - 1 << bitIndex; + this.bytes[byteIndex] = byte; + } + this.pos = end; + } + readAlignedByte() { + // Ensure we're byte-aligned + if (this.pos % 8 !== 0) throw new Error('Bitstream is not byte-aligned.'); + const byteIndex = this.pos / 8; + const byte = this.bytes[byteIndex] ?? 0; + this.pos += 8; + return byte; + } + skipBits(n) { + this.pos += n; + } + getBitsLeft() { + return this.bytes.length * 8 - this.pos; + } + clone() { + const clone = new Bitstream(this.bytes); + clone.pos = this.pos; + return clone; + } +} +const readExpGolomb = (bitstream)=>{ + let leadingZeroBits = 0; + while(bitstream.readBits(1) === 0 && leadingZeroBits < 32)leadingZeroBits++; + if (leadingZeroBits >= 32) throw new Error('Invalid exponential-Golomb code.'); + const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits); + return result; +}; +const readSignedExpGolomb = (bitstream)=>{ + const codeNum = readExpGolomb(bitstream); + return (codeNum & 1) === 0 ? -(codeNum >> 1) : codeNum + 1 >> 1; +}; +const writeBits = (bytes, start, end, value)=>{ + for(let i = start; i < end; i++){ + const byteIndex = Math.floor(i / 8); + let byte = bytes[byteIndex]; + const bitIndex = 7 - (i & 7); + byte &= ~(1 << bitIndex); + byte |= (value & 1 << end - i - 1) >> end - i - 1 << bitIndex; + bytes[byteIndex] = byte; + } +}; +const toUint8Array = (source)=>{ + if (source.constructor === Uint8Array) return source; + else if (ArrayBuffer.isView(source)) return new Uint8Array(source.buffer, source.byteOffset, source.byteLength); + else return new Uint8Array(source); +}; +const toDataView = (source)=>{ + if (source.constructor === DataView) return source; + else if (ArrayBuffer.isView(source)) return new DataView(source.buffer, source.byteOffset, source.byteLength); + else return new DataView(source); +}; +const textDecoder = /* #__PURE__ */ new TextDecoder(); +const textEncoder = /* #__PURE__ */ new TextEncoder(); +const isIso88591Compatible = (text)=>{ + for(let i = 0; i < text.length; i++){ + const code = text.charCodeAt(i); + if (code > 255) return false; + } + return true; +}; +const invertObject = (object)=>{ + return Object.fromEntries(Object.entries(object).map(([key, value])=>[ + value, + key + ])); +}; +const COLOR_PRIMARIES_MAP = { + bt709: 1, + bt470bg: 5, + smpte170m: 6, + bt2020: 9, + smpte432: 12 +}; +const COLOR_PRIMARIES_MAP_INVERSE = /* #__PURE__ */ invertObject(COLOR_PRIMARIES_MAP); +const TRANSFER_CHARACTERISTICS_MAP = { + 'bt709': 1, + 'smpte170m': 6, + 'linear': 8, + 'iec61966-2-1': 13, + 'pq': 16, + 'hlg': 18 +}; +const TRANSFER_CHARACTERISTICS_MAP_INVERSE = /* #__PURE__ */ invertObject(TRANSFER_CHARACTERISTICS_MAP); +const MATRIX_COEFFICIENTS_MAP = { + 'rgb': 0, + 'bt709': 1, + 'bt470bg': 5, + 'smpte170m': 6, + 'bt2020-ncl': 9 +}; +const MATRIX_COEFFICIENTS_MAP_INVERSE = /* #__PURE__ */ invertObject(MATRIX_COEFFICIENTS_MAP); +const colorSpaceIsComplete = (colorSpace)=>{ + return !!colorSpace && !!colorSpace.primaries && !!colorSpace.transfer && !!colorSpace.matrix && colorSpace.fullRange !== undefined; +}; +const isAllowSharedBufferSource = (x)=>{ + return x instanceof ArrayBuffer || typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer || ArrayBuffer.isView(x); +}; +class AsyncMutex { + constructor(){ + this.currentPromise = Promise.resolve(); + } + async acquire() { + let resolver; + const nextPromise = new Promise((resolve)=>{ + resolver = resolve; + }); + const currentPromiseAlias = this.currentPromise; + this.currentPromise = nextPromise; + await currentPromiseAlias; + return resolver; + } +} +const bytesToHexString = (bytes)=>{ + return [ + ...bytes + ].map((x)=>x.toString(16).padStart(2, '0')).join(''); +}; +const reverseBitsU32 = (x)=>{ + x = x >> 1 & 0x55555555 | (x & 0x55555555) << 1; + x = x >> 2 & 0x33333333 | (x & 0x33333333) << 2; + x = x >> 4 & 0x0f0f0f0f | (x & 0x0f0f0f0f) << 4; + x = x >> 8 & 0x00ff00ff | (x & 0x00ff00ff) << 8; + x = x >> 16 & 0x0000ffff | (x & 0x0000ffff) << 16; + return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer +}; +const binarySearchExact = (arr, key, valueGetter)=>{ + let low = 0; + let high = arr.length - 1; + let ans = -1; + while(low <= high){ + const mid = low + high >> 1; + const midVal = valueGetter(arr[mid]); + if (midVal === key) { + ans = mid; + high = mid - 1; // Continue searching left to find the lowest index + } else if (midVal < key) low = mid + 1; + else high = mid - 1; + } + return ans; +}; +const binarySearchLessOrEqual = (arr, key, valueGetter)=>{ + let low = 0; + let high = arr.length - 1; + let ans = -1; + while(low <= high){ + const mid = low + (high - low + 1) / 2 | 0; + const midVal = valueGetter(arr[mid]); + if (midVal <= key) { + ans = mid; + low = mid + 1; + } else high = mid - 1; + } + return ans; +}; +const insertSorted = (arr, item, valueGetter)=>{ + const insertionIndex = binarySearchLessOrEqual(arr, valueGetter(item), valueGetter); + arr.splice(insertionIndex + 1, 0, item); // This even behaves correctly for the -1 case +}; +const promiseWithResolvers = ()=>{ + let resolve; + let reject; + const promise = new Promise((res, rej)=>{ + resolve = res; + reject = rej; + }); + return { + promise, + resolve: resolve, + reject: reject + }; +}; +const removeItem = (arr, item)=>{ + const index = arr.indexOf(item); + if (index !== -1) arr.splice(index, 1); +}; +const findLast = (arr, predicate)=>{ + for(let i = arr.length - 1; i >= 0; i--){ + if (predicate(arr[i])) return arr[i]; + } + return undefined; +}; +const findLastIndex = (arr, predicate)=>{ + for(let i = arr.length - 1; i >= 0; i--){ + if (predicate(arr[i])) return i; + } + return -1; +}; +const toAsyncIterator = async function*(source) { + if (Symbol.iterator in source) // @ts-expect-error Trust me + yield* source[Symbol.iterator](); + else // @ts-expect-error Trust me + yield* source[Symbol.asyncIterator](); +}; +const validateAnyIterable = (iterable)=>{ + if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) throw new TypeError('Argument must be an iterable or async iterable.'); +}; +const assertNever = (x)=>{ + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new Error(`Unexpected value: ${x}`); +}; +const getUint24 = (view, byteOffset, littleEndian)=>{ + const byte1 = view.getUint8(byteOffset); + const byte2 = view.getUint8(byteOffset + 1); + const byte3 = view.getUint8(byteOffset + 2); + if (littleEndian) return byte1 | byte2 << 8 | byte3 << 16; + else return byte1 << 16 | byte2 << 8 | byte3; +}; +const getInt24 = (view, byteOffset, littleEndian)=>{ + // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift + // then correctly interprets the sign bit. + return getUint24(view, byteOffset, littleEndian) << 8 >> 8; +}; +const setUint24 = (view, byteOffset, value, littleEndian)=>{ + // Ensure the value is within 24-bit unsigned range (0 to 16777215) + value = value >>> 0; // Convert to unsigned 32-bit + value = value & 0xFFFFFF; // Mask to 24 bits + if (littleEndian) { + view.setUint8(byteOffset, value & 0xFF); + view.setUint8(byteOffset + 1, value >>> 8 & 0xFF); + view.setUint8(byteOffset + 2, value >>> 16 & 0xFF); + } else { + view.setUint8(byteOffset, value >>> 16 & 0xFF); + view.setUint8(byteOffset + 1, value >>> 8 & 0xFF); + view.setUint8(byteOffset + 2, value & 0xFF); + } +}; +const setInt24 = (view, byteOffset, value, littleEndian)=>{ + // Ensure the value is within 24-bit signed range (-8388608 to 8388607) + value = clamp(value, -8388608, 8388607); + // Convert negative values to their 24-bit representation + if (value < 0) value = value + 0x1000000 & 0xFFFFFF; + setUint24(view, byteOffset, value, littleEndian); +}; +const setInt64 = (view, byteOffset, value, littleEndian)=>{ + if (littleEndian) { + view.setUint32(byteOffset + 0, value, true); + view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true); + } else { + view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true); + view.setUint32(byteOffset + 4, value, true); + } +}; +const mapAsyncGenerator = (generator, map)=>{ + return { + async next () { + const result = await generator.next(); + if (result.done) return { + value: undefined, + done: true + }; + else return { + value: map(result.value), + done: false + }; + }, + return () { + return generator.return(); + }, + throw (error) { + return generator.throw(error); + }, + [Symbol.asyncIterator] () { + return this; + } + }; +}; +const clamp = (value, min, max)=>{ + return Math.max(min, Math.min(max, value)); +}; +const UNDETERMINED_LANGUAGE = 'und'; +const roundIfAlmostInteger = (value)=>{ + const rounded = Math.round(value); + if (Math.abs(value / rounded - 1) < 10 * Number.EPSILON) return rounded; + else return value; +}; +const roundToMultiple = (value, multiple)=>{ + return Math.round(value / multiple) * multiple; +}; +const ilog = (x)=>{ + let ret = 0; + while(x){ + ret++; + x >>= 1; + } + return ret; +}; +const ISO_639_2_REGEX = /^[a-z]{3}$/; +const isIso639Dash2LanguageCode = (x)=>{ + return ISO_639_2_REGEX.test(x); +}; +const SECOND_TO_MICROSECOND_FACTOR = 1e6 * (1 + Number.EPSILON); +const mergeRequestInit = (init1, init2)=>{ + const merged = { + ...init1, + ...init2 + }; + // Special handling for headers + if (init1.headers || init2.headers) { + const headers1 = init1.headers ? normalizeHeaders(init1.headers) : {}; + const headers2 = init2.headers ? normalizeHeaders(init2.headers) : {}; + const mergedHeaders = { + ...headers1 + }; + // For each header in headers2, check if a case-insensitive match exists in mergedHeaders + Object.entries(headers2).forEach(([key2, value2])=>{ + const existingKey = Object.keys(mergedHeaders).find((key1)=>key1.toLowerCase() === key2.toLowerCase()); + if (existingKey) delete mergedHeaders[existingKey]; + mergedHeaders[key2] = value2; + }); + merged.headers = mergedHeaders; + } + return merged; +}; +/** Normalizes HeadersInit to a Record format. */ const normalizeHeaders = (headers)=>{ + if (headers instanceof Headers) { + const result = {}; + headers.forEach((value, key)=>{ + result[key] = value; + }); + return result; + } + if (Array.isArray(headers)) { + const result = {}; + headers.forEach(([key, value])=>{ + result[key] = value; + }); + return result; + } + return headers; +}; +const retriedFetch = async (fetchFn, url, requestInit, getRetryDelay, shouldStop)=>{ + let attempts = 0; + while(true)try { + return await fetchFn(url, requestInit); + } catch (error) { + if (shouldStop()) throw error; + attempts++; + const retryDelayInSeconds = getRetryDelay(attempts, error, url); + if (retryDelayInSeconds === null) throw error; + console.error('Retrying failed fetch. Error:', error); + if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) throw new TypeError('Retry delay must be a non-negative finite number.'); + if (retryDelayInSeconds > 0) await new Promise((resolve)=>setTimeout(resolve, 1000 * retryDelayInSeconds)); + if (shouldStop()) throw error; + } +}; +const computeRationalApproximation = (x, maxDenominator)=>{ + // Handle negative numbers + const sign = x < 0 ? -1 : 1; + x = Math.abs(x); + let prevNumerator = 0, prevDenominator = 1; + let currNumerator = 1, currDenominator = 0; + // Continued fraction algorithm + let remainder = x; + while(true){ + const integer = Math.floor(remainder); + // Calculate next convergent + const nextNumerator = integer * currNumerator + prevNumerator; + const nextDenominator = integer * currDenominator + prevDenominator; + if (nextDenominator > maxDenominator) return { + numerator: sign * currNumerator, + denominator: currDenominator + }; + prevNumerator = currNumerator; + prevDenominator = currDenominator; + currNumerator = nextNumerator; + currDenominator = nextDenominator; + remainder = 1 / (remainder - integer); + // Guard against precision issues + if (!isFinite(remainder)) break; + } + return { + numerator: sign * currNumerator, + denominator: currDenominator + }; +}; +class CallSerializer { + constructor(){ + this.currentPromise = Promise.resolve(); + } + call(fn) { + return this.currentPromise = this.currentPromise.then(fn); + } +} +let isWebKitCache = null; +const isWebKit = ()=>{ + if (isWebKitCache !== null) return isWebKitCache; + // This even returns true for WebKit-wrapping browsers such as Chrome on iOS + return isWebKitCache = !!(typeof navigator !== 'undefined' && (navigator.vendor?.match(/apple/i) || /AppleWebKit/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) || /\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))); +}; +let isFirefoxCache = null; +const isFirefox = ()=>{ + if (isFirefoxCache !== null) return isFirefoxCache; + return isFirefoxCache = typeof navigator !== 'undefined' && navigator.userAgent?.includes('Firefox'); +}; +let isChromiumCache = null; +const isChromium = ()=>{ + if (isChromiumCache !== null) return isChromiumCache; + return isChromiumCache = !!(typeof navigator !== 'undefined' && (navigator.vendor?.includes('Google Inc') || /Chrome/.test(navigator.userAgent))); +}; +let chromiumVersionCache = null; +const getChromiumVersion = ()=>{ + if (chromiumVersionCache !== null) return chromiumVersionCache; + if (typeof navigator === 'undefined') return null; + const match = /\bChrome\/(\d+)/.exec(navigator.userAgent); + if (!match) return null; + return chromiumVersionCache = Number(match[1]); +}; +const coalesceIndex = (a, b)=>{ + return a !== -1 ? a : b; +}; +const closedIntervalsOverlap = (startA, endA, startB, endB)=>{ + return startA <= endB && startB <= endA; +}; +const keyValueIterator = function*(object) { + for(const key in object){ + const value = object[key]; + if (value === undefined) continue; + yield { + key, + value + }; + } +}; +const imageMimeTypeToExtension = (mimeType)=>{ + switch(mimeType.toLowerCase()){ + case 'image/jpeg': + case 'image/jpg': + return '.jpg'; + case 'image/png': + return '.png'; + case 'image/gif': + return '.gif'; + case 'image/webp': + return '.webp'; + case 'image/bmp': + return '.bmp'; + case 'image/svg+xml': + return '.svg'; + case 'image/tiff': + return '.tiff'; + case 'image/avif': + return '.avif'; + case 'image/x-icon': + case 'image/vnd.microsoft.icon': + return '.ico'; + default: + return null; + } +}; +const base64ToBytes = (base64)=>{ + const decoded = atob(base64); + const bytes = new Uint8Array(decoded.length); + for(let i = 0; i < decoded.length; i++)bytes[i] = decoded.charCodeAt(i); + return bytes; +}; +const bytesToBase64 = (bytes)=>{ + let string = ''; + for(let i = 0; i < bytes.length; i++)string += String.fromCharCode(bytes[i]); + return btoa(string); +}; +const uint8ArraysAreEqual = (a, b)=>{ + if (a.length !== b.length) return false; + for(let i = 0; i < a.length; i++){ + if (a[i] !== b[i]) return false; + } + return true; +}; +const polyfillSymbolDispose = ()=>{ + // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html + // @ts-expect-error Readonly + Symbol.dispose ??= Symbol('Symbol.dispose'); +}; +const isNumber = (x)=>{ + return typeof x === 'number' && !Number.isNaN(x); +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"8oCsH":[function(require,module,exports,__globalThis) { +exports.interopDefault = function(a) { + return a && a.__esModule ? a : { + default: a + }; +}; +exports.defineInteropFlag = function(a) { + Object.defineProperty(a, '__esModule', { + value: true + }); +}; +exports.exportAll = function(source, dest) { + Object.keys(source).forEach(function(key) { + if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) return; + Object.defineProperty(dest, key, { + enumerable: true, + get: function() { + return source[key]; + } + }); + }); + return dest; +}; +exports.export = function(dest, destName, get) { + Object.defineProperty(dest, destName, { + enumerable: true, + get: get + }); +}; + +},{}],"99VTc":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * The source base class, representing a resource from which bytes can be read. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "Source", ()=>Source); +/** + * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "BufferSource", ()=>BufferSource); +/** + * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a + * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when + * reading files off the disk. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "BlobSource", ()=>BlobSource); +/** + * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized + * reading and prefetching pattern to minimize request count and latency. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "UrlSource", ()=>UrlSource); +/** + * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno. + * + * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file + * handle acquired by this source. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "FilePathSource", ()=>FilePathSource); +/** + * A general-purpose, callback-driven source that can get its data from anywhere. + * @group Input sources + * @public + */ parcelHelpers.export(exports, "StreamSource", ()=>StreamSource); +/** + * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of + * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally + * streaming in input files that are still being constructed and whose size we don't yet know, like for example the + * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder). + * + * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the + * lack of random file access. You should only use this source with sequential access patterns, such as reading all + * packets from start to end. This source does not work well with random access patterns unless you increase its + * max cache size. + * + * @group Input sources + * @public + */ parcelHelpers.export(exports, "ReadableStreamSource", ()=>ReadableStreamSource); +var _miscJs = require("./misc.js"); +var _nodeJs = require("./node.js"); +var _inputJs = require("./input.js"); +const node = typeof _nodeJs !== 'undefined' ? _nodeJs // Aliasing it prevents some bundler warnings + : undefined; +class Source { + constructor(){ + /** @internal */ this._disposed = false; + /** @internal */ this._sizePromise = null; + /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */ this.onread = null; + } + /** + * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call + * will retrieve the size. + * + * Returns null if the source is unsized. + */ async getSizeOrNull() { + if (this._disposed) throw new (0, _inputJs.InputDisposedError)(); + return this._sizePromise ??= Promise.resolve(this._retrieveSize()); + } + /** + * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call + * will retrieve the size. + * + * Throws an error if the source is unsized. + */ async getSize() { + if (this._disposed) throw new (0, _inputJs.InputDisposedError)(); + const result = await this.getSizeOrNull(); + if (result === null) throw new Error('Cannot determine the size of an unsized source.'); + return result; + } +} +class BufferSource extends Source { + /** + * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`, + * or `ArrayBufferView`. + */ constructor(buffer){ + if (!(buffer instanceof ArrayBuffer) && !(typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) && !ArrayBuffer.isView(buffer)) throw new TypeError('buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.'); + super(); + /** @internal */ this._onreadCalled = false; + this._bytes = (0, _miscJs.toUint8Array)(buffer); + this._view = (0, _miscJs.toDataView)(buffer); + } + /** @internal */ _retrieveSize() { + return this._bytes.byteLength; + } + /** @internal */ _read() { + if (!this._onreadCalled) { + // We just say the first read retrives all bytes from the source (which, I mean, it does) + this.onread?.(0, this._bytes.byteLength); + this._onreadCalled = true; + } + return { + bytes: this._bytes, + view: this._view, + offset: 0 + }; + } + /** @internal */ _dispose() {} +} +class BlobSource extends Source { + /** + * Creates a new {@link BlobSource} backed by the specified + * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). + */ constructor(blob, options = {}){ + if (!(blob instanceof Blob)) throw new TypeError('blob must be a Blob.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.maxCacheSize !== undefined && (!(0, _miscJs.isNumber)(options.maxCacheSize) || options.maxCacheSize < 0)) throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.'); + super(); + /** @internal */ this._readers = new WeakMap(); + this._blob = blob; + this._orchestrator = new ReadOrchestrator({ + maxCacheSize: options.maxCacheSize ?? 8 * 2 ** 20 /* 8 MiB */ , + maxWorkerCount: 4, + runWorker: this._runWorker.bind(this), + prefetchProfile: PREFETCH_PROFILES.fileSystem + }); + } + /** @internal */ _retrieveSize() { + const size = this._blob.size; + this._orchestrator.fileSize = size; + return size; + } + /** @internal */ _read(start, end) { + return this._orchestrator.read(start, end); + } + /** @internal */ async _runWorker(worker) { + let reader = this._readers.get(worker); + if (reader === undefined) { + // https://github.com/Vanilagy/mediabunny/issues/184 + // WebKit has critical bugs with blob.stream(): + // - WebKitBlobResource error 1 when streaming large files + // - Memory buildup and reload loops on iOS (network process crashes) + // - ReadableStream stalls under backpressure (especially video) + // Affects Safari and all iOS browsers (Chrome, Firefox, etc.). + // Use arrayBuffer() fallback for WebKit browsers. + if ('stream' in this._blob && !(0, _miscJs.isWebKit)()) { + // Get a reader of the blob starting at the required offset, and then keep it around + const slice = this._blob.slice(worker.currentPos); + reader = slice.stream().getReader(); + } else // We'll need to use more primitive ways + reader = null; + this._readers.set(worker, reader); + } + while(worker.currentPos < worker.targetPos && !worker.aborted)if (reader) { + const { done, value } = await reader.read(); + if (done) { + this._orchestrator.forgetWorker(worker); + throw new Error('Blob reader stopped unexpectedly before all requested data was read.'); + } + if (worker.aborted) break; + this.onread?.(worker.currentPos, worker.currentPos + value.length); + this._orchestrator.supplyWorkerData(worker, value); + } else { + const data = await this._blob.slice(worker.currentPos, worker.targetPos).arrayBuffer(); + if (worker.aborted) break; + this.onread?.(worker.currentPos, worker.currentPos + data.byteLength); + this._orchestrator.supplyWorkerData(worker, new Uint8Array(data)); + } + worker.running = false; + } + /** @internal */ _dispose() { + this._orchestrator.dispose(); + } +} +const URL_SOURCE_MIN_LOAD_AMOUNT = 0.5 * 2 ** 20; // 0.5 MiB +const DEFAULT_RETRY_DELAY = (previousAttempts, error, src)=>{ + // Check if this could be a CORS error. If so, we cannot recover from it and + // should not attempt to retry. + // CORS errors are intentionally not opaque, so we need to rely on heuristics. + const couldBeCorsError = error instanceof Error && (error.message.includes('Failed to fetch') // Chrome + || error.message.includes('Load failed') // Safari + || error.message.includes('NetworkError when attempting to fetch resource') // Firefox + ); + if (couldBeCorsError) { + let originOfSrc = null; + // Checking if the origin is different, because only then a CORS error could originate + try { + if (typeof window !== 'undefined' && typeof window.location !== 'undefined') originOfSrc = new URL(src instanceof Request ? src.url : src, window.location.href).origin; + } catch { + // URL parse failed + } + // If user is offline, it is probably not a CORS error. + const isOnline = typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true; + if (isOnline && originOfSrc !== null && originOfSrc !== window.location.origin) { + console.warn(`Request will not be retried because a CORS error was suspected due to different origins. You can` + ` modify this behavior by providing your own function for the 'getRetryDelay' option.`); + return null; + } + } + return Math.min(2 ** (previousAttempts - 2), 16); +}; +class UrlSource extends Source { + /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */ constructor(url, options = {}){ + if (typeof url !== 'string' && !(url instanceof URL) && !(typeof Request !== 'undefined' && url instanceof Request)) throw new TypeError('url must be a string, URL or Request.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) throw new TypeError('options.requestInit, when provided, must be an object.'); + if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') throw new TypeError('options.getRetryDelay, when provided, must be a function.'); + if (options.maxCacheSize !== undefined && (!(0, _miscJs.isNumber)(options.maxCacheSize) || options.maxCacheSize < 0)) throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.'); + if (options.fetchFn !== undefined && typeof options.fetchFn !== 'function') throw new TypeError('options.fetchFn, when provided, must be a function.'); + super(); + /** @internal */ this._existingResponses = new WeakMap(); + this._url = url; + this._options = options; + this._getRetryDelay = options.getRetryDelay ?? DEFAULT_RETRY_DELAY; + this._orchestrator = new ReadOrchestrator({ + maxCacheSize: options.maxCacheSize ?? 64 * 2 ** 20 /* 64 MiB */ , + // Most files in the real-world have a single sequential access pattern, but having two in parallel can + // also happen + maxWorkerCount: 2, + runWorker: this._runWorker.bind(this), + prefetchProfile: PREFETCH_PROFILES.network + }); + } + /** @internal */ async _retrieveSize() { + // Retrieving the resource size for UrlSource is optimized: Almost always (= always), the first bytes we have to + // read are the start of the file. This means it's smart to combine size fetching with fetching the start of the + // file. We additionally use this step to probe if the server supports range requests, killing three birds with + // one stone. + const abortController = new AbortController(); + const response = await (0, _miscJs.retriedFetch)(this._options.fetchFn ?? fetch, this._url, (0, _miscJs.mergeRequestInit)(this._options.requestInit ?? {}, { + headers: { + // We could also send a non-range request to request the same bytes (all of them), but doing it like + // this is an easy way to check if the server supports range requests in the first place + Range: 'bytes=0-' + }, + signal: abortController.signal + }), this._getRetryDelay, ()=>this._disposed); + if (!response.ok) // eslint-disable-next-line @typescript-eslint/no-base-to-string + throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`); + let worker; + let fileSize; + if (response.status === 206) { + fileSize = this._getTotalLengthFromRangeResponse(response); + worker = this._orchestrator.createWorker(0, Math.min(fileSize, URL_SOURCE_MIN_LOAD_AMOUNT)); + } else { + // Server probably returned a 200. + const contentLength = response.headers.get('Content-Length'); + if (contentLength) { + fileSize = Number(contentLength); + worker = this._orchestrator.createWorker(0, fileSize); + this._orchestrator.options.maxCacheSize = Infinity; // 🤷 + console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests."); + } else throw new Error(`HTTP response (status ${response.status}) must surface Content-Length header.`); + } + this._orchestrator.fileSize = fileSize; + this._existingResponses.set(worker, { + response, + abortController + }); + this._orchestrator.runWorker(worker); + return fileSize; + } + /** @internal */ _read(start, end) { + return this._orchestrator.read(start, end); + } + /** @internal */ async _runWorker(worker) { + // The outer loop is for resuming a request if it dies mid-response + while(true){ + const existing = this._existingResponses.get(worker); + this._existingResponses.delete(worker); + let abortController = existing?.abortController; + let response = existing?.response; + if (!abortController) { + abortController = new AbortController(); + response = await (0, _miscJs.retriedFetch)(this._options.fetchFn ?? fetch, this._url, (0, _miscJs.mergeRequestInit)(this._options.requestInit ?? {}, { + headers: { + Range: `bytes=${worker.currentPos}-` + }, + signal: abortController.signal + }), this._getRetryDelay, ()=>this._disposed); + } + (0, _miscJs.assert)(response); + if (!response.ok) // eslint-disable-next-line @typescript-eslint/no-base-to-string + throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`); + if (worker.currentPos > 0 && response.status !== 206) throw new Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests."); + if (!response.body) throw new Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream."); + const reader = response.body.getReader(); + while(true){ + if (worker.currentPos >= worker.targetPos || worker.aborted) { + abortController.abort(); + worker.running = false; + return; + } + let readResult; + try { + readResult = await reader.read(); + } catch (error) { + if (this._disposed) // No need to try to retry + throw error; + const retryDelayInSeconds = this._getRetryDelay(1, error, this._url); + if (retryDelayInSeconds !== null) { + console.error('Error while reading response stream. Attempting to resume.', error); + await new Promise((resolve)=>setTimeout(resolve, 1000 * retryDelayInSeconds)); + break; + } else throw error; + } + if (worker.aborted) break; + const { done, value } = readResult; + if (done) { + if (worker.currentPos >= worker.targetPos) { + // All data was delivered, we're good + this._orchestrator.forgetWorker(worker); + worker.running = false; + return; + } + break; + } + this.onread?.(worker.currentPos, worker.currentPos + value.length); + this._orchestrator.supplyWorkerData(worker, value); + } + if (worker.aborted) break; + } + worker.running = false; + // The previous UrlSource had logic for circumventing https://issues.chromium.org/issues/436025873; I haven't + // been able to observe this bug with the new UrlSource (maybe because we're using response streaming), so the + // logic for that has vanished for now. Leaving a comment here if this becomes relevant again. + } + /** @internal */ _getTotalLengthFromRangeResponse(response) { + const contentRange = response.headers.get('Content-Range'); + if (contentRange) { + const match = /\/(\d+)/.exec(contentRange); + if (match) return Number(match[1]); + } + const contentLength = response.headers.get('Content-Length'); + if (contentLength) return Number(contentLength); + else throw new Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header."); + } + /** @internal */ _dispose() { + this._orchestrator.dispose(); + } +} +class FilePathSource extends Source { + /** Creates a new {@link FilePathSource} backed by the file at the specified file path. */ constructor(filePath, options = {}){ + if (typeof filePath !== 'string') throw new TypeError('filePath must be a string.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.maxCacheSize !== undefined && (!(0, _miscJs.isNumber)(options.maxCacheSize) || options.maxCacheSize < 0)) throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.'); + super(); + /** @internal */ this._fileHandle = null; + // Let's back this source with a StreamSource, makes the implementation very simple + this._streamSource = new StreamSource({ + getSize: async ()=>{ + this._fileHandle = await node.fs.open(filePath, 'r'); + const stats = await this._fileHandle.stat(); + return stats.size; + }, + read: async (start, end)=>{ + (0, _miscJs.assert)(this._fileHandle); + const buffer = new Uint8Array(end - start); + await this._fileHandle.read(buffer, 0, end - start, start); + return buffer; + }, + maxCacheSize: options.maxCacheSize, + prefetchProfile: 'fileSystem' + }); + } + /** @internal */ _read(start, end) { + return this._streamSource._read(start, end); + } + /** @internal */ _retrieveSize() { + return this._streamSource._retrieveSize(); + } + /** @internal */ _dispose() { + this._streamSource._dispose(); + this._fileHandle?.close(); + this._fileHandle = null; + } +} +class StreamSource extends Source { + /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */ constructor(options){ + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (typeof options.getSize !== 'function') throw new TypeError('options.getSize must be a function.'); + if (typeof options.read !== 'function') throw new TypeError('options.read must be a function.'); + if (options.dispose !== undefined && typeof options.dispose !== 'function') throw new TypeError('options.dispose, when provided, must be a function.'); + if (options.maxCacheSize !== undefined && (!(0, _miscJs.isNumber)(options.maxCacheSize) || options.maxCacheSize < 0)) throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.'); + if (options.prefetchProfile && ![ + 'none', + 'fileSystem', + 'network' + ].includes(options.prefetchProfile)) throw new TypeError('options.prefetchProfile, when provided, must be one of \'none\', \'fileSystem\' or \'network\'.'); + super(); + this._options = options; + this._orchestrator = new ReadOrchestrator({ + maxCacheSize: options.maxCacheSize ?? 8 * 2 ** 20 /* 8 MiB */ , + maxWorkerCount: 2, + prefetchProfile: PREFETCH_PROFILES[options.prefetchProfile ?? 'none'], + runWorker: this._runWorker.bind(this) + }); + } + /** @internal */ _retrieveSize() { + const result = this._options.getSize(); + if (result instanceof Promise) return result.then((size)=>{ + if (!Number.isInteger(size) || size < 0) throw new TypeError('options.getSize must return or resolve to a non-negative integer.'); + this._orchestrator.fileSize = size; + return size; + }); + else { + if (!Number.isInteger(result) || result < 0) throw new TypeError('options.getSize must return or resolve to a non-negative integer.'); + this._orchestrator.fileSize = result; + return result; + } + } + /** @internal */ _read(start, end) { + return this._orchestrator.read(start, end); + } + /** @internal */ async _runWorker(worker) { + while(worker.currentPos < worker.targetPos && !worker.aborted){ + const originalCurrentPos = worker.currentPos; + const originalTargetPos = worker.targetPos; + let data = this._options.read(worker.currentPos, originalTargetPos); + if (data instanceof Promise) data = await data; + if (worker.aborted) break; + if (data instanceof Uint8Array) { + data = (0, _miscJs.toUint8Array)(data); // Normalize things like Node.js Buffer to Uint8Array + if (data.length !== originalTargetPos - worker.currentPos) // Yes, we're that strict + throw new Error(`options.read returned a Uint8Array with unexpected length: Requested ${originalTargetPos - worker.currentPos} bytes, but got ${data.length}.`); + this.onread?.(worker.currentPos, worker.currentPos + data.length); + this._orchestrator.supplyWorkerData(worker, data); + } else if (data instanceof ReadableStream) { + const reader = data.getReader(); + while(worker.currentPos < originalTargetPos && !worker.aborted){ + const { done, value } = await reader.read(); + if (done) { + if (worker.currentPos < originalTargetPos) // Yes, we're *that* strict + throw new Error(`ReadableStream returned by options.read ended before supplying enough data.` + ` Requested ${originalTargetPos - originalCurrentPos} bytes, but got ${worker.currentPos - originalCurrentPos}`); + break; + } + if (!(value instanceof Uint8Array)) throw new TypeError('ReadableStream returned by options.read must yield Uint8Array chunks.'); + if (worker.aborted) break; + const data = (0, _miscJs.toUint8Array)(value); // Normalize things like Node.js Buffer to Uint8Array + this.onread?.(worker.currentPos, worker.currentPos + data.length); + this._orchestrator.supplyWorkerData(worker, data); + } + } else throw new TypeError('options.read must return or resolve to a Uint8Array or a ReadableStream.'); + } + worker.running = false; + } + /** @internal */ _dispose() { + this._orchestrator.dispose(); + this._options.dispose?.(); + } +} +class ReadableStreamSource extends Source { + /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */ constructor(stream, options = {}){ + if (!(stream instanceof ReadableStream)) throw new TypeError('stream must be a ReadableStream.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.maxCacheSize !== undefined && (!(0, _miscJs.isNumber)(options.maxCacheSize) || options.maxCacheSize < 0)) throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.'); + super(); + /** @internal */ this._reader = null; + /** @internal */ this._cache = []; + /** @internal */ this._pendingSlices = []; + /** @internal */ this._currentIndex = 0; + /** @internal */ this._targetIndex = 0; + /** @internal */ this._maxRequestedIndex = 0; + /** @internal */ this._endIndex = null; + /** @internal */ this._pulling = false; + this._stream = stream; + this._maxCacheSize = options.maxCacheSize ?? 16 * 2 ** 20 /* 16 MiB */ ; + } + /** @internal */ _retrieveSize() { + return this._endIndex; // Starts out as null, meaning this source is unsized + } + /** @internal */ _read(start, end) { + if (this._endIndex !== null && end > this._endIndex) return null; + this._maxRequestedIndex = Math.max(this._maxRequestedIndex, end); + const cacheStartIndex = (0, _miscJs.binarySearchLessOrEqual)(this._cache, start, (x)=>x.start); + const cacheStartEntry = cacheStartIndex !== -1 ? this._cache[cacheStartIndex] : null; + if (cacheStartEntry && cacheStartEntry.start <= start && end <= cacheStartEntry.end) // The request can be satisfied with a single cache entry + return { + bytes: cacheStartEntry.bytes, + view: cacheStartEntry.view, + offset: cacheStartEntry.start + }; + let lastEnd = start; + const bytes = new Uint8Array(end - start); + if (cacheStartIndex !== -1) // Walk over the cache to see if we can satisfy the request using multiple cache entries + for(let i = cacheStartIndex; i < this._cache.length; i++){ + const cacheEntry = this._cache[i]; + if (cacheEntry.start >= end) break; + const cappedStart = Math.max(start, cacheEntry.start); + if (cappedStart > lastEnd) // We're too far behind + this._throwDueToCacheMiss(); + const cappedEnd = Math.min(end, cacheEntry.end); + if (cappedStart < cappedEnd) { + bytes.set(cacheEntry.bytes.subarray(cappedStart - cacheEntry.start, cappedEnd - cacheEntry.start), cappedStart - start); + lastEnd = cappedEnd; + } + } + if (lastEnd === end) return { + bytes, + view: (0, _miscJs.toDataView)(bytes), + offset: start + }; + // We need to pull more data + if (this._currentIndex > lastEnd) // We're too far behind + this._throwDueToCacheMiss(); + const { promise, resolve, reject } = (0, _miscJs.promiseWithResolvers)(); + this._pendingSlices.push({ + start, + end, + bytes, + resolve, + reject + }); + this._targetIndex = Math.max(this._targetIndex, end); + // Start pulling from the stream if we're not already doing it + if (!this._pulling) { + this._pulling = true; + this._pull().catch((error)=>{ + this._pulling = false; + if (this._pendingSlices.length > 0) { + this._pendingSlices.forEach((x)=>x.reject(error)); // Make sure to propagate any errors + this._pendingSlices.length = 0; + } else throw error; // So it doesn't get swallowed + }); + } + return promise; + } + /** @internal */ _throwDueToCacheMiss() { + throw new Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache."); + } + /** @internal */ async _pull() { + this._reader ??= this._stream.getReader(); + // This is the loop that keeps pulling data from the stream until a target index is reached, filling requests + // in the process + while(this._currentIndex < this._targetIndex && !this._disposed){ + const { done, value } = await this._reader.read(); + if (done) { + for (const pendingSlice of this._pendingSlices)pendingSlice.resolve(null); + this._pendingSlices.length = 0; + this._endIndex = this._currentIndex; // We know how long the file is now! + break; + } + const startIndex = this._currentIndex; + const endIndex = this._currentIndex + value.byteLength; + // Fill the pending slices with the data + for(let i = 0; i < this._pendingSlices.length; i++){ + const pendingSlice = this._pendingSlices[i]; + const cappedStart = Math.max(startIndex, pendingSlice.start); + const cappedEnd = Math.min(endIndex, pendingSlice.end); + if (cappedStart < cappedEnd) { + pendingSlice.bytes.set(value.subarray(cappedStart - startIndex, cappedEnd - startIndex), cappedStart - pendingSlice.start); + if (cappedEnd === pendingSlice.end) { + // Pending slice fully filled + pendingSlice.resolve({ + bytes: pendingSlice.bytes, + view: (0, _miscJs.toDataView)(pendingSlice.bytes), + offset: pendingSlice.start + }); + this._pendingSlices.splice(i, 1); + i--; + } + } + } + this._cache.push({ + start: startIndex, + end: endIndex, + bytes: value, + view: (0, _miscJs.toDataView)(value), + age: 0 + }); + // Do cache eviction, based on the distance from the last-requested index. It's important that we do it like + // this and not based on where the reader is at, because if the reader is fast, we'll unnecessarily evict + // data that we still might need. + while(this._cache.length > 0){ + const firstEntry = this._cache[0]; + const distance = this._maxRequestedIndex - firstEntry.end; + if (distance <= this._maxCacheSize) break; + this._cache.shift(); + } + this._currentIndex += value.byteLength; + } + this._pulling = false; + } + /** @internal */ _dispose() { + this._pendingSlices.length = 0; + this._cache.length = 0; + } +} +const PREFETCH_PROFILES = { + none: (start, end)=>({ + start, + end + }), + fileSystem: (start, end)=>{ + const padding = 2 ** 16; + start = Math.floor((start - padding) / padding) * padding; + end = Math.ceil((end + padding) / padding) * padding; + return { + start, + end + }; + }, + network: (start, end, workers)=>{ + // Add a slight bit of start padding because backwards reading is painful + const paddingStart = 2 ** 16; + start = Math.max(0, Math.floor((start - paddingStart) / paddingStart) * paddingStart); + // Remote resources have extreme latency (relatively speaking), so the benefit from intelligent + // prefetching is great. The network prefetch strategy is as follows: When we notice + // successive reads to a worker's read region, we prefetch more data at the end of that region, + // growing exponentially (up to a cap). This performs well for real-world use cases: Either we read a + // small part of the file once and then never need it again, in which case the requested about of data + // is small. Or, we're repeatedly doing a sequential access pattern (common in media files), in which + // case we can become more and more confident to prefetch more and more data. + for (const worker of workers){ + const maxExtensionAmount = 8 * 2 ** 20; // 8 MiB + // When the read region cross the threshold point, we trigger a prefetch. This point is typically + // in the middle of the worker's read region, or a fixed offset from the end if the region has grown + // really large. + const thresholdPoint = Math.max((worker.startPos + worker.targetPos) / 2, worker.targetPos - maxExtensionAmount); + if ((0, _miscJs.closedIntervalsOverlap)(start, end, thresholdPoint, worker.targetPos)) { + const size = worker.targetPos - worker.startPos; + // If we extend by maxExtensionAmount + const a = Math.ceil((size + 1) / maxExtensionAmount) * maxExtensionAmount; + // If we extend to the next power of 2 + const b = 2 ** Math.ceil(Math.log2(size + 1)); + const extent = Math.min(b, a); + end = Math.max(end, worker.startPos + extent); + } + } + end = Math.max(end, start + URL_SOURCE_MIN_LOAD_AMOUNT); + return { + start, + end + }; + } +}; +/** + * Godclass for orchestrating complex, cached read operations. The reading model is as follows: Any reading task is + * delegated to a *worker*, which is a sequential reader positioned somewhere along the file. All workers run in + * parallel and can be stopped and resumed in their forward movement. When read requests come in, this orchestrator will + * first try to satisfy the request with only the cached data. If this isn't possible, workers are spun up for all + * missing parts (or existing workers are repurposed), and these workers will then fill the holes in the data as they + * march along the file. + */ class ReadOrchestrator { + constructor(options){ + this.options = options; + this.fileSize = null; + this.nextAge = 0; // Used for LRU eviction of both cache entries and workers + this.workers = []; + this.cache = []; + this.currentCacheSize = 0; + this.disposed = false; + } + read(innerStart, innerEnd) { + (0, _miscJs.assert)(this.fileSize !== null); + const prefetchRange = this.options.prefetchProfile(innerStart, innerEnd, this.workers); + const outerStart = Math.max(prefetchRange.start, 0); + const outerEnd = Math.min(prefetchRange.end, this.fileSize); + (0, _miscJs.assert)(outerStart <= innerStart && innerEnd <= outerEnd); + let result = null; + const innerCacheStartIndex = (0, _miscJs.binarySearchLessOrEqual)(this.cache, innerStart, (x)=>x.start); + const innerStartEntry = innerCacheStartIndex !== -1 ? this.cache[innerCacheStartIndex] : null; + // See if the read request can be satisfied by a single cache entry + if (innerStartEntry && innerStartEntry.start <= innerStart && innerEnd <= innerStartEntry.end) { + innerStartEntry.age = this.nextAge++; + result = { + bytes: innerStartEntry.bytes, + view: innerStartEntry.view, + offset: innerStartEntry.start + }; + // Can't return yet though, still need to check if the prefetch range might lie outside the cached area + } + const outerCacheStartIndex = (0, _miscJs.binarySearchLessOrEqual)(this.cache, outerStart, (x)=>x.start); + const bytes = result ? null : new Uint8Array(innerEnd - innerStart); + let contiguousBytesWriteEnd = 0; // Used to track if the cache is able to completely cover the bytes + let lastEnd = outerStart; + // The "holes" in the cache (the parts we need to load) + const outerHoles = []; + // Loop over the cache and build up the list of holes + if (outerCacheStartIndex !== -1) { + for(let i = outerCacheStartIndex; i < this.cache.length; i++){ + const entry = this.cache[i]; + if (entry.start >= outerEnd) break; + if (entry.end <= outerStart) continue; + const cappedOuterStart = Math.max(outerStart, entry.start); + const cappedOuterEnd = Math.min(outerEnd, entry.end); + (0, _miscJs.assert)(cappedOuterStart <= cappedOuterEnd); + if (lastEnd < cappedOuterStart) outerHoles.push({ + start: lastEnd, + end: cappedOuterStart + }); + lastEnd = cappedOuterEnd; + if (bytes) { + const cappedInnerStart = Math.max(innerStart, entry.start); + const cappedInnerEnd = Math.min(innerEnd, entry.end); + if (cappedInnerStart < cappedInnerEnd) { + const relativeOffset = cappedInnerStart - innerStart; + // Fill the relevant section of the bytes with the cached data + bytes.set(entry.bytes.subarray(cappedInnerStart - entry.start, cappedInnerEnd - entry.start), relativeOffset); + if (relativeOffset === contiguousBytesWriteEnd) contiguousBytesWriteEnd = cappedInnerEnd - innerStart; + } + } + entry.age = this.nextAge++; + } + if (lastEnd < outerEnd) outerHoles.push({ + start: lastEnd, + end: outerEnd + }); + } else outerHoles.push({ + start: outerStart, + end: outerEnd + }); + if (bytes && contiguousBytesWriteEnd >= bytes.length) // Multiple cache entries were able to completely cover the requested bytes! + result = { + bytes, + view: (0, _miscJs.toDataView)(bytes), + offset: innerStart + }; + if (outerHoles.length === 0) { + (0, _miscJs.assert)(result); + return result; + } + // We need to read more data, so now we're in async land + const { promise, resolve, reject } = (0, _miscJs.promiseWithResolvers)(); + const innerHoles = []; + for (const outerHole of outerHoles){ + const cappedStart = Math.max(innerStart, outerHole.start); + const cappedEnd = Math.min(innerEnd, outerHole.end); + if (cappedStart === outerHole.start && cappedEnd === outerHole.end) innerHoles.push(outerHole); // Can reuse without allocating a new object + else if (cappedStart < cappedEnd) innerHoles.push({ + start: cappedStart, + end: cappedEnd + }); + } + // Fire off workers to take care of patching the holes + for (const outerHole of outerHoles){ + const pendingSlice = bytes && { + start: innerStart, + bytes, + holes: innerHoles, + resolve, + reject + }; + let workerFound = false; + for (const worker of this.workers){ + // A small tolerance in the case that the requested region is *just* after the target position of an + // existing worker. In that case, it's probably more efficient to repurpose that worker than to spawn + // another one so close to it + const gapTolerance = 2 ** 17; + // This check also implies worker.currentPos <= outerHole.start, a critical condition + if ((0, _miscJs.closedIntervalsOverlap)(outerHole.start - gapTolerance, outerHole.start, worker.currentPos, worker.targetPos)) { + worker.targetPos = Math.max(worker.targetPos, outerHole.end); // Update the worker's target position + workerFound = true; + if (pendingSlice && !worker.pendingSlices.includes(pendingSlice)) worker.pendingSlices.push(pendingSlice); + if (!worker.running) // Kick it off if it's idle + this.runWorker(worker); + break; + } + } + if (!workerFound) { + // We need to spawn a new worker + const newWorker = this.createWorker(outerHole.start, outerHole.end); + if (pendingSlice) newWorker.pendingSlices = [ + pendingSlice + ]; + this.runWorker(newWorker); + } + } + if (!result) { + (0, _miscJs.assert)(bytes); + result = promise.then((bytes)=>({ + bytes, + view: (0, _miscJs.toDataView)(bytes), + offset: innerStart + })); + } + return result; + } + createWorker(startPos, targetPos) { + const worker = { + startPos, + currentPos: startPos, + targetPos, + running: false, + // Due to async shenanigans, it can happen that workers are started after disposal. In this case, instead of + // simply not creating the worker, we allow it to run but immediately label it as aborted, so it can then + // shut itself down. + aborted: this.disposed, + pendingSlices: [], + age: this.nextAge++ + }; + this.workers.push(worker); + // LRU eviction of the other workers + while(this.workers.length > this.options.maxWorkerCount){ + let oldestIndex = 0; + let oldestWorker = this.workers[0]; + for(let i = 1; i < this.workers.length; i++){ + const worker = this.workers[i]; + if (worker.age < oldestWorker.age) { + oldestIndex = i; + oldestWorker = worker; + } + } + if (oldestWorker.running && oldestWorker.pendingSlices.length > 0) break; + oldestWorker.aborted = true; + this.workers.splice(oldestIndex, 1); + } + return worker; + } + runWorker(worker) { + (0, _miscJs.assert)(!worker.running); + (0, _miscJs.assert)(worker.currentPos < worker.targetPos); + worker.running = true; + worker.age = this.nextAge++; + this.options.runWorker(worker).catch((error)=>{ + worker.running = false; + if (worker.pendingSlices.length > 0) { + worker.pendingSlices.forEach((x)=>x.reject(error)); // Make sure to propagate any errors + worker.pendingSlices.length = 0; + } else throw error; // So it doesn't get swallowed + }); + } + /** Called by a worker when it has read some data. */ supplyWorkerData(worker, bytes) { + (0, _miscJs.assert)(!worker.aborted); + const start = worker.currentPos; + const end = start + bytes.length; + this.insertIntoCache({ + start, + end, + bytes, + view: (0, _miscJs.toDataView)(bytes), + age: this.nextAge++ + }); + worker.currentPos += bytes.length; + worker.targetPos = Math.max(worker.targetPos, worker.currentPos); // In case it overshoots + // Now, let's see if we can use the read bytes to fill any pending slice + for(let i = 0; i < worker.pendingSlices.length; i++){ + const pendingSlice = worker.pendingSlices[i]; + const clampedStart = Math.max(start, pendingSlice.start); + const clampedEnd = Math.min(end, pendingSlice.start + pendingSlice.bytes.length); + if (clampedStart < clampedEnd) pendingSlice.bytes.set(bytes.subarray(clampedStart - start, clampedEnd - start), clampedStart - pendingSlice.start); + for(let j = 0; j < pendingSlice.holes.length; j++){ + // The hole is intentionally not modified here if the read section starts somewhere in the middle of + // the hole. We don't need to do "hole splitting", since the workers are spawned *by* the holes, + // meaning there's always a worker which will consume the hole left to right. + const hole = pendingSlice.holes[j]; + if (start <= hole.start && end > hole.start) hole.start = end; + if (hole.end <= hole.start) { + pendingSlice.holes.splice(j, 1); + j--; + } + } + if (pendingSlice.holes.length === 0) { + // The slice has been fulfilled, everything has been read. Let's resolve the promise + pendingSlice.resolve(pendingSlice.bytes); + worker.pendingSlices.splice(i, 1); + i--; + } + } + // Remove other idle workers if we "ate" into their territory + for(let i = 0; i < this.workers.length; i++){ + const otherWorker = this.workers[i]; + if (worker === otherWorker || otherWorker.running) continue; + if ((0, _miscJs.closedIntervalsOverlap)(start, end, otherWorker.currentPos, otherWorker.targetPos)) { + this.workers.splice(i, 1); + i--; + } + } + } + forgetWorker(worker) { + const index = this.workers.indexOf(worker); + (0, _miscJs.assert)(index !== -1); + this.workers.splice(index, 1); + } + insertIntoCache(entry) { + if (this.options.maxCacheSize === 0) return; // No caching + let insertionIndex = (0, _miscJs.binarySearchLessOrEqual)(this.cache, entry.start, (x)=>x.start) + 1; + if (insertionIndex > 0) { + const previous = this.cache[insertionIndex - 1]; + if (previous.end >= entry.end) // Previous entry swallows the one to be inserted; we don't need to do anything + return; + if (previous.end > entry.start) { + // Partial overlap with the previous entry, let's join + const joined = new Uint8Array(entry.end - previous.start); + joined.set(previous.bytes, 0); + joined.set(entry.bytes, entry.start - previous.start); + this.currentCacheSize += entry.end - previous.end; + previous.bytes = joined; + previous.view = (0, _miscJs.toDataView)(joined); + previous.end = entry.end; + // Do the rest of the logic with the previous entry instead + insertionIndex--; + entry = previous; + } else { + this.cache.splice(insertionIndex, 0, entry); + this.currentCacheSize += entry.bytes.length; + } + } else { + this.cache.splice(insertionIndex, 0, entry); + this.currentCacheSize += entry.bytes.length; + } + for(let i = insertionIndex + 1; i < this.cache.length; i++){ + const next = this.cache[i]; + if (entry.end <= next.start) break; + if (entry.end >= next.end) { + // The inserted entry completely swallows the next entry + this.cache.splice(i, 1); + this.currentCacheSize -= next.bytes.length; + i--; + continue; + } + // Partial overlap, let's join + const joined = new Uint8Array(next.end - entry.start); + joined.set(entry.bytes, 0); + joined.set(next.bytes, next.start - entry.start); + this.currentCacheSize -= entry.end - next.start; // Subtract the overlap + entry.bytes = joined; + entry.view = (0, _miscJs.toDataView)(joined); + entry.end = next.end; + this.cache.splice(i, 1); + break; // After the join case, we're done: the next entry cannot possibly overlap with the inserted one. + } + // LRU eviction of cache entries + while(this.currentCacheSize > this.options.maxCacheSize){ + let oldestIndex = 0; + let oldestEntry = this.cache[0]; + for(let i = 1; i < this.cache.length; i++){ + const entry = this.cache[i]; + if (entry.age < oldestEntry.age) { + oldestIndex = i; + oldestEntry = entry; + } + } + if (this.currentCacheSize - oldestEntry.bytes.length <= this.options.maxCacheSize) break; + this.cache.splice(oldestIndex, 1); + this.currentCacheSize -= oldestEntry.bytes.length; + } + } + dispose() { + for (const worker of this.workers)worker.aborted = true; + this.workers.length = 0; + this.cache.length = 0; + this.disposed = true; + } +} + +},{"./misc.js":"kkhLS","./node.js":"9f8My","./input.js":"4IqVo","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"9f8My":[function(require,module,exports,__globalThis) { +"use strict"; + +},{}],"4IqVo":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * Represents an input media file. This is the root object from which all media read operations start. + * @group Input files & tracks + * @public + */ parcelHelpers.export(exports, "Input", ()=>Input); +/** + * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed. + * @group Input files & tracks + * @public + */ parcelHelpers.export(exports, "InputDisposedError", ()=>InputDisposedError); +var _inputFormatJs = require("./input-format.js"); +var _miscJs = require("./misc.js"); +var _readerJs = require("./reader.js"); +var _sourceJs = require("./source.js"); +(0, _miscJs.polyfillSymbolDispose)(); +class Input { + /** True if the input has been disposed. */ get disposed() { + return this._disposed; + } + /** + * Creates a new input file from the specified options. No reading operations will be performed until methods are + * called on this instance. + */ constructor(options){ + /** @internal */ this._demuxerPromise = null; + /** @internal */ this._format = null; + /** @internal */ this._disposed = false; + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (!Array.isArray(options.formats) || options.formats.some((x)=>!(x instanceof (0, _inputFormatJs.InputFormat)))) throw new TypeError('options.formats must be an array of InputFormat.'); + if (!(options.source instanceof (0, _sourceJs.Source))) throw new TypeError('options.source must be a Source.'); + if (options.source._disposed) throw new Error('options.source must not be disposed.'); + this._formats = options.formats; + this._source = options.source; + this._reader = new (0, _readerJs.Reader)(options.source); + } + /** @internal */ _getDemuxer() { + return this._demuxerPromise ??= (async ()=>{ + this._reader.fileSize = await this._source.getSizeOrNull(); + for (const format of this._formats){ + const canRead = await format._canReadInput(this); + if (canRead) { + this._format = format; + return format._createDemuxer(this); + } + } + throw new Error('Input has an unsupported or unrecognizable format.'); + })(); + } + /** + * Returns the source from which this input file reads its data. This is the same source that was passed to the + * constructor. + */ get source() { + return this._source; + } + /** + * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons + * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true + * for both MKV and WebM). + */ async getFormat() { + await this._getDemuxer(); + (0, _miscJs.assert)(this._format); + return this._format; + } + /** + * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among + * all tracks. + */ async computeDuration() { + const demuxer = await this._getDemuxer(); + return demuxer.computeDuration(); + } + /** Returns the list of all tracks of this input file. */ async getTracks() { + const demuxer = await this._getDemuxer(); + return demuxer.getTracks(); + } + /** Returns the list of all video tracks of this input file. */ async getVideoTracks() { + const tracks = await this.getTracks(); + return tracks.filter((x)=>x.isVideoTrack()); + } + /** Returns the list of all audio tracks of this input file. */ async getAudioTracks() { + const tracks = await this.getTracks(); + return tracks.filter((x)=>x.isAudioTrack()); + } + /** Returns the primary video track of this input file, or null if there are no video tracks. */ async getPrimaryVideoTrack() { + const tracks = await this.getTracks(); + return tracks.find((x)=>x.isVideoTrack()) ?? null; + } + /** Returns the primary audio track of this input file, or null if there are no audio tracks. */ async getPrimaryAudioTrack() { + const tracks = await this.getTracks(); + return tracks.find((x)=>x.isAudioTrack()) ?? null; + } + /** Returns the full MIME type of this input file, including track codecs. */ async getMimeType() { + const demuxer = await this._getDemuxer(); + return demuxer.getMimeType(); + } + /** + * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other + * attached files. + */ async getMetadataTags() { + const demuxer = await this._getDemuxer(); + return demuxer.getMetadataTags(); + } + /** + * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be + * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink + * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}. + * + * You are expected not to use an input after disposing it. While some operations may still work, it is not + * specified and may change in any future update. + */ dispose() { + if (this._disposed) return; + this._disposed = true; + this._source._disposed = true; + this._source._dispose(); + } + /** + * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with + * JavaScript Explicit Resource Management features. + */ [Symbol.dispose]() { + this.dispose(); + } +} +class InputDisposedError extends Error { + /** Creates a new {@link InputDisposedError}. */ constructor(message = 'Input has been disposed.'){ + super(message); + this.name = 'InputDisposedError'; + } +} + +},{"./input-format.js":"fr7dQ","./misc.js":"kkhLS","./reader.js":"fr2Ka","./source.js":"99VTc","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"fr7dQ":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * Base class representing an input media file format. + * @group Input formats + * @public + */ parcelHelpers.export(exports, "InputFormat", ()=>InputFormat); +/** + * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files. + * @group Input formats + * @public + */ parcelHelpers.export(exports, "IsobmffInputFormat", ()=>IsobmffInputFormat); +/** + * MPEG-4 Part 14 (MP4) file format. + * + * Do not instantiate this class; use the {@link MP4} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "Mp4InputFormat", ()=>Mp4InputFormat); +/** + * QuickTime File Format (QTFF), often called MOV. + * + * Do not instantiate this class; use the {@link QTFF} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "QuickTimeInputFormat", ()=>QuickTimeInputFormat); +/** + * Matroska file format. + * + * Do not instantiate this class; use the {@link MATROSKA} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "MatroskaInputFormat", ()=>MatroskaInputFormat); +/** + * WebM file format, based on Matroska. + * + * Do not instantiate this class; use the {@link WEBM} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "WebMInputFormat", ()=>WebMInputFormat); +/** + * MP3 file format. + * + * Do not instantiate this class; use the {@link MP3} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "Mp3InputFormat", ()=>Mp3InputFormat); +/** + * WAVE file format, based on RIFF. + * + * Do not instantiate this class; use the {@link WAVE} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "WaveInputFormat", ()=>WaveInputFormat); +/** + * Ogg file format. + * + * Do not instantiate this class; use the {@link OGG} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "OggInputFormat", ()=>OggInputFormat); +/** + * FLAC file format. + * + * Do not instantiate this class; use the {@link FLAC} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "FlacInputFormat", ()=>FlacInputFormat); +/** + * ADTS file format. + * + * Do not instantiate this class; use the {@link ADTS} singleton instead. + * + * @group Input formats + * @public + */ parcelHelpers.export(exports, "AdtsInputFormat", ()=>AdtsInputFormat); +parcelHelpers.export(exports, "MP4", ()=>MP4); +parcelHelpers.export(exports, "QTFF", ()=>QTFF); +parcelHelpers.export(exports, "MATROSKA", ()=>MATROSKA); +parcelHelpers.export(exports, "WEBM", ()=>WEBM); +parcelHelpers.export(exports, "MP3", ()=>MP3); +parcelHelpers.export(exports, "WAVE", ()=>WAVE); +parcelHelpers.export(exports, "OGG", ()=>OGG); +parcelHelpers.export(exports, "ADTS", ()=>ADTS); +parcelHelpers.export(exports, "FLAC", ()=>FLAC); +parcelHelpers.export(exports, "ALL_FORMATS", ()=>ALL_FORMATS); +var _isobmffDemuxerJs = require("./isobmff/isobmff-demuxer.js"); +var _ebmlJs = require("./matroska/ebml.js"); +var _matroskaDemuxerJs = require("./matroska/matroska-demuxer.js"); +var _mp3DemuxerJs = require("./mp3/mp3-demuxer.js"); +var _mp3MiscJs = require("../shared/mp3-misc.js"); +var _id3Js = require("./id3.js"); +var _mp3ReaderJs = require("./mp3/mp3-reader.js"); +var _oggDemuxerJs = require("./ogg/ogg-demuxer.js"); +var _waveDemuxerJs = require("./wave/wave-demuxer.js"); +var _adtsReaderJs = require("./adts/adts-reader.js"); +var _adtsDemuxerJs = require("./adts/adts-demuxer.js"); +var _readerJs = require("./reader.js"); +var _flacDemuxerJs = require("./flac/flac-demuxer.js"); +class InputFormat { +} +class IsobmffInputFormat extends InputFormat { + /** @internal */ async _getMajorBrand(input) { + let slice = input._reader.requestSlice(0, 12); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; + slice.skip(4); + const fourCc = (0, _readerJs.readAscii)(slice, 4); + if (fourCc !== 'ftyp') return null; + return (0, _readerJs.readAscii)(slice, 4); + } + /** @internal */ _createDemuxer(input) { + return new (0, _isobmffDemuxerJs.IsobmffDemuxer)(input); + } +} +class Mp4InputFormat extends IsobmffInputFormat { + /** @internal */ async _canReadInput(input) { + const majorBrand = await this._getMajorBrand(input); + return !!majorBrand && majorBrand !== 'qt '; + } + get name() { + return 'MP4'; + } + get mimeType() { + return 'video/mp4'; + } +} +class QuickTimeInputFormat extends IsobmffInputFormat { + /** @internal */ async _canReadInput(input) { + const majorBrand = await this._getMajorBrand(input); + return majorBrand === 'qt '; + } + get name() { + return 'QuickTime File Format'; + } + get mimeType() { + return 'video/quicktime'; + } +} +class MatroskaInputFormat extends InputFormat { + /** @internal */ async isSupportedEBMLOfDocType(input, desiredDocType) { + let headerSlice = input._reader.requestSlice(0, (0, _ebmlJs.MAX_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + if (!headerSlice) return false; + const varIntSize = (0, _ebmlJs.readVarIntSize)(headerSlice); + if (varIntSize === null) return false; + if (varIntSize < 1 || varIntSize > 8) return false; + const id = (0, _ebmlJs.readUnsignedInt)(headerSlice, varIntSize); + if (id !== (0, _ebmlJs.EBMLId).EBML) return false; + const dataSize = (0, _ebmlJs.readElementSize)(headerSlice); + if (dataSize === null) return false; // Miss me with that shit + let dataSlice = input._reader.requestSlice(headerSlice.filePos, dataSize); + if (dataSlice instanceof Promise) dataSlice = await dataSlice; + if (!dataSlice) return false; + const startPos = headerSlice.filePos; + while(dataSlice.filePos <= startPos + dataSize - (0, _ebmlJs.MIN_HEADER_SIZE)){ + const header = (0, _ebmlJs.readElementHeader)(dataSlice); + if (!header) break; + const { id, size } = header; + const dataStartPos = dataSlice.filePos; + if (size === null) return false; + switch(id){ + case (0, _ebmlJs.EBMLId).EBMLVersion: + { + const ebmlVersion = (0, _ebmlJs.readUnsignedInt)(dataSlice, size); + if (ebmlVersion !== 1) return false; + } + break; + case (0, _ebmlJs.EBMLId).EBMLReadVersion: + { + const ebmlReadVersion = (0, _ebmlJs.readUnsignedInt)(dataSlice, size); + if (ebmlReadVersion !== 1) return false; + } + break; + case (0, _ebmlJs.EBMLId).DocType: + { + const docType = (0, _ebmlJs.readAsciiString)(dataSlice, size); + if (docType !== desiredDocType) return false; + } + break; + case (0, _ebmlJs.EBMLId).DocTypeVersion: + { + const docTypeVersion = (0, _ebmlJs.readUnsignedInt)(dataSlice, size); + if (docTypeVersion > 4) return false; + } + break; + } + dataSlice.filePos = dataStartPos + size; + } + return true; + } + /** @internal */ _canReadInput(input) { + return this.isSupportedEBMLOfDocType(input, 'matroska'); + } + /** @internal */ _createDemuxer(input) { + return new (0, _matroskaDemuxerJs.MatroskaDemuxer)(input); + } + get name() { + return 'Matroska'; + } + get mimeType() { + return 'video/x-matroska'; + } +} +class WebMInputFormat extends MatroskaInputFormat { + /** @internal */ _canReadInput(input) { + return this.isSupportedEBMLOfDocType(input, 'webm'); + } + get name() { + return 'WebM'; + } + get mimeType() { + return 'video/webm'; + } +} +class Mp3InputFormat extends InputFormat { + /** @internal */ async _canReadInput(input) { + let slice = input._reader.requestSlice(0, 10); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + let currentPos = 0; + let id3V2HeaderFound = false; + while(true){ + let slice = input._reader.requestSlice(currentPos, (0, _id3Js.ID3_V2_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const id3V2Header = (0, _id3Js.readId3V2Header)(slice); + if (!id3V2Header) break; + id3V2HeaderFound = true; + currentPos = slice.filePos + id3V2Header.size; + } + const firstResult = await (0, _mp3ReaderJs.readNextFrameHeader)(input._reader, currentPos, currentPos + 4096); + if (!firstResult) return false; + if (id3V2HeaderFound) // If there was an ID3v2 tag at the start, we can be pretty sure this is MP3 by now + return true; + currentPos = firstResult.startPos + firstResult.header.totalSize; + // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find + // another header right after it: + const secondResult = await (0, _mp3ReaderJs.readNextFrameHeader)(input._reader, currentPos, currentPos + (0, _mp3MiscJs.FRAME_HEADER_SIZE)); + if (!secondResult) return false; + const firstHeader = firstResult.header; + const secondHeader = secondResult.header; + // In a well-formed MP3 file, we'd expect these two frames to share some similarities: + if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) return false; + // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file + return true; + } + /** @internal */ _createDemuxer(input) { + return new (0, _mp3DemuxerJs.Mp3Demuxer)(input); + } + get name() { + return 'MP3'; + } + get mimeType() { + return 'audio/mpeg'; + } +} +class WaveInputFormat extends InputFormat { + /** @internal */ async _canReadInput(input) { + let slice = input._reader.requestSlice(0, 12); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + const riffType = (0, _readerJs.readAscii)(slice, 4); + if (riffType !== 'RIFF' && riffType !== 'RIFX' && riffType !== 'RF64') return false; + slice.skip(4); + const format = (0, _readerJs.readAscii)(slice, 4); + return format === 'WAVE'; + } + /** @internal */ _createDemuxer(input) { + return new (0, _waveDemuxerJs.WaveDemuxer)(input); + } + get name() { + return 'WAVE'; + } + get mimeType() { + return 'audio/wav'; + } +} +class OggInputFormat extends InputFormat { + /** @internal */ async _canReadInput(input) { + let slice = input._reader.requestSlice(0, 4); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + return (0, _readerJs.readAscii)(slice, 4) === 'OggS'; + } + /** @internal */ _createDemuxer(input) { + return new (0, _oggDemuxerJs.OggDemuxer)(input); + } + get name() { + return 'Ogg'; + } + get mimeType() { + return 'application/ogg'; + } +} +class FlacInputFormat extends InputFormat { + /** @internal */ async _canReadInput(input) { + let slice = input._reader.requestSlice(0, 4); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + return (0, _readerJs.readAscii)(slice, 4) === 'fLaC'; + } + get name() { + return 'FLAC'; + } + get mimeType() { + return 'audio/flac'; + } + /** @internal */ _createDemuxer(input) { + return new (0, _flacDemuxerJs.FlacDemuxer)(input); + } +} +class AdtsInputFormat extends InputFormat { + /** @internal */ async _canReadInput(input) { + let slice = input._reader.requestSliceRange(0, (0, _adtsReaderJs.MIN_FRAME_HEADER_SIZE), (0, _adtsReaderJs.MAX_FRAME_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + const firstHeader = (0, _adtsReaderJs.readFrameHeader)(slice); + if (!firstHeader) return false; + slice = input._reader.requestSliceRange(firstHeader.frameLength, (0, _adtsReaderJs.MIN_FRAME_HEADER_SIZE), (0, _adtsReaderJs.MAX_FRAME_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + const secondHeader = (0, _adtsReaderJs.readFrameHeader)(slice); + if (!secondHeader) return false; + return firstHeader.objectType === secondHeader.objectType && firstHeader.samplingFrequencyIndex === secondHeader.samplingFrequencyIndex && firstHeader.channelConfiguration === secondHeader.channelConfiguration; + } + /** @internal */ _createDemuxer(input) { + return new (0, _adtsDemuxerJs.AdtsDemuxer)(input); + } + get name() { + return 'ADTS'; + } + get mimeType() { + return 'audio/aac'; + } +} +const MP4 = /* #__PURE__ */ new Mp4InputFormat(); +const QTFF = /* #__PURE__ */ new QuickTimeInputFormat(); +const MATROSKA = /* #__PURE__ */ new MatroskaInputFormat(); +const WEBM = /* #__PURE__ */ new WebMInputFormat(); +const MP3 = /* #__PURE__ */ new Mp3InputFormat(); +const WAVE = /* #__PURE__ */ new WaveInputFormat(); +const OGG = /* #__PURE__ */ new OggInputFormat(); +const ADTS = /* #__PURE__ */ new AdtsInputFormat(); +const FLAC = /* #__PURE__ */ new FlacInputFormat(); +const ALL_FORMATS = [ + MP4, + QTFF, + MATROSKA, + WEBM, + WAVE, + OGG, + FLAC, + MP3, + ADTS +]; + +},{"./isobmff/isobmff-demuxer.js":"hzGAw","./matroska/ebml.js":"b6nkD","./matroska/matroska-demuxer.js":"lx8cS","./mp3/mp3-demuxer.js":"aMGxe","../shared/mp3-misc.js":"k3lpY","./id3.js":"5tvk3","./mp3/mp3-reader.js":"kFP95","./ogg/ogg-demuxer.js":"2yNaV","./wave/wave-demuxer.js":"aafYY","./adts/adts-reader.js":"jOxJW","./adts/adts-demuxer.js":"fMkVV","./reader.js":"fr2Ka","./flac/flac-demuxer.js":"kBazS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"hzGAw":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "IsobmffDemuxer", ()=>IsobmffDemuxer); +var _codecJs = require("../codec.js"); +var _codecDataJs = require("../codec-data.js"); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _isobmffMiscJs = require("./isobmff-misc.js"); +var _isobmffReaderJs = require("./isobmff-reader.js"); +var _readerJs = require("../reader.js"); +var _metadataJs = require("../metadata.js"); +class IsobmffDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.moovSlice = null; + this.currentTrack = null; + this.tracks = []; + this.metadataPromise = null; + this.movieTimescale = -1; + this.movieDurationInTimescale = -1; + this.isQuickTime = false; + this.metadataTags = {}; + this.currentMetadataKeys = null; + this.isFragmented = false; + this.fragmentTrackDefaults = []; + this.currentFragment = null; + /** + * Caches the last fragment that was read. Based on the assumption that there will be multiple reads to the + * same fragment in quick succession. + */ this.lastReadFragment = null; + this.reader = input._reader; + } + async computeDuration() { + const tracks = await this.getTracks(); + const trackDurations = await Promise.all(tracks.map((x)=>x.computeDuration())); + return Math.max(0, ...trackDurations); + } + async getTracks() { + await this.readMetadata(); + return this.tracks.map((track)=>track.inputTrack); + } + async getMimeType() { + await this.readMetadata(); + const codecStrings = await Promise.all(this.tracks.map((x)=>x.inputTrack.getCodecParameterString())); + return (0, _isobmffMiscJs.buildIsobmffMimeType)({ + isQuickTime: this.isQuickTime, + hasVideo: this.tracks.some((x)=>x.info?.type === 'video'), + hasAudio: this.tracks.some((x)=>x.info?.type === 'audio'), + codecStrings: codecStrings.filter(Boolean) + }); + } + async getMetadataTags() { + await this.readMetadata(); + return this.metadataTags; + } + readMetadata() { + return this.metadataPromise ??= (async ()=>{ + let currentPos = 0; + while(true){ + let slice = this.reader.requestSliceRange(currentPos, (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE), (0, _isobmffReaderJs.MAX_BOX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const startPos = currentPos; + const boxInfo = (0, _isobmffReaderJs.readBoxHeader)(slice); + if (!boxInfo) break; + if (boxInfo.name === 'ftyp') { + const majorBrand = (0, _readerJs.readAscii)(slice, 4); + this.isQuickTime = majorBrand === 'qt '; + } else if (boxInfo.name === 'moov') { + // Found moov, load it + let moovSlice = this.reader.requestSlice(slice.filePos, boxInfo.contentSize); + if (moovSlice instanceof Promise) moovSlice = await moovSlice; + if (!moovSlice) break; + this.moovSlice = moovSlice; + this.readContiguousBoxes(this.moovSlice); + // Put default tracks first + this.tracks.sort((a, b)=>Number(b.disposition.default) - Number(a.disposition.default)); + for (const track of this.tracks){ + // Modify the edit list offset based on the previous segment durations. They are in different + // timescales, so we first convert to seconds and then into the track timescale. + const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale; + track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale); + } + break; + } + currentPos = startPos + boxInfo.totalSize; + } + if (this.isFragmented && this.reader.fileSize !== null) { + // The last 4 bytes may contain the size of the mfra box at the end of the file + let lastWordSlice = this.reader.requestSlice(this.reader.fileSize - 4, 4); + if (lastWordSlice instanceof Promise) lastWordSlice = await lastWordSlice; + (0, _miscJs.assert)(lastWordSlice); + const lastWord = (0, _readerJs.readU32Be)(lastWordSlice); + const potentialMfraPos = this.reader.fileSize - lastWord; + if (potentialMfraPos >= 0 && potentialMfraPos <= this.reader.fileSize - (0, _isobmffReaderJs.MAX_BOX_HEADER_SIZE)) { + let mfraHeaderSlice = this.reader.requestSliceRange(potentialMfraPos, (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE), (0, _isobmffReaderJs.MAX_BOX_HEADER_SIZE)); + if (mfraHeaderSlice instanceof Promise) mfraHeaderSlice = await mfraHeaderSlice; + if (mfraHeaderSlice) { + const boxInfo = (0, _isobmffReaderJs.readBoxHeader)(mfraHeaderSlice); + if (boxInfo && boxInfo.name === 'mfra') { + // We found the mfra box, allowing for much better random access. Let's parse it. + let mfraSlice = this.reader.requestSlice(mfraHeaderSlice.filePos, boxInfo.contentSize); + if (mfraSlice instanceof Promise) mfraSlice = await mfraSlice; + if (mfraSlice) this.readContiguousBoxes(mfraSlice); + } + } + } + } + })(); + } + getSampleTableForTrack(internalTrack) { + if (internalTrack.sampleTable) return internalTrack.sampleTable; + const sampleTable = { + sampleTimingEntries: [], + sampleCompositionTimeOffsets: [], + sampleSizes: [], + keySampleIndices: null, + chunkOffsets: [], + sampleToChunk: [], + presentationTimestamps: null, + presentationTimestampIndexMap: null + }; + internalTrack.sampleTable = sampleTable; + (0, _miscJs.assert)(this.moovSlice); + const stblContainerSlice = this.moovSlice.slice(internalTrack.sampleTableByteOffset); + this.currentTrack = internalTrack; + this.traverseBox(stblContainerSlice); + this.currentTrack = null; + const isPcmCodec = internalTrack.info?.type === 'audio' && internalTrack.info.codec && (0, _codecJs.PCM_AUDIO_CODECS).includes(internalTrack.info.codec); + if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) { + // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat + // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second. + // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge + // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM, + // we say that each chunk (that normally holds many samples) now is one big sample. We can this because + // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still + // encodes valid audio information. + (0, _miscJs.assert)(internalTrack.info?.type === 'audio'); + const pcmInfo = (0, _codecJs.parsePcmCodec)(internalTrack.info.codec); + const newSampleTimingEntries = []; + const newSampleSizes = []; + for(let i = 0; i < sampleTable.sampleToChunk.length; i++){ + const chunkEntry = sampleTable.sampleToChunk[i]; + const nextEntry = sampleTable.sampleToChunk[i + 1]; + const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length) - chunkEntry.startChunkIndex; + for(let j = 0; j < chunkCount; j++){ + const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk; + const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk + const startTimingEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleTimingEntries, startSampleIndex, (x)=>x.startIndex); + const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex]; + const endTimingEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleTimingEntries, endSampleIndex, (x)=>x.startIndex); + const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex]; + const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta; + const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta; + const delta = lastSampleTimestamp - firstSampleTimestamp; + const lastSampleTimingEntry = (0, _miscJs.last)(newSampleTimingEntries); + if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) lastSampleTimingEntry.count++; + else // One sample for the entire chunk + newSampleTimingEntries.push({ + startIndex: chunkEntry.startChunkIndex + j, + startDecodeTimestamp: firstSampleTimestamp, + count: 1, + delta + }); + // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we + // can directly compute it as we know how many PCM frames are in this chunk, and the size of each + // PCM frame. This also improves compatibility with some files which fail to write proper sample + // size values into their sample tables in the PCM case. + const chunkSize = chunkEntry.samplesPerChunk * pcmInfo.sampleSize * internalTrack.info.numberOfChannels; + newSampleSizes.push(chunkSize); + } + chunkEntry.startSampleIndex = chunkEntry.startChunkIndex; + chunkEntry.samplesPerChunk = 1; + } + sampleTable.sampleTimingEntries = newSampleTimingEntries; + sampleTable.sampleSizes = newSampleSizes; + } + if (sampleTable.sampleCompositionTimeOffsets.length > 0) { + // If composition time offsets are defined, we must build a list of all presentation timestamps and then + // sort them + sampleTable.presentationTimestamps = []; + for (const entry of sampleTable.sampleTimingEntries)for(let i = 0; i < entry.count; i++)sampleTable.presentationTimestamps.push({ + presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta, + sampleIndex: entry.startIndex + i + }); + for (const entry of sampleTable.sampleCompositionTimeOffsets)for(let i = 0; i < entry.count; i++){ + const sampleIndex = entry.startIndex + i; + const sample = sampleTable.presentationTimestamps[sampleIndex]; + if (!sample) continue; + sample.presentationTimestamp += entry.offset; + } + sampleTable.presentationTimestamps.sort((a, b)=>a.presentationTimestamp - b.presentationTimestamp); + sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1); + for(let i = 0; i < sampleTable.presentationTimestamps.length; i++)sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i; + } + return sampleTable; + } + async readFragment(startPos) { + if (this.lastReadFragment?.moofOffset === startPos) return this.lastReadFragment; + let headerSlice = this.reader.requestSliceRange(startPos, (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE), (0, _isobmffReaderJs.MAX_BOX_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + (0, _miscJs.assert)(headerSlice); + const moofBoxInfo = (0, _isobmffReaderJs.readBoxHeader)(headerSlice); + (0, _miscJs.assert)(moofBoxInfo?.name === 'moof'); + let entireSlice = this.reader.requestSlice(startPos, moofBoxInfo.totalSize); + if (entireSlice instanceof Promise) entireSlice = await entireSlice; + (0, _miscJs.assert)(entireSlice); + this.traverseBox(entireSlice); + const fragment = this.lastReadFragment; + (0, _miscJs.assert)(fragment && fragment.moofOffset === startPos); + for (const [, trackData] of fragment.trackData){ + const track = trackData.track; + const { fragmentPositionCache } = track; + if (!trackData.startTimestampIsFinal) { + // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This + // we'll need to figure out the start timestamp another way. We'll compute the timestamp by accessing + // the lookup entries and fragment cache, which works out nicely with the lookup algorithm: If these + // exist, then the lookup will automatically start at the furthest possible point. If they don't, the + // lookup starts sequentially from the start, incrementally summing up all fragment durations. It's sort + // of implicit, but it ends up working nicely. + const lookupEntry = track.fragmentLookupTable.find((x)=>x.moofOffset === fragment.moofOffset); + if (lookupEntry) // There's a lookup entry, let's use its timestamp + offsetFragmentTrackDataByTimestamp(trackData, lookupEntry.timestamp); + else { + const lastCacheIndex = (0, _miscJs.binarySearchLessOrEqual)(fragmentPositionCache, fragment.moofOffset - 1, (x)=>x.moofOffset); + if (lastCacheIndex !== -1) { + // Let's use the timestamp of the previous fragment in the cache + const lastCache = fragmentPositionCache[lastCacheIndex]; + offsetFragmentTrackDataByTimestamp(trackData, lastCache.endTimestamp); + } + } + trackData.startTimestampIsFinal = true; + } + // Let's remember that a fragment with a given timestamp is here, speeding up future lookups if no + // lookup table exists + const insertionIndex = (0, _miscJs.binarySearchLessOrEqual)(fragmentPositionCache, trackData.startTimestamp, (x)=>x.startTimestamp); + if (insertionIndex === -1 || fragmentPositionCache[insertionIndex].moofOffset !== fragment.moofOffset) fragmentPositionCache.splice(insertionIndex + 1, 0, { + moofOffset: fragment.moofOffset, + startTimestamp: trackData.startTimestamp, + endTimestamp: trackData.endTimestamp + }); + } + return fragment; + } + readContiguousBoxes(slice) { + const startIndex = slice.filePos; + while(slice.filePos - startIndex <= slice.length - (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE)){ + const foundBox = this.traverseBox(slice); + if (!foundBox) break; + } + } + // eslint-disable-next-line @stylistic/generator-star-spacing + *iterateContiguousBoxes(slice) { + const startIndex = slice.filePos; + while(slice.filePos - startIndex <= slice.length - (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE)){ + const startPos = slice.filePos; + const boxInfo = (0, _isobmffReaderJs.readBoxHeader)(slice); + if (!boxInfo) break; + yield { + boxInfo, + slice + }; + slice.filePos = startPos + boxInfo.totalSize; + } + } + traverseBox(slice) { + const startPos = slice.filePos; + const boxInfo = (0, _isobmffReaderJs.readBoxHeader)(slice); + if (!boxInfo) return false; + const contentStartPos = slice.filePos; + const boxEndPos = startPos + boxInfo.totalSize; + switch(boxInfo.name){ + case 'mdia': + case 'minf': + case 'dinf': + case 'mfra': + case 'edts': + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + break; + case 'mvhd': + { + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + if (version === 1) { + slice.skip(16); + this.movieTimescale = (0, _readerJs.readU32Be)(slice); + this.movieDurationInTimescale = (0, _readerJs.readU64Be)(slice); + } else { + slice.skip(8); + this.movieTimescale = (0, _readerJs.readU32Be)(slice); + this.movieDurationInTimescale = (0, _readerJs.readU32Be)(slice); + } + } + break; + case 'trak': + { + const track = { + id: -1, + demuxer: this, + inputTrack: null, + disposition: { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }, + info: null, + timescale: -1, + durationInMovieTimescale: -1, + durationInMediaTimescale: -1, + rotation: 0, + internalCodecId: null, + name: null, + languageCode: (0, _miscJs.UNDETERMINED_LANGUAGE), + sampleTableByteOffset: -1, + sampleTable: null, + fragmentLookupTable: [], + currentFragmentState: null, + fragmentPositionCache: [], + editListPreviousSegmentDurations: 0, + editListOffset: 0 + }; + this.currentTrack = track; + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + if (track.id !== -1 && track.timescale !== -1 && track.info !== null) { + if (track.info.type === 'video' && track.info.width !== -1) { + const videoTrack = track; + track.inputTrack = new (0, _inputTrackJs.InputVideoTrack)(this.input, new IsobmffVideoTrackBacking(videoTrack)); + this.tracks.push(track); + } else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) { + const audioTrack = track; + track.inputTrack = new (0, _inputTrackJs.InputAudioTrack)(this.input, new IsobmffAudioTrackBacking(audioTrack)); + this.tracks.push(track); + } + } + this.currentTrack = null; + } + break; + case 'tkhd': + { + const track = this.currentTrack; + if (!track) break; + const version = (0, _readerJs.readU8)(slice); + const flags = (0, _readerJs.readU24Be)(slice); + // Spec says disabled tracks are to be treated like they don't exist, but in practice, they are treated + // more like non-default tracks. + const trackEnabled = !!(flags & 0x1); + track.disposition.default = trackEnabled; + // Skip over creation & modification time to reach the track ID + if (version === 0) { + slice.skip(8); + track.id = (0, _readerJs.readU32Be)(slice); + slice.skip(4); + track.durationInMovieTimescale = (0, _readerJs.readU32Be)(slice); + } else if (version === 1) { + slice.skip(16); + track.id = (0, _readerJs.readU32Be)(slice); + slice.skip(4); + track.durationInMovieTimescale = (0, _readerJs.readU64Be)(slice); + } else throw new Error(`Incorrect track header version ${version}.`); + slice.skip(16); + const matrix = [ + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_2_30)(slice), + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_2_30)(slice), + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_16_16)(slice), + (0, _isobmffReaderJs.readFixed_2_30)(slice) + ]; + const rotation = (0, _miscJs.normalizeRotation)((0, _miscJs.roundToMultiple)(extractRotationFromMatrix(matrix), 90)); + (0, _miscJs.assert)(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270); + track.rotation = rotation; + } + break; + case 'elst': + { + const track = this.currentTrack; + if (!track) break; + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + let relevantEntryFound = false; + let previousSegmentDurations = 0; + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const segmentDuration = version === 1 ? (0, _readerJs.readU64Be)(slice) : (0, _readerJs.readU32Be)(slice); + const mediaTime = version === 1 ? (0, _readerJs.readI64Be)(slice) : (0, _readerJs.readI32Be)(slice); + const mediaRate = (0, _isobmffReaderJs.readFixed_16_16)(slice); + if (segmentDuration === 0) continue; + if (relevantEntryFound) { + console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.'); + break; + } + if (mediaTime === -1) { + previousSegmentDurations += segmentDuration; + continue; + } + if (mediaRate !== 1) { + console.warn('Unsupported edit list entry: media rate must be 1.'); + break; + } + track.editListPreviousSegmentDurations = previousSegmentDurations; + track.editListOffset = mediaTime; + relevantEntryFound = true; + } + } + break; + case 'mdhd': + { + const track = this.currentTrack; + if (!track) break; + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + if (version === 0) { + slice.skip(8); + track.timescale = (0, _readerJs.readU32Be)(slice); + track.durationInMediaTimescale = (0, _readerJs.readU32Be)(slice); + } else if (version === 1) { + slice.skip(16); + track.timescale = (0, _readerJs.readU32Be)(slice); + track.durationInMediaTimescale = (0, _readerJs.readU64Be)(slice); + } + let language = (0, _readerJs.readU16Be)(slice); + if (language > 0) { + track.languageCode = ''; + for(let i = 0; i < 3; i++){ + track.languageCode = String.fromCharCode(0x60 + (language & 31)) + track.languageCode; + language >>= 5; + } + if (!(0, _miscJs.isIso639Dash2LanguageCode)(track.languageCode)) // Sometimes the bytes are garbage + track.languageCode = (0, _miscJs.UNDETERMINED_LANGUAGE); + } + } + break; + case 'hdlr': + { + const track = this.currentTrack; + if (!track) break; + slice.skip(8); // Version + flags + pre-defined + const handlerType = (0, _readerJs.readAscii)(slice, 4); + if (handlerType === 'vide') track.info = { + type: 'video', + width: -1, + height: -1, + codec: null, + codecDescription: null, + colorSpace: null, + avcType: null, + avcCodecInfo: null, + hevcCodecInfo: null, + vp9CodecInfo: null, + av1CodecInfo: null + }; + else if (handlerType === 'soun') track.info = { + type: 'audio', + numberOfChannels: -1, + sampleRate: -1, + codec: null, + codecDescription: null, + aacCodecInfo: null + }; + } + break; + case 'stbl': + { + const track = this.currentTrack; + if (!track) break; + track.sampleTableByteOffset = startPos; + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + } + break; + case 'stsd': + { + const track = this.currentTrack; + if (!track) break; + if (track.info === null || track.sampleTable) break; + const stsdVersion = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + const entries = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entries; i++){ + const sampleBoxStartPos = slice.filePos; + const sampleBoxInfo = (0, _isobmffReaderJs.readBoxHeader)(slice); + if (!sampleBoxInfo) break; + track.internalCodecId = sampleBoxInfo.name; + const lowercaseBoxName = sampleBoxInfo.name.toLowerCase(); + if (track.info.type === 'video') { + if (lowercaseBoxName === 'avc1' || lowercaseBoxName === 'avc3') { + track.info.codec = 'avc'; + track.info.avcType = lowercaseBoxName === 'avc1' ? 1 : 3; + } else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') track.info.codec = 'hevc'; + else if (lowercaseBoxName === 'vp08') track.info.codec = 'vp8'; + else if (lowercaseBoxName === 'vp09') track.info.codec = 'vp9'; + else if (lowercaseBoxName === 'av01') track.info.codec = 'av1'; + else console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`); + slice.skip(24); + track.info.width = (0, _readerJs.readU16Be)(slice); + track.info.height = (0, _readerJs.readU16Be)(slice); + slice.skip(50); + this.readContiguousBoxes(slice.slice(slice.filePos, sampleBoxStartPos + sampleBoxInfo.totalSize - slice.filePos)); + } else { + if (lowercaseBoxName === 'mp4a') ; + else if (lowercaseBoxName === 'opus') track.info.codec = 'opus'; + else if (lowercaseBoxName === 'flac') track.info.codec = 'flac'; + else if (lowercaseBoxName === 'twos' || lowercaseBoxName === 'sowt' || lowercaseBoxName === 'raw ' || lowercaseBoxName === 'in24' || lowercaseBoxName === 'in32' || lowercaseBoxName === 'fl32' || lowercaseBoxName === 'fl64' || lowercaseBoxName === 'lpcm' || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5 + || lowercaseBoxName === 'fpcm' // " + ) ; + else if (lowercaseBoxName === 'ulaw') track.info.codec = 'ulaw'; + else if (lowercaseBoxName === 'alaw') track.info.codec = 'alaw'; + else console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`); + slice.skip(8); + const version = (0, _readerJs.readU16Be)(slice); + slice.skip(6); + let channelCount = (0, _readerJs.readU16Be)(slice); + let sampleSize = (0, _readerJs.readU16Be)(slice); + slice.skip(4); + // Can't use fixed16_16 as that's signed + let sampleRate = (0, _readerJs.readU32Be)(slice) / 0x10000; + if (stsdVersion === 0 && version > 0) { + // Additional QuickTime fields + if (version === 1) { + slice.skip(4); + sampleSize = 8 * (0, _readerJs.readU32Be)(slice); + slice.skip(8); + } else if (version === 2) { + slice.skip(4); + sampleRate = (0, _readerJs.readF64Be)(slice); + channelCount = (0, _readerJs.readU32Be)(slice); + slice.skip(4); // Always 0x7f000000 + sampleSize = (0, _readerJs.readU32Be)(slice); + const flags = (0, _readerJs.readU32Be)(slice); + slice.skip(8); + if (lowercaseBoxName === 'lpcm') { + const bytesPerSample = sampleSize + 7 >> 3; + const isFloat = Boolean(flags & 1); + const isBigEndian = Boolean(flags & 2); + const sFlags = flags & 4 ? -1 : 0; // I guess it means "signed flags" or something? + if (sampleSize > 0 && sampleSize <= 64) { + if (isFloat) { + if (sampleSize === 32) track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32'; + } else { + if (sFlags & 1 << bytesPerSample - 1) { + if (bytesPerSample === 1) track.info.codec = 'pcm-s8'; + else if (bytesPerSample === 2) track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16'; + else if (bytesPerSample === 3) track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24'; + else if (bytesPerSample === 4) track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32'; + } else if (bytesPerSample === 1) track.info.codec = 'pcm-u8'; + } + } + if (track.info.codec === null) console.warn('Unsupported PCM format.'); + } + } + } + if (track.info.codec === 'opus') sampleRate = (0, _codecJs.OPUS_SAMPLE_RATE); // Always the same + track.info.numberOfChannels = channelCount; + track.info.sampleRate = sampleRate; + // PCM codec assignments + if (lowercaseBoxName === 'twos') { + if (sampleSize === 8) track.info.codec = 'pcm-s8'; + else if (sampleSize === 16) track.info.codec = 'pcm-s16be'; + else { + console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`); + track.info.codec = null; + } + } else if (lowercaseBoxName === 'sowt') { + if (sampleSize === 8) track.info.codec = 'pcm-s8'; + else if (sampleSize === 16) track.info.codec = 'pcm-s16'; + else { + console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`); + track.info.codec = null; + } + } else if (lowercaseBoxName === 'raw ') track.info.codec = 'pcm-u8'; + else if (lowercaseBoxName === 'in24') track.info.codec = 'pcm-s24be'; + else if (lowercaseBoxName === 'in32') track.info.codec = 'pcm-s32be'; + else if (lowercaseBoxName === 'fl32') track.info.codec = 'pcm-f32be'; + else if (lowercaseBoxName === 'fl64') track.info.codec = 'pcm-f64be'; + else if (lowercaseBoxName === 'ipcm') track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box + else if (lowercaseBoxName === 'fpcm') track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box + this.readContiguousBoxes(slice.slice(slice.filePos, sampleBoxStartPos + sampleBoxInfo.totalSize - slice.filePos)); + } + } + } + break; + case 'avcC': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info); + track.info.codecDescription = (0, _readerJs.readBytes)(slice, boxInfo.contentSize); + } + break; + case 'hvcC': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info); + track.info.codecDescription = (0, _readerJs.readBytes)(slice, boxInfo.contentSize); + } + break; + case 'vpcC': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'video'); + slice.skip(4); // Version + flags + const profile = (0, _readerJs.readU8)(slice); + const level = (0, _readerJs.readU8)(slice); + const thirdByte = (0, _readerJs.readU8)(slice); + const bitDepth = thirdByte >> 4; + const chromaSubsampling = thirdByte >> 1 & 7; + const videoFullRangeFlag = thirdByte & 1; + const colourPrimaries = (0, _readerJs.readU8)(slice); + const transferCharacteristics = (0, _readerJs.readU8)(slice); + const matrixCoefficients = (0, _readerJs.readU8)(slice); + track.info.vp9CodecInfo = { + profile, + level, + bitDepth, + chromaSubsampling, + videoFullRangeFlag, + colourPrimaries, + transferCharacteristics, + matrixCoefficients + }; + } + break; + case 'av1C': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'video'); + slice.skip(1); // Marker + version + const secondByte = (0, _readerJs.readU8)(slice); + const profile = secondByte >> 5; + const level = secondByte & 31; + const thirdByte = (0, _readerJs.readU8)(slice); + const tier = thirdByte >> 7; + const highBitDepth = thirdByte >> 6 & 1; + const twelveBit = thirdByte >> 5 & 1; + const monochrome = thirdByte >> 4 & 1; + const chromaSubsamplingX = thirdByte >> 3 & 1; + const chromaSubsamplingY = thirdByte >> 2 & 1; + const chromaSamplePosition = thirdByte & 3; + // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf + const bitDepth = profile === 2 && highBitDepth ? twelveBit ? 12 : 10 : highBitDepth ? 10 : 8; + track.info.av1CodecInfo = { + profile, + level, + tier, + bitDepth, + monochrome, + chromaSubsamplingX, + chromaSubsamplingY, + chromaSamplePosition + }; + } + break; + case 'colr': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'video'); + const colourType = (0, _readerJs.readAscii)(slice, 4); + if (colourType !== 'nclx') break; + const colourPrimaries = (0, _readerJs.readU16Be)(slice); + const transferCharacteristics = (0, _readerJs.readU16Be)(slice); + const matrixCoefficients = (0, _readerJs.readU16Be)(slice); + const fullRangeFlag = Boolean((0, _readerJs.readU8)(slice) & 0x80); + track.info.colorSpace = { + primaries: (0, _miscJs.COLOR_PRIMARIES_MAP_INVERSE)[colourPrimaries], + transfer: (0, _miscJs.TRANSFER_CHARACTERISTICS_MAP_INVERSE)[transferCharacteristics], + matrix: (0, _miscJs.MATRIX_COEFFICIENTS_MAP_INVERSE)[matrixCoefficients], + fullRange: fullRangeFlag + }; + } + break; + case 'wave': + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + break; + case 'esds': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'audio'); + slice.skip(4); // Version + flags + const tag = (0, _readerJs.readU8)(slice); + (0, _miscJs.assert)(tag === 0x03); // ES Descriptor + (0, _isobmffReaderJs.readIsomVariableInteger)(slice); // Length + slice.skip(2); // ES ID + const mixed = (0, _readerJs.readU8)(slice); + const streamDependenceFlag = (mixed & 0x80) !== 0; + const urlFlag = (mixed & 0x40) !== 0; + const ocrStreamFlag = (mixed & 0x20) !== 0; + if (streamDependenceFlag) slice.skip(2); + if (urlFlag) { + const urlLength = (0, _readerJs.readU8)(slice); + slice.skip(urlLength); + } + if (ocrStreamFlag) slice.skip(2); + const decoderConfigTag = (0, _readerJs.readU8)(slice); + (0, _miscJs.assert)(decoderConfigTag === 0x04); // DecoderConfigDescriptor + const decoderConfigDescriptorLength = (0, _isobmffReaderJs.readIsomVariableInteger)(slice); // Length + const payloadStart = slice.filePos; + const objectTypeIndication = (0, _readerJs.readU8)(slice); + if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) { + track.info.codec = 'aac'; + track.info.aacCodecInfo = { + isMpeg2: objectTypeIndication === 0x67 + }; + } else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) track.info.codec = 'mp3'; + else if (objectTypeIndication === 0xdd) track.info.codec = 'vorbis'; // "nonstandard, gpac uses it" - FFmpeg + else console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`); + slice.skip(12); + if (decoderConfigDescriptorLength > slice.filePos - payloadStart) { + // There's a DecoderSpecificInfo at the end, let's read it + const decoderSpecificInfoTag = (0, _readerJs.readU8)(slice); + (0, _miscJs.assert)(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo + const decoderSpecificInfoLength = (0, _isobmffReaderJs.readIsomVariableInteger)(slice); + track.info.codecDescription = (0, _readerJs.readBytes)(slice, decoderSpecificInfoLength); + if (track.info.codec === 'aac') { + // Let's try to deduce more accurate values directly from the AudioSpecificConfig: + const audioSpecificConfig = (0, _codecJs.parseAacAudioSpecificConfig)(track.info.codecDescription); + if (audioSpecificConfig.numberOfChannels !== null) track.info.numberOfChannels = audioSpecificConfig.numberOfChannels; + if (audioSpecificConfig.sampleRate !== null) track.info.sampleRate = audioSpecificConfig.sampleRate; + } + } + } + break; + case 'enda': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'audio'); + const littleEndian = (0, _readerJs.readU16Be)(slice) & 0xff; // 0xff is from FFmpeg + if (littleEndian) { + if (track.info.codec === 'pcm-s16be') track.info.codec = 'pcm-s16'; + else if (track.info.codec === 'pcm-s24be') track.info.codec = 'pcm-s24'; + else if (track.info.codec === 'pcm-s32be') track.info.codec = 'pcm-s32'; + else if (track.info.codec === 'pcm-f32be') track.info.codec = 'pcm-f32'; + else if (track.info.codec === 'pcm-f64be') track.info.codec = 'pcm-f64'; + } + } + break; + case 'pcmC': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'audio'); + slice.skip(4); // Version + flags + // ISO/IEC 23003-5 + const formatFlags = (0, _readerJs.readU8)(slice); + const isLittleEndian = Boolean(formatFlags & 0x01); + const pcmSampleSize = (0, _readerJs.readU8)(slice); + if (track.info.codec === 'pcm-s16be') { + // ipcm + if (isLittleEndian) { + if (pcmSampleSize === 16) track.info.codec = 'pcm-s16'; + else if (pcmSampleSize === 24) track.info.codec = 'pcm-s24'; + else if (pcmSampleSize === 32) track.info.codec = 'pcm-s32'; + else { + console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`); + track.info.codec = null; + } + } else { + if (pcmSampleSize === 16) track.info.codec = 'pcm-s16be'; + else if (pcmSampleSize === 24) track.info.codec = 'pcm-s24be'; + else if (pcmSampleSize === 32) track.info.codec = 'pcm-s32be'; + else { + console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`); + track.info.codec = null; + } + } + } else if (track.info.codec === 'pcm-f32be') { + // fpcm + if (isLittleEndian) { + if (pcmSampleSize === 32) track.info.codec = 'pcm-f32'; + else if (pcmSampleSize === 64) track.info.codec = 'pcm-f64'; + else { + console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`); + track.info.codec = null; + } + } else { + if (pcmSampleSize === 32) track.info.codec = 'pcm-f32be'; + else if (pcmSampleSize === 64) track.info.codec = 'pcm-f64be'; + else { + console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`); + track.info.codec = null; + } + } + } + break; + } + case 'dOps': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'audio'); + slice.skip(1); // Version + // https://www.opus-codec.org/docs/opus_in_isobmff.html + const outputChannelCount = (0, _readerJs.readU8)(slice); + const preSkip = (0, _readerJs.readU16Be)(slice); + const inputSampleRate = (0, _readerJs.readU32Be)(slice); + const outputGain = (0, _readerJs.readI16Be)(slice); + const channelMappingFamily = (0, _readerJs.readU8)(slice); + let channelMappingTable; + if (channelMappingFamily !== 0) channelMappingTable = (0, _readerJs.readBytes)(slice, 2 + outputChannelCount); + else channelMappingTable = new Uint8Array(0); + // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06 + const description = new Uint8Array(19 + channelMappingTable.byteLength); + const view = new DataView(description.buffer); + view.setUint32(0, 0x4f707573, false); // 'Opus' + view.setUint32(4, 0x48656164, false); // 'Head' + view.setUint8(8, 1); // Version + view.setUint8(9, outputChannelCount); + view.setUint16(10, preSkip, true); + view.setUint32(12, inputSampleRate, true); + view.setInt16(16, outputGain, true); + view.setUint8(18, channelMappingFamily); + description.set(channelMappingTable, 19); + track.info.codecDescription = description; + track.info.numberOfChannels = outputChannelCount; + // Don't copy the input sample rate, irrelevant, and output sample rate is fixed + } + break; + case 'dfLa': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.info?.type === 'audio'); + slice.skip(4); // Version + flags + // https://datatracker.ietf.org/doc/rfc9639/ + const BLOCK_TYPE_MASK = 0x7f; + const LAST_METADATA_BLOCK_FLAG_MASK = 0x80; + const startPos = slice.filePos; + while(slice.filePos < boxEndPos){ + const flagAndType = (0, _readerJs.readU8)(slice); + const metadataBlockLength = (0, _readerJs.readU24Be)(slice); + const type = flagAndType & BLOCK_TYPE_MASK; + // It's a STREAMINFO block; let's extract the actual sample rate and channel count + if (type === (0, _codecDataJs.FlacBlockType).STREAMINFO) { + slice.skip(10); + // Extract sample rate and channel count + const word = (0, _readerJs.readU32Be)(slice); + const sampleRate = word >>> 12; + const numberOfChannels = (word >> 9 & 7) + 1; + track.info.sampleRate = sampleRate; + track.info.numberOfChannels = numberOfChannels; + slice.skip(20); + } else // Simply skip ahead to the next block + slice.skip(metadataBlockLength); + if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) break; + } + const endPos = slice.filePos; + slice.filePos = startPos; + const bytes = (0, _readerJs.readBytes)(slice, endPos - startPos); + const description = new Uint8Array(4 + bytes.byteLength); + const view = new DataView(description.buffer); + view.setUint32(0, 0x664c6143, false); // 'fLaC' + description.set(bytes, 4); + // Set the codec description to be 'fLaC' + all metadata blocks + track.info.codecDescription = description; + } + break; + case 'stts': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + const entryCount = (0, _readerJs.readU32Be)(slice); + let currentIndex = 0; + let currentTimestamp = 0; + for(let i = 0; i < entryCount; i++){ + const sampleCount = (0, _readerJs.readU32Be)(slice); + const sampleDelta = (0, _readerJs.readU32Be)(slice); + track.sampleTable.sampleTimingEntries.push({ + startIndex: currentIndex, + startDecodeTimestamp: currentTimestamp, + count: sampleCount, + delta: sampleDelta + }); + currentIndex += sampleCount; + currentTimestamp += sampleCount * sampleDelta; + } + } + break; + case 'ctts': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + const entryCount = (0, _readerJs.readU32Be)(slice); + let sampleIndex = 0; + for(let i = 0; i < entryCount; i++){ + const sampleCount = (0, _readerJs.readU32Be)(slice); + const sampleOffset = (0, _readerJs.readI32Be)(slice); + track.sampleTable.sampleCompositionTimeOffsets.push({ + startIndex: sampleIndex, + count: sampleCount, + offset: sampleOffset + }); + sampleIndex += sampleCount; + } + } + break; + case 'stsz': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + const sampleSize = (0, _readerJs.readU32Be)(slice); + const sampleCount = (0, _readerJs.readU32Be)(slice); + if (sampleSize === 0) for(let i = 0; i < sampleCount; i++){ + const sampleSize = (0, _readerJs.readU32Be)(slice); + track.sampleTable.sampleSizes.push(sampleSize); + } + else track.sampleTable.sampleSizes.push(sampleSize); + } + break; + case 'stz2': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + slice.skip(3); // Reserved + const fieldSize = (0, _readerJs.readU8)(slice); // in bits + const sampleCount = (0, _readerJs.readU32Be)(slice); + const bytes = (0, _readerJs.readBytes)(slice, Math.ceil(sampleCount * fieldSize / 8)); + const bitstream = new (0, _miscJs.Bitstream)(bytes); + for(let i = 0; i < sampleCount; i++){ + const sampleSize = bitstream.readBits(fieldSize); + track.sampleTable.sampleSizes.push(sampleSize); + } + } + break; + case 'stss': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + track.sampleTable.keySampleIndices = []; + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const sampleIndex = (0, _readerJs.readU32Be)(slice) - 1; // Convert to 0-indexed + track.sampleTable.keySampleIndices.push(sampleIndex); + } + if (track.sampleTable.keySampleIndices[0] !== 0) // Some files don't mark the first sample a key sample, which is basically almost always incorrect. + // Here, we correct for that mistake: + track.sampleTable.keySampleIndices.unshift(0); + } + break; + case 'stsc': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const startChunkIndex = (0, _readerJs.readU32Be)(slice) - 1; // Convert to 0-indexed + const samplesPerChunk = (0, _readerJs.readU32Be)(slice); + const sampleDescriptionIndex = (0, _readerJs.readU32Be)(slice); + track.sampleTable.sampleToChunk.push({ + startSampleIndex: -1, + startChunkIndex, + samplesPerChunk, + sampleDescriptionIndex + }); + } + let startSampleIndex = 0; + for(let i = 0; i < track.sampleTable.sampleToChunk.length; i++){ + track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex; + if (i < track.sampleTable.sampleToChunk.length - 1) { + const nextChunk = track.sampleTable.sampleToChunk[i + 1]; + const chunkCount = nextChunk.startChunkIndex - track.sampleTable.sampleToChunk[i].startChunkIndex; + startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk; + } + } + } + break; + case 'stco': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const chunkOffset = (0, _readerJs.readU32Be)(slice); + track.sampleTable.chunkOffsets.push(chunkOffset); + } + } + break; + case 'co64': + { + const track = this.currentTrack; + if (!track) break; + if (!track.sampleTable) break; + slice.skip(4); // Version + flags + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const chunkOffset = (0, _readerJs.readU64Be)(slice); + track.sampleTable.chunkOffsets.push(chunkOffset); + } + } + break; + case 'mvex': + this.isFragmented = true; + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + break; + case 'mehd': + { + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + const fragmentDuration = version === 1 ? (0, _readerJs.readU64Be)(slice) : (0, _readerJs.readU32Be)(slice); + this.movieDurationInTimescale = fragmentDuration; + } + break; + case 'trex': + { + slice.skip(4); // Version + flags + const trackId = (0, _readerJs.readU32Be)(slice); + const defaultSampleDescriptionIndex = (0, _readerJs.readU32Be)(slice); + const defaultSampleDuration = (0, _readerJs.readU32Be)(slice); + const defaultSampleSize = (0, _readerJs.readU32Be)(slice); + const defaultSampleFlags = (0, _readerJs.readU32Be)(slice); + // We store these separately rather than in the tracks since the tracks may not exist yet + this.fragmentTrackDefaults.push({ + trackId, + defaultSampleDescriptionIndex, + defaultSampleDuration, + defaultSampleSize, + defaultSampleFlags + }); + } + break; + case 'tfra': + { + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + const trackId = (0, _readerJs.readU32Be)(slice); + const track = this.tracks.find((x)=>x.id === trackId); + if (!track) break; + const word = (0, _readerJs.readU32Be)(slice); + const lengthSizeOfTrafNum = (word & 48) >> 4; + const lengthSizeOfTrunNum = (word & 12) >> 2; + const lengthSizeOfSampleNum = word & 3; + const functions = [ + (0, _readerJs.readU8), + (0, _readerJs.readU16Be), + (0, _readerJs.readU24Be), + (0, _readerJs.readU32Be) + ]; + const readTrafNum = functions[lengthSizeOfTrafNum]; + const readTrunNum = functions[lengthSizeOfTrunNum]; + const readSampleNum = functions[lengthSizeOfSampleNum]; + const numberOfEntries = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < numberOfEntries; i++){ + const time = version === 1 ? (0, _readerJs.readU64Be)(slice) : (0, _readerJs.readU32Be)(slice); + const moofOffset = version === 1 ? (0, _readerJs.readU64Be)(slice) : (0, _readerJs.readU32Be)(slice); + readTrafNum(slice); + readTrunNum(slice); + readSampleNum(slice); + track.fragmentLookupTable.push({ + timestamp: time, + moofOffset + }); + } + // Sort by timestamp in case it's not naturally sorted + track.fragmentLookupTable.sort((a, b)=>a.timestamp - b.timestamp); + // Remove multiple entries for the same time + for(let i = 0; i < track.fragmentLookupTable.length - 1; i++){ + const entry1 = track.fragmentLookupTable[i]; + const entry2 = track.fragmentLookupTable[i + 1]; + if (entry1.timestamp === entry2.timestamp) { + track.fragmentLookupTable.splice(i + 1, 1); + i--; + } + } + } + break; + case 'moof': + this.currentFragment = { + moofOffset: startPos, + moofSize: boxInfo.totalSize, + implicitBaseDataOffset: startPos, + trackData: new Map() + }; + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + this.lastReadFragment = this.currentFragment; + this.currentFragment = null; + break; + case 'traf': + (0, _miscJs.assert)(this.currentFragment); + this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + // It is possible that there is no current track, for example when we don't care about the track + // referenced in the track fragment header. + if (this.currentTrack) { + const trackData = this.currentFragment.trackData.get(this.currentTrack.id); + if (trackData) { + const { currentFragmentState } = this.currentTrack; + (0, _miscJs.assert)(currentFragmentState); + if (currentFragmentState.startTimestamp !== null) { + offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp); + trackData.startTimestampIsFinal = true; + } + } + this.currentTrack.currentFragmentState = null; + this.currentTrack = null; + } + break; + case 'tfhd': + { + (0, _miscJs.assert)(this.currentFragment); + slice.skip(1); // Version + const flags = (0, _readerJs.readU24Be)(slice); + const baseDataOffsetPresent = Boolean(flags & 0x000001); + const sampleDescriptionIndexPresent = Boolean(flags & 0x000002); + const defaultSampleDurationPresent = Boolean(flags & 0x000008); + const defaultSampleSizePresent = Boolean(flags & 0x000010); + const defaultSampleFlagsPresent = Boolean(flags & 0x000020); + const durationIsEmpty = Boolean(flags & 0x010000); + const defaultBaseIsMoof = Boolean(flags & 0x020000); + const trackId = (0, _readerJs.readU32Be)(slice); + const track = this.tracks.find((x)=>x.id === trackId); + if (!track) break; + const defaults = this.fragmentTrackDefaults.find((x)=>x.trackId === trackId); + this.currentTrack = track; + track.currentFragmentState = { + baseDataOffset: this.currentFragment.implicitBaseDataOffset, + sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null, + defaultSampleDuration: defaults?.defaultSampleDuration ?? null, + defaultSampleSize: defaults?.defaultSampleSize ?? null, + defaultSampleFlags: defaults?.defaultSampleFlags ?? null, + startTimestamp: null + }; + if (baseDataOffsetPresent) track.currentFragmentState.baseDataOffset = (0, _readerJs.readU64Be)(slice); + else if (defaultBaseIsMoof) track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset; + if (sampleDescriptionIndexPresent) track.currentFragmentState.sampleDescriptionIndex = (0, _readerJs.readU32Be)(slice); + if (defaultSampleDurationPresent) track.currentFragmentState.defaultSampleDuration = (0, _readerJs.readU32Be)(slice); + if (defaultSampleSizePresent) track.currentFragmentState.defaultSampleSize = (0, _readerJs.readU32Be)(slice); + if (defaultSampleFlagsPresent) track.currentFragmentState.defaultSampleFlags = (0, _readerJs.readU32Be)(slice); + if (durationIsEmpty) track.currentFragmentState.defaultSampleDuration = 0; + } + break; + case 'tfdt': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(track.currentFragmentState); + const version = (0, _readerJs.readU8)(slice); + slice.skip(3); // Flags + const baseMediaDecodeTime = version === 0 ? (0, _readerJs.readU32Be)(slice) : (0, _readerJs.readU64Be)(slice); + track.currentFragmentState.startTimestamp = baseMediaDecodeTime; + } + break; + case 'trun': + { + const track = this.currentTrack; + if (!track) break; + (0, _miscJs.assert)(this.currentFragment); + (0, _miscJs.assert)(track.currentFragmentState); + if (this.currentFragment.trackData.has(track.id)) { + console.warn('Can\'t have two trun boxes for the same track in one fragment. Ignoring...'); + break; + } + const version = (0, _readerJs.readU8)(slice); + const flags = (0, _readerJs.readU24Be)(slice); + const dataOffsetPresent = Boolean(flags & 0x000001); + const firstSampleFlagsPresent = Boolean(flags & 0x000004); + const sampleDurationPresent = Boolean(flags & 0x000100); + const sampleSizePresent = Boolean(flags & 0x000200); + const sampleFlagsPresent = Boolean(flags & 0x000400); + const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800); + const sampleCount = (0, _readerJs.readU32Be)(slice); + let dataOffset = track.currentFragmentState.baseDataOffset; + if (dataOffsetPresent) dataOffset += (0, _readerJs.readI32Be)(slice); + let firstSampleFlags = null; + if (firstSampleFlagsPresent) firstSampleFlags = (0, _readerJs.readU32Be)(slice); + let currentOffset = dataOffset; + if (sampleCount === 0) { + // Don't associate the fragment with the track if it has no samples, this simplifies other code + this.currentFragment.implicitBaseDataOffset = currentOffset; + break; + } + let currentTimestamp = 0; + const trackData = { + track, + startTimestamp: 0, + endTimestamp: 0, + firstKeyFrameTimestamp: null, + samples: [], + presentationTimestamps: [], + startTimestampIsFinal: false + }; + this.currentFragment.trackData.set(track.id, trackData); + for(let i = 0; i < sampleCount; i++){ + let sampleDuration; + if (sampleDurationPresent) sampleDuration = (0, _readerJs.readU32Be)(slice); + else { + (0, _miscJs.assert)(track.currentFragmentState.defaultSampleDuration !== null); + sampleDuration = track.currentFragmentState.defaultSampleDuration; + } + let sampleSize; + if (sampleSizePresent) sampleSize = (0, _readerJs.readU32Be)(slice); + else { + (0, _miscJs.assert)(track.currentFragmentState.defaultSampleSize !== null); + sampleSize = track.currentFragmentState.defaultSampleSize; + } + let sampleFlags; + if (sampleFlagsPresent) sampleFlags = (0, _readerJs.readU32Be)(slice); + else { + (0, _miscJs.assert)(track.currentFragmentState.defaultSampleFlags !== null); + sampleFlags = track.currentFragmentState.defaultSampleFlags; + } + if (i === 0 && firstSampleFlags !== null) sampleFlags = firstSampleFlags; + let sampleCompositionTimeOffset = 0; + if (sampleCompositionTimeOffsetsPresent) { + if (version === 0) sampleCompositionTimeOffset = (0, _readerJs.readU32Be)(slice); + else sampleCompositionTimeOffset = (0, _readerJs.readI32Be)(slice); + } + const isKeyFrame = !(sampleFlags & 0x00010000); + trackData.samples.push({ + presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset, + duration: sampleDuration, + byteOffset: currentOffset, + byteSize: sampleSize, + isKeyFrame + }); + currentOffset += sampleSize; + currentTimestamp += sampleDuration; + } + trackData.presentationTimestamps = trackData.samples.map((x, i)=>({ + presentationTimestamp: x.presentationTimestamp, + sampleIndex: i + })).sort((a, b)=>a.presentationTimestamp - b.presentationTimestamp); + for(let i = 0; i < trackData.presentationTimestamps.length; i++){ + const currentEntry = trackData.presentationTimestamps[i]; + const currentSample = trackData.samples[currentEntry.sampleIndex]; + if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp; + if (i < trackData.presentationTimestamps.length - 1) { + // Update sample durations based on presentation order + const nextEntry = trackData.presentationTimestamps[i + 1]; + currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp; + } + } + const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex]; + const lastSample = trackData.samples[(0, _miscJs.last)(trackData.presentationTimestamps).sampleIndex]; + trackData.startTimestamp = firstSample.presentationTimestamp; + trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration; + this.currentFragment.implicitBaseDataOffset = currentOffset; + } + break; + // Metadata section + // https://exiftool.org/TagNames/QuickTime.html + // https://mp4workshop.com/about + case 'udta': + { + const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + for (const { boxInfo, slice } of iterator){ + if (boxInfo.name !== 'meta' && !this.currentTrack) { + const startPos = slice.filePos; + this.metadataTags.raw ??= {}; + if (boxInfo.name[0] === "\xa9") // https://mp4workshop.com/about + // Box name starting with © indicates "international text" + this.metadataTags.raw[boxInfo.name] ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + else this.metadataTags.raw[boxInfo.name] ??= (0, _readerJs.readBytes)(slice, boxInfo.contentSize); + slice.filePos = startPos; + } + switch(boxInfo.name){ + case 'meta': + slice.skip(-boxInfo.headerSize); + this.traverseBox(slice); + break; + case "\xa9nam": + case 'name': + if (this.currentTrack) this.currentTrack.name = (0, _miscJs.textDecoder).decode((0, _readerJs.readBytes)(slice, boxInfo.contentSize)); + else this.metadataTags.title ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9des": + if (!this.currentTrack) this.metadataTags.description ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9ART": + if (!this.currentTrack) this.metadataTags.artist ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9alb": + if (!this.currentTrack) this.metadataTags.album ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case 'albr': + if (!this.currentTrack) this.metadataTags.albumArtist ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9gen": + if (!this.currentTrack) this.metadataTags.genre ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9day": + if (!this.currentTrack) { + const date = new Date((0, _isobmffReaderJs.readMetadataStringShort)(slice)); + if (!Number.isNaN(date.getTime())) this.metadataTags.date ??= date; + } + break; + case "\xa9cmt": + if (!this.currentTrack) this.metadataTags.comment ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + case "\xa9lyr": + if (!this.currentTrack) this.metadataTags.lyrics ??= (0, _isobmffReaderJs.readMetadataStringShort)(slice); + break; + } + } + } + break; + case 'meta': + { + if (this.currentTrack) break; // Only care about movie-level metadata for now + // The 'meta' box comes in two flavors, one with flags/version and one without. To know which is which, + // let's read the next 4 bytes, which are either the version or the size of the first subbox. + const word = (0, _readerJs.readU32Be)(slice); + const isQuickTime = word !== 0; + this.currentMetadataKeys = new Map(); + if (isQuickTime) this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + else this.readContiguousBoxes(slice.slice(contentStartPos + 4, boxInfo.contentSize - 4)); + this.currentMetadataKeys = null; + } + break; + case 'keys': + { + if (!this.currentMetadataKeys) break; + slice.skip(4); // Version + flags + const entryCount = (0, _readerJs.readU32Be)(slice); + for(let i = 0; i < entryCount; i++){ + const keySize = (0, _readerJs.readU32Be)(slice); + slice.skip(4); // Key namespace + const keyName = (0, _miscJs.textDecoder).decode((0, _readerJs.readBytes)(slice, keySize - 8)); + this.currentMetadataKeys.set(i + 1, keyName); + } + } + break; + case 'ilst': + { + if (!this.currentMetadataKeys) break; + const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize)); + for (const { boxInfo, slice } of iterator){ + let metadataKey = boxInfo.name; + // Interpret the box name as a u32be + const nameAsNumber = (metadataKey.charCodeAt(0) << 24) + (metadataKey.charCodeAt(1) << 16) + (metadataKey.charCodeAt(2) << 8) + metadataKey.charCodeAt(3); + if (this.currentMetadataKeys.has(nameAsNumber)) // An entry exists for this number + metadataKey = this.currentMetadataKeys.get(nameAsNumber); + const data = (0, _isobmffReaderJs.readDataBox)(slice); + this.metadataTags.raw ??= {}; + this.metadataTags.raw[metadataKey] ??= data; + switch(metadataKey){ + case "\xa9nam": + case 'titl': + case 'com.apple.quicktime.title': + case 'title': + if (typeof data === 'string') this.metadataTags.title ??= data; + break; + case "\xa9des": + case 'desc': + case 'dscp': + case 'com.apple.quicktime.description': + case 'description': + if (typeof data === 'string') this.metadataTags.description ??= data; + break; + case "\xa9ART": + case 'com.apple.quicktime.artist': + case 'artist': + if (typeof data === 'string') this.metadataTags.artist ??= data; + break; + case "\xa9alb": + case 'albm': + case 'com.apple.quicktime.album': + case 'album': + if (typeof data === 'string') this.metadataTags.album ??= data; + break; + case 'aART': + case 'album_artist': + if (typeof data === 'string') this.metadataTags.albumArtist ??= data; + break; + case "\xa9cmt": + case 'com.apple.quicktime.comment': + case 'comment': + if (typeof data === 'string') this.metadataTags.comment ??= data; + break; + case "\xa9gen": + case 'gnre': + case 'com.apple.quicktime.genre': + case 'genre': + if (typeof data === 'string') this.metadataTags.genre ??= data; + break; + case "\xa9lyr": + case 'lyrics': + if (typeof data === 'string') this.metadataTags.lyrics ??= data; + break; + case "\xa9day": + case 'rldt': + case 'com.apple.quicktime.creationdate': + case 'date': + if (typeof data === 'string') { + const date = new Date(data); + if (!Number.isNaN(date.getTime())) this.metadataTags.date ??= date; + } + break; + case 'covr': + case 'com.apple.quicktime.artwork': + if (data instanceof (0, _metadataJs.RichImageData)) { + this.metadataTags.images ??= []; + this.metadataTags.images.push({ + data: data.data, + kind: 'coverFront', + mimeType: data.mimeType + }); + } else if (data instanceof Uint8Array) { + this.metadataTags.images ??= []; + this.metadataTags.images.push({ + data, + kind: 'coverFront', + mimeType: 'image/*' + }); + } + break; + case 'track': + if (typeof data === 'string') { + const parts = data.split('/'); + const trackNum = Number.parseInt(parts[0], 10); + const tracksTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(trackNum) && trackNum > 0) this.metadataTags.trackNumber ??= trackNum; + if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) this.metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'trkn': + if (data instanceof Uint8Array && data.length >= 6) { + const view = (0, _miscJs.toDataView)(data); + const trackNumber = view.getUint16(2, false); + const tracksTotal = view.getUint16(4, false); + if (trackNumber > 0) this.metadataTags.trackNumber ??= trackNumber; + if (tracksTotal > 0) this.metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'disc': + case 'disk': + if (data instanceof Uint8Array && data.length >= 6) { + const view = (0, _miscJs.toDataView)(data); + const discNumber = view.getUint16(2, false); + const discNumberMax = view.getUint16(4, false); + if (discNumber > 0) this.metadataTags.discNumber ??= discNumber; + if (discNumberMax > 0) this.metadataTags.discsTotal ??= discNumberMax; + } + break; + } + } + } + break; + } + slice.filePos = boxEndPos; + return true; + } +} +class IsobmffTrackBacking { + constructor(internalTrack){ + this.internalTrack = internalTrack; + this.packetToSampleIndex = new WeakMap(); + this.packetToFragmentLocation = new WeakMap(); + } + getId() { + return this.internalTrack.id; + } + getCodec() { + throw new Error('Not implemented on base class.'); + } + getInternalCodecId() { + return this.internalTrack.internalCodecId; + } + getName() { + return this.internalTrack.name; + } + getLanguageCode() { + return this.internalTrack.languageCode; + } + getTimeResolution() { + return this.internalTrack.timescale; + } + getDisposition() { + return this.internalTrack.disposition; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + async getFirstTimestamp() { + const firstPacket = await this.getFirstPacket({ + metadataOnly: true + }); + return firstPacket?.timestamp ?? 0; + } + async getFirstPacket(options) { + const regularPacket = await this.fetchPacketForSampleIndex(0, options); + if (regularPacket || !this.internalTrack.demuxer.isFragmented) // If there's a non-fragmented packet, always prefer that + return regularPacket; + return this.performFragmentedLookup(null, (fragment)=>{ + const trackData = fragment.trackData.get(this.internalTrack.id); + if (trackData) return { + sampleIndex: 0, + correctSampleFound: true + }; + return { + sampleIndex: -1, + correctSampleFound: false + }; + }, -Infinity, Infinity, options); + } + mapTimestampIntoTimescale(timestamp) { + // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely + // that the number was originally an integer divided by the timescale. For stability, it's best + // to return the integer in this case. + return (0, _miscJs.roundIfAlmostInteger)(timestamp * this.internalTrack.timescale) + this.internalTrack.editListOffset; + } + async getPacket(timestamp, options) { + const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp); + const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack); + const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale); + const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options); + if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) // Prefer the non-fragmented packet + return regularPacket; + return this.performFragmentedLookup(null, (fragment)=>{ + const trackData = fragment.trackData.get(this.internalTrack.id); + if (!trackData) return { + sampleIndex: -1, + correctSampleFound: false + }; + const index = (0, _miscJs.binarySearchLessOrEqual)(trackData.presentationTimestamps, timestampInTimescale, (x)=>x.presentationTimestamp); + const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1; + const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp; + return { + sampleIndex, + correctSampleFound + }; + }, timestampInTimescale, timestampInTimescale, options); + } + async getNextPacket(packet, options) { + const regularSampleIndex = this.packetToSampleIndex.get(packet); + if (regularSampleIndex !== undefined) // Prefer the non-fragmented packet + return this.fetchPacketForSampleIndex(regularSampleIndex + 1, options); + const locationInFragment = this.packetToFragmentLocation.get(packet); + if (locationInFragment === undefined) throw new Error('Packet was not created from this track.'); + return this.performFragmentedLookup(locationInFragment.fragment, (fragment)=>{ + if (fragment === locationInFragment.fragment) { + const trackData = fragment.trackData.get(this.internalTrack.id); + if (locationInFragment.sampleIndex + 1 < trackData.samples.length) // We can simply take the next sample in the fragment + return { + sampleIndex: locationInFragment.sampleIndex + 1, + correctSampleFound: true + }; + } else { + const trackData = fragment.trackData.get(this.internalTrack.id); + if (trackData) return { + sampleIndex: 0, + correctSampleFound: true + }; + } + return { + sampleIndex: -1, + correctSampleFound: false + }; + }, -Infinity, Infinity, options); + } + async getKeyPacket(timestamp, options) { + const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp); + const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack); + const sampleIndex = getKeyframeSampleIndexForTimestamp(sampleTable, timestampInTimescale); + const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options); + if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) // Prefer the non-fragmented packet + return regularPacket; + return this.performFragmentedLookup(null, (fragment)=>{ + const trackData = fragment.trackData.get(this.internalTrack.id); + if (!trackData) return { + sampleIndex: -1, + correctSampleFound: false + }; + const index = (0, _miscJs.findLastIndex)(trackData.presentationTimestamps, (x)=>{ + const sample = trackData.samples[x.sampleIndex]; + return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale; + }); + const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1; + const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp; + return { + sampleIndex, + correctSampleFound + }; + }, timestampInTimescale, timestampInTimescale, options); + } + async getNextKeyPacket(packet, options) { + const regularSampleIndex = this.packetToSampleIndex.get(packet); + if (regularSampleIndex !== undefined) { + // Prefer the non-fragmented packet + const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack); + const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, regularSampleIndex); + return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options); + } + const locationInFragment = this.packetToFragmentLocation.get(packet); + if (locationInFragment === undefined) throw new Error('Packet was not created from this track.'); + return this.performFragmentedLookup(locationInFragment.fragment, (fragment)=>{ + if (fragment === locationInFragment.fragment) { + const trackData = fragment.trackData.get(this.internalTrack.id); + const nextKeyFrameIndex = trackData.samples.findIndex((x, i)=>x.isKeyFrame && i > locationInFragment.sampleIndex); + if (nextKeyFrameIndex !== -1) // We can simply take the next key frame in the fragment + return { + sampleIndex: nextKeyFrameIndex, + correctSampleFound: true + }; + } else { + const trackData = fragment.trackData.get(this.internalTrack.id); + if (trackData && trackData.firstKeyFrameTimestamp !== null) { + const keyFrameIndex = trackData.samples.findIndex((x)=>x.isKeyFrame); + (0, _miscJs.assert)(keyFrameIndex !== -1); // There must be one + return { + sampleIndex: keyFrameIndex, + correctSampleFound: true + }; + } + } + return { + sampleIndex: -1, + correctSampleFound: false + }; + }, -Infinity, Infinity, options); + } + async fetchPacketForSampleIndex(sampleIndex, options) { + if (sampleIndex === -1) return null; + const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack); + const sampleInfo = getSampleInfo(sampleTable, sampleIndex); + if (!sampleInfo) return null; + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.internalTrack.demuxer.reader.requestSlice(sampleInfo.sampleOffset, sampleInfo.sampleSize); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + data = (0, _readerJs.readBytes)(slice, sampleInfo.sampleSize); + } + const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset) / this.internalTrack.timescale; + const duration = sampleInfo.duration / this.internalTrack.timescale; + const packet = new (0, _packetJs.EncodedPacket)(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize); + this.packetToSampleIndex.set(packet, sampleIndex); + return packet; + } + async fetchPacketInFragment(fragment, sampleIndex, options) { + if (sampleIndex === -1) return null; + const trackData = fragment.trackData.get(this.internalTrack.id); + const fragmentSample = trackData.samples[sampleIndex]; + (0, _miscJs.assert)(fragmentSample); + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.internalTrack.demuxer.reader.requestSlice(fragmentSample.byteOffset, fragmentSample.byteSize); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + data = (0, _readerJs.readBytes)(slice, fragmentSample.byteSize); + } + const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset) / this.internalTrack.timescale; + const duration = fragmentSample.duration / this.internalTrack.timescale; + const packet = new (0, _packetJs.EncodedPacket)(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize); + this.packetToFragmentLocation.set(packet, { + fragment, + sampleIndex + }); + return packet; + } + /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */ async performFragmentedLookup(// The fragment where we start looking + startFragment, // This function returns the best-matching sample in a given fragment + getMatchInFragment, // The timestamp with which we can search the lookup table + searchTimestamp, // The timestamp for which we know the correct sample will not come after it + latestTimestamp, options) { + const demuxer = this.internalTrack.demuxer; + let currentFragment = null; + let bestFragment = null; + let bestSampleIndex = -1; + if (startFragment) { + const { sampleIndex, correctSampleFound } = getMatchInFragment(startFragment); + if (correctSampleFound) return this.fetchPacketInFragment(startFragment, sampleIndex, options); + if (sampleIndex !== -1) { + bestFragment = startFragment; + bestSampleIndex = sampleIndex; + } + } + // Search for a lookup entry; this way, we won't need to start searching from the start of the file + // but can jump right into the correct fragment (or at least nearby). + const lookupEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable, searchTimestamp, (x)=>x.timestamp); + const lookupEntry = lookupEntryIndex !== -1 ? this.internalTrack.fragmentLookupTable[lookupEntryIndex] : null; + const positionCacheIndex = (0, _miscJs.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache, searchTimestamp, (x)=>x.startTimestamp); + const positionCacheEntry = positionCacheIndex !== -1 ? this.internalTrack.fragmentPositionCache[positionCacheIndex] : null; + const lookupEntryPosition = Math.max(lookupEntry?.moofOffset ?? 0, positionCacheEntry?.moofOffset ?? 0) || null; + let currentPos; + if (!startFragment) currentPos = lookupEntryPosition ?? 0; + else if (lookupEntryPosition === null || startFragment.moofOffset >= lookupEntryPosition) { + currentPos = startFragment.moofOffset + startFragment.moofSize; + currentFragment = startFragment; + } else // Use the lookup entry + currentPos = lookupEntryPosition; + while(true){ + if (currentFragment) { + const trackData = currentFragment.trackData.get(this.internalTrack.id); + if (trackData && trackData.startTimestamp > latestTimestamp) break; + } + // Load the header + let slice = demuxer.reader.requestSliceRange(currentPos, (0, _isobmffReaderJs.MIN_BOX_HEADER_SIZE), (0, _isobmffReaderJs.MAX_BOX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const boxStartPos = currentPos; + const boxInfo = (0, _isobmffReaderJs.readBoxHeader)(slice); + if (!boxInfo) break; + if (boxInfo.name === 'moof') { + currentFragment = await demuxer.readFragment(boxStartPos); + const { sampleIndex, correctSampleFound } = getMatchInFragment(currentFragment); + if (correctSampleFound) return this.fetchPacketInFragment(currentFragment, sampleIndex, options); + if (sampleIndex !== -1) { + bestFragment = currentFragment; + bestSampleIndex = sampleIndex; + } + } + currentPos = boxStartPos + boxInfo.totalSize; + } + // Catch faulty lookup table entries + if (lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) { + // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied + // the match. In this case, let's search again but using the lookup entry before that. + const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1]; + (0, _miscJs.assert)(!previousLookupEntry || previousLookupEntry.timestamp < lookupEntry.timestamp); + const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity; + return this.performFragmentedLookup(null, getMatchInFragment, newSearchTimestamp, latestTimestamp, options); + } + if (bestFragment) // If we finished looping but didn't find a perfect match, still return the best match we found + return this.fetchPacketInFragment(bestFragment, bestSampleIndex, options); + return null; + } +} +class IsobmffVideoTrackBacking extends IsobmffTrackBacking { + constructor(internalTrack){ + super(internalTrack); + this.decoderConfigPromise = null; + this.internalTrack = internalTrack; + } + getCodec() { + return this.internalTrack.info.codec; + } + getCodedWidth() { + return this.internalTrack.info.width; + } + getCodedHeight() { + return this.internalTrack.info.height; + } + getRotation() { + return this.internalTrack.rotation; + } + async getColorSpace() { + return { + primaries: this.internalTrack.info.colorSpace?.primaries, + transfer: this.internalTrack.info.colorSpace?.transfer, + matrix: this.internalTrack.info.colorSpace?.matrix, + fullRange: this.internalTrack.info.colorSpace?.fullRange + }; + } + async canBeTransparent() { + return false; + } + async getDecoderConfig() { + if (!this.internalTrack.info.codec) return null; + return this.decoderConfigPromise ??= (async ()=>{ + if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) { + const firstPacket = await this.getFirstPacket({}); + this.internalTrack.info.vp9CodecInfo = firstPacket && (0, _codecDataJs.extractVp9CodecInfoFromPacket)(firstPacket.data); + } else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) { + const firstPacket = await this.getFirstPacket({}); + this.internalTrack.info.av1CodecInfo = firstPacket && (0, _codecDataJs.extractAv1CodecInfoFromPacket)(firstPacket.data); + } + return { + codec: (0, _codecJs.extractVideoCodecString)(this.internalTrack.info), + codedWidth: this.internalTrack.info.width, + codedHeight: this.internalTrack.info.height, + description: this.internalTrack.info.codecDescription ?? undefined, + colorSpace: this.internalTrack.info.colorSpace ?? undefined + }; + })(); + } +} +class IsobmffAudioTrackBacking extends IsobmffTrackBacking { + constructor(internalTrack){ + super(internalTrack); + this.decoderConfig = null; + this.internalTrack = internalTrack; + } + getCodec() { + return this.internalTrack.info.codec; + } + getNumberOfChannels() { + return this.internalTrack.info.numberOfChannels; + } + getSampleRate() { + return this.internalTrack.info.sampleRate; + } + async getDecoderConfig() { + if (!this.internalTrack.info.codec) return null; + return this.decoderConfig ??= { + codec: (0, _codecJs.extractAudioCodecString)(this.internalTrack.info), + numberOfChannels: this.internalTrack.info.numberOfChannels, + sampleRate: this.internalTrack.info.sampleRate, + description: this.internalTrack.info.codecDescription ?? undefined + }; + } +} +const getSampleIndexForTimestamp = (sampleTable, timescaleUnits)=>{ + if (sampleTable.presentationTimestamps) { + const index = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.presentationTimestamps, timescaleUnits, (x)=>x.presentationTimestamp); + if (index === -1) return -1; + return sampleTable.presentationTimestamps[index].sampleIndex; + } else { + const index = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleTimingEntries, timescaleUnits, (x)=>x.startDecodeTimestamp); + if (index === -1) return -1; + const entry = sampleTable.sampleTimingEntries[index]; + return entry.startIndex + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1); + } +}; +const getKeyframeSampleIndexForTimestamp = (sampleTable, timescaleUnits)=>{ + if (!sampleTable.keySampleIndices) // Every sample is a keyframe + return getSampleIndexForTimestamp(sampleTable, timescaleUnits); + if (sampleTable.presentationTimestamps) { + const index = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.presentationTimestamps, timescaleUnits, (x)=>x.presentationTimestamp); + if (index === -1) return -1; + // Walk the samples in presentation order until we find one that's a keyframe + for(let i = index; i >= 0; i--){ + const sampleIndex = sampleTable.presentationTimestamps[i].sampleIndex; + const isKeyFrame = (0, _miscJs.binarySearchExact)(sampleTable.keySampleIndices, sampleIndex, (x)=>x) !== -1; + if (isKeyFrame) return sampleIndex; + } + return -1; + } else { + const sampleIndex = getSampleIndexForTimestamp(sampleTable, timescaleUnits); + const index = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.keySampleIndices, sampleIndex, (x)=>x); + return sampleTable.keySampleIndices[index] ?? -1; + } +}; +const getSampleInfo = (sampleTable, sampleIndex)=>{ + const timingEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleTimingEntries, sampleIndex, (x)=>x.startIndex); + const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex]; + if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) return null; + const decodeTimestamp = timingEntry.startDecodeTimestamp + (sampleIndex - timingEntry.startIndex) * timingEntry.delta; + let presentationTimestamp = decodeTimestamp; + const offsetEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleCompositionTimeOffsets, sampleIndex, (x)=>x.startIndex); + const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex]; + if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) presentationTimestamp += offsetEntry.offset; + const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)]; + const chunkEntryIndex = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.sampleToChunk, sampleIndex, (x)=>x.startSampleIndex); + const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex]; + (0, _miscJs.assert)(chunkEntry); + const chunkIndex = chunkEntry.startChunkIndex + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk); + const chunkOffset = sampleTable.chunkOffsets[chunkIndex]; + const startSampleIndexOfChunk = chunkEntry.startSampleIndex + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk; + let chunkSize = 0; + let sampleOffset = chunkOffset; + if (sampleTable.sampleSizes.length === 1) { + sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk); + chunkSize += sampleSize * chunkEntry.samplesPerChunk; + } else for(let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++){ + const sampleSize = sampleTable.sampleSizes[i]; + if (i < sampleIndex) sampleOffset += sampleSize; + chunkSize += sampleSize; + } + let duration = timingEntry.delta; + if (sampleTable.presentationTimestamps) { + // In order to accurately compute the duration, we need to take the duration to the next sample in presentation + // order, not in decode order + const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex]; + (0, _miscJs.assert)(presentationIndex !== undefined); + if (presentationIndex < sampleTable.presentationTimestamps.length - 1) { + const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1]; + const nextPresentationTimestamp = nextEntry.presentationTimestamp; + duration = nextPresentationTimestamp - presentationTimestamp; + } + } + return { + presentationTimestamp, + duration, + sampleOffset, + sampleSize, + chunkOffset, + chunkSize, + isKeyFrame: sampleTable.keySampleIndices ? (0, _miscJs.binarySearchExact)(sampleTable.keySampleIndices, sampleIndex, (x)=>x) !== -1 : true + }; +}; +const getNextKeyframeIndexForSample = (sampleTable, sampleIndex)=>{ + if (!sampleTable.keySampleIndices) return sampleIndex + 1; + const index = (0, _miscJs.binarySearchLessOrEqual)(sampleTable.keySampleIndices, sampleIndex, (x)=>x); + return sampleTable.keySampleIndices[index + 1] ?? -1; +}; +const offsetFragmentTrackDataByTimestamp = (trackData, timestamp)=>{ + trackData.startTimestamp += timestamp; + trackData.endTimestamp += timestamp; + for (const sample of trackData.samples)sample.presentationTimestamp += timestamp; + for (const entry of trackData.presentationTimestamps)entry.presentationTimestamp += timestamp; +}; +/** Extracts the rotation component from a transformation matrix, in degrees. */ const extractRotationFromMatrix = (matrix)=>{ + const [m11, , , m21] = matrix; + const scaleX = Math.hypot(m11, m21); + const cosTheta = m11 / scaleX; + const sinTheta = m21 / scaleX; + // Invert the rotation because matrices are post-multiplied in ISOBMFF + const result = -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI); + if (!Number.isFinite(result)) // Can happen if the entire matrix is 0, for example + return 0; + return result; +}; +const sampleTableIsEmpty = (sampleTable)=>{ + return sampleTable.sampleSizes.length === 0; +}; + +},{"../codec.js":"4oSIO","../codec-data.js":"bzpVB","../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../misc.js":"kkhLS","../packet.js":"esYjd","./isobmff-misc.js":"2usK6","./isobmff-reader.js":"hjB9E","../reader.js":"fr2Ka","../metadata.js":"3j8h1","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"bzpVB":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "AvcNalUnitType", ()=>AvcNalUnitType); +parcelHelpers.export(exports, "HevcNalUnitType", ()=>HevcNalUnitType); +parcelHelpers.export(exports, "findNalUnitsInAnnexB", ()=>findNalUnitsInAnnexB); +parcelHelpers.export(exports, "transformAnnexBToLengthPrefixed", ()=>transformAnnexBToLengthPrefixed); +parcelHelpers.export(exports, "extractAvcNalUnits", ()=>extractAvcNalUnits); +parcelHelpers.export(exports, "extractAvcDecoderConfigurationRecord", ()=>extractAvcDecoderConfigurationRecord); +parcelHelpers.export(exports, "serializeAvcDecoderConfigurationRecord", ()=>serializeAvcDecoderConfigurationRecord); +parcelHelpers.export(exports, "deserializeAvcDecoderConfigurationRecord", ()=>deserializeAvcDecoderConfigurationRecord); +parcelHelpers.export(exports, "parseAvcSps", ()=>parseAvcSps); +parcelHelpers.export(exports, "extractHevcNalUnits", ()=>extractHevcNalUnits); +parcelHelpers.export(exports, "extractNalUnitTypeForHevc", ()=>extractNalUnitTypeForHevc); +parcelHelpers.export(exports, "extractHevcDecoderConfigurationRecord", ()=>extractHevcDecoderConfigurationRecord); +parcelHelpers.export(exports, "serializeHevcDecoderConfigurationRecord", ()=>serializeHevcDecoderConfigurationRecord); +parcelHelpers.export(exports, "extractVp9CodecInfoFromPacket", ()=>extractVp9CodecInfoFromPacket); +parcelHelpers.export(exports, "iterateAv1PacketObus", ()=>iterateAv1PacketObus); +parcelHelpers.export(exports, "extractAv1CodecInfoFromPacket", ()=>extractAv1CodecInfoFromPacket); +parcelHelpers.export(exports, "parseOpusIdentificationHeader", ()=>parseOpusIdentificationHeader); +parcelHelpers.export(exports, "parseOpusTocByte", ()=>parseOpusTocByte); +parcelHelpers.export(exports, "parseModesFromVorbisSetupPacket", ()=>parseModesFromVorbisSetupPacket); +parcelHelpers.export(exports, "determineVideoPacketType", ()=>determineVideoPacketType); +parcelHelpers.export(exports, "FlacBlockType", ()=>FlacBlockType); +parcelHelpers.export(exports, "readVorbisComments", ()=>readVorbisComments); +parcelHelpers.export(exports, "createVorbisComments", ()=>createVorbisComments); +var _codecJs = require("./codec.js"); +var _miscJs = require("./misc.js"); +var AvcNalUnitType; +(function(AvcNalUnitType) { + AvcNalUnitType[AvcNalUnitType["IDR"] = 5] = "IDR"; + AvcNalUnitType[AvcNalUnitType["SEI"] = 6] = "SEI"; + AvcNalUnitType[AvcNalUnitType["SPS"] = 7] = "SPS"; + AvcNalUnitType[AvcNalUnitType["PPS"] = 8] = "PPS"; + AvcNalUnitType[AvcNalUnitType["SPS_EXT"] = 13] = "SPS_EXT"; +})(AvcNalUnitType || (AvcNalUnitType = {})); +var HevcNalUnitType; +(function(HevcNalUnitType) { + HevcNalUnitType[HevcNalUnitType["RASL_N"] = 8] = "RASL_N"; + HevcNalUnitType[HevcNalUnitType["RASL_R"] = 9] = "RASL_R"; + HevcNalUnitType[HevcNalUnitType["BLA_W_LP"] = 16] = "BLA_W_LP"; + HevcNalUnitType[HevcNalUnitType["RSV_IRAP_VCL23"] = 23] = "RSV_IRAP_VCL23"; + HevcNalUnitType[HevcNalUnitType["VPS_NUT"] = 32] = "VPS_NUT"; + HevcNalUnitType[HevcNalUnitType["SPS_NUT"] = 33] = "SPS_NUT"; + HevcNalUnitType[HevcNalUnitType["PPS_NUT"] = 34] = "PPS_NUT"; + HevcNalUnitType[HevcNalUnitType["PREFIX_SEI_NUT"] = 39] = "PREFIX_SEI_NUT"; + HevcNalUnitType[HevcNalUnitType["SUFFIX_SEI_NUT"] = 40] = "SUFFIX_SEI_NUT"; +})(HevcNalUnitType || (HevcNalUnitType = {})); +const findNalUnitsInAnnexB = (packetData)=>{ + const nalUnits = []; + let i = 0; + while(i < packetData.length){ + let startCodePos = -1; + let startCodeLength = 0; + for(let j = i; j < packetData.length - 3; j++){ + // Check for 3-byte start code (0x000001) + if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) { + startCodePos = j; + startCodeLength = 3; + break; + } + // Check for 4-byte start code (0x00000001) + if (j < packetData.length - 4 && packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 0 && packetData[j + 3] === 1) { + startCodePos = j; + startCodeLength = 4; + break; + } + } + if (startCodePos === -1) break; // No more start codes found + // If this isn't the first start code, extract the previous NAL unit + if (i > 0 && startCodePos > i) { + const nalData = packetData.subarray(i, startCodePos); + if (nalData.length > 0) nalUnits.push(nalData); + } + i = startCodePos + startCodeLength; + } + // Extract the last NAL unit if there is one + if (i < packetData.length) { + const nalData = packetData.subarray(i); + if (nalData.length > 0) nalUnits.push(nalData); + } + return nalUnits; +}; +/** Finds all NAL units in an AVC packet in length-prefixed format. */ const findNalUnitsInLengthPrefixed = (packetData, lengthSize)=>{ + const nalUnits = []; + let offset = 0; + const dataView = new DataView(packetData.buffer, packetData.byteOffset, packetData.byteLength); + while(offset + lengthSize <= packetData.length){ + let nalUnitLength; + if (lengthSize === 1) nalUnitLength = dataView.getUint8(offset); + else if (lengthSize === 2) nalUnitLength = dataView.getUint16(offset, false); + else if (lengthSize === 3) nalUnitLength = (0, _miscJs.getUint24)(dataView, offset, false); + else if (lengthSize === 4) nalUnitLength = dataView.getUint32(offset, false); + else { + (0, _miscJs.assertNever)(lengthSize); + (0, _miscJs.assert)(false); + } + offset += lengthSize; + const nalUnit = packetData.subarray(offset, offset + nalUnitLength); + nalUnits.push(nalUnit); + offset += nalUnitLength; + } + return nalUnits; +}; +const removeEmulationPreventionBytes = (data)=>{ + const result = []; + const len = data.length; + for(let i = 0; i < len; i++)// Look for the 0x000003 pattern + if (i + 2 < len && data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x03) { + result.push(0x00, 0x00); // Push the first two bytes + i += 2; // Skip the 0x03 byte + } else result.push(data[i]); + return new Uint8Array(result); +}; +const transformAnnexBToLengthPrefixed = (packetData)=>{ + const NAL_UNIT_LENGTH_SIZE = 4; + const nalUnits = findNalUnitsInAnnexB(packetData); + if (nalUnits.length === 0) // If no NAL units were found, it's not valid Annex B data + return null; + let totalSize = 0; + for (const nalUnit of nalUnits)totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength; + const avccData = new Uint8Array(totalSize); + const dataView = new DataView(avccData.buffer); + let offset = 0; + // Write each NAL unit with its length prefix + for (const nalUnit of nalUnits){ + const length = nalUnit.byteLength; + dataView.setUint32(offset, length, false); + offset += 4; + avccData.set(nalUnit, offset); + offset += nalUnit.byteLength; + } + return avccData; +}; +const extractAvcNalUnits = (packetData, decoderConfig)=>{ + if (decoderConfig.description) { + // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config + const bytes = (0, _miscJs.toUint8Array)(decoderConfig.description); + const lengthSizeMinusOne = bytes[4] & 3; + const lengthSize = lengthSizeMinusOne + 1; + return findNalUnitsInLengthPrefixed(packetData, lengthSize); + } else // Stream is in Annex B format + return findNalUnitsInAnnexB(packetData); +}; +const extractNalUnitTypeForAvc = (data)=>{ + return data[0] & 0x1F; +}; +const extractAvcDecoderConfigurationRecord = (packetData)=>{ + try { + const nalUnits = findNalUnitsInAnnexB(packetData); + const spsUnits = nalUnits.filter((unit)=>extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS); + const ppsUnits = nalUnits.filter((unit)=>extractNalUnitTypeForAvc(unit) === AvcNalUnitType.PPS); + const spsExtUnits = nalUnits.filter((unit)=>extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS_EXT); + if (spsUnits.length === 0) return null; + if (ppsUnits.length === 0) return null; + // Let's get the first SPS for profile and level information + const spsData = spsUnits[0]; + const spsInfo = parseAvcSps(spsData); + (0, _miscJs.assert)(spsInfo !== null); + const hasExtendedData = spsInfo.profileIdc === 100 || spsInfo.profileIdc === 110 || spsInfo.profileIdc === 122 || spsInfo.profileIdc === 144; + return { + configurationVersion: 1, + avcProfileIndication: spsInfo.profileIdc, + profileCompatibility: spsInfo.constraintFlags, + avcLevelIndication: spsInfo.levelIdc, + lengthSizeMinusOne: 3, + sequenceParameterSets: spsUnits, + pictureParameterSets: ppsUnits, + chromaFormat: hasExtendedData ? spsInfo.chromaFormatIdc : null, + bitDepthLumaMinus8: hasExtendedData ? spsInfo.bitDepthLumaMinus8 : null, + bitDepthChromaMinus8: hasExtendedData ? spsInfo.bitDepthChromaMinus8 : null, + sequenceParameterSetExt: hasExtendedData ? spsExtUnits : null + }; + } catch (error) { + console.error('Error building AVC Decoder Configuration Record:', error); + return null; + } +}; +const serializeAvcDecoderConfigurationRecord = (record)=>{ + const bytes = []; + // Write header + bytes.push(record.configurationVersion); + bytes.push(record.avcProfileIndication); + bytes.push(record.profileCompatibility); + bytes.push(record.avcLevelIndication); + bytes.push(0xFC | record.lengthSizeMinusOne & 0x03); // Reserved bits (6) + lengthSizeMinusOne (2) + // Reserved bits (3) + numOfSequenceParameterSets (5) + bytes.push(0xE0 | record.sequenceParameterSets.length & 0x1F); + // Write SPS + for (const sps of record.sequenceParameterSets){ + const length = sps.byteLength; + bytes.push(length >> 8); // High byte + bytes.push(length & 0xFF); // Low byte + for(let i = 0; i < length; i++)bytes.push(sps[i]); + } + bytes.push(record.pictureParameterSets.length); + // Write PPS + for (const pps of record.pictureParameterSets){ + const length = pps.byteLength; + bytes.push(length >> 8); // High byte + bytes.push(length & 0xFF); // Low byte + for(let i = 0; i < length; i++)bytes.push(pps[i]); + } + if (record.avcProfileIndication === 100 || record.avcProfileIndication === 110 || record.avcProfileIndication === 122 || record.avcProfileIndication === 144) { + (0, _miscJs.assert)(record.chromaFormat !== null); + (0, _miscJs.assert)(record.bitDepthLumaMinus8 !== null); + (0, _miscJs.assert)(record.bitDepthChromaMinus8 !== null); + (0, _miscJs.assert)(record.sequenceParameterSetExt !== null); + bytes.push(0xFC | record.chromaFormat & 0x03); // Reserved bits + chroma_format + bytes.push(0xF8 | record.bitDepthLumaMinus8 & 0x07); // Reserved bits + bit_depth_luma_minus8 + bytes.push(0xF8 | record.bitDepthChromaMinus8 & 0x07); // Reserved bits + bit_depth_chroma_minus8 + bytes.push(record.sequenceParameterSetExt.length); + // Write SPS Ext + for (const spsExt of record.sequenceParameterSetExt){ + const length = spsExt.byteLength; + bytes.push(length >> 8); // High byte + bytes.push(length & 0xFF); // Low byte + for(let i = 0; i < length; i++)bytes.push(spsExt[i]); + } + } + return new Uint8Array(bytes); +}; +const deserializeAvcDecoderConfigurationRecord = (data)=>{ + try { + const view = (0, _miscJs.toDataView)(data); + let offset = 0; + // Read header + const configurationVersion = view.getUint8(offset++); + const avcProfileIndication = view.getUint8(offset++); + const profileCompatibility = view.getUint8(offset++); + const avcLevelIndication = view.getUint8(offset++); + const lengthSizeMinusOne = view.getUint8(offset++) & 0x03; + const numOfSequenceParameterSets = view.getUint8(offset++) & 0x1F; + // Read SPS + const sequenceParameterSets = []; + for(let i = 0; i < numOfSequenceParameterSets; i++){ + const length = view.getUint16(offset, false); + offset += 2; + sequenceParameterSets.push(data.subarray(offset, offset + length)); + offset += length; + } + const numOfPictureParameterSets = view.getUint8(offset++); + // Read PPS + const pictureParameterSets = []; + for(let i = 0; i < numOfPictureParameterSets; i++){ + const length = view.getUint16(offset, false); + offset += 2; + pictureParameterSets.push(data.subarray(offset, offset + length)); + offset += length; + } + const record = { + configurationVersion, + avcProfileIndication, + profileCompatibility, + avcLevelIndication, + lengthSizeMinusOne, + sequenceParameterSets, + pictureParameterSets, + chromaFormat: null, + bitDepthLumaMinus8: null, + bitDepthChromaMinus8: null, + sequenceParameterSetExt: null + }; + // Check if there are extended profile fields + if ((avcProfileIndication === 100 || avcProfileIndication === 110 || avcProfileIndication === 122 || avcProfileIndication === 144) && offset + 4 <= data.length) { + const chromaFormat = view.getUint8(offset++) & 0x03; + const bitDepthLumaMinus8 = view.getUint8(offset++) & 0x07; + const bitDepthChromaMinus8 = view.getUint8(offset++) & 0x07; + const numOfSequenceParameterSetExt = view.getUint8(offset++); + record.chromaFormat = chromaFormat; + record.bitDepthLumaMinus8 = bitDepthLumaMinus8; + record.bitDepthChromaMinus8 = bitDepthChromaMinus8; + // Read SPS Ext + const sequenceParameterSetExt = []; + for(let i = 0; i < numOfSequenceParameterSetExt; i++){ + const length = view.getUint16(offset, false); + offset += 2; + sequenceParameterSetExt.push(data.subarray(offset, offset + length)); + offset += length; + } + record.sequenceParameterSetExt = sequenceParameterSetExt; + } + return record; + } catch (error) { + console.error('Error deserializing AVC Decoder Configuration Record:', error); + return null; + } +}; +const parseAvcSps = (sps)=>{ + try { + const bitstream = new (0, _miscJs.Bitstream)(removeEmulationPreventionBytes(sps)); + bitstream.skipBits(1); // forbidden_zero_bit + bitstream.skipBits(2); // nal_ref_idc + const nalUnitType = bitstream.readBits(5); + if (nalUnitType !== 7) return null; + const profileIdc = bitstream.readAlignedByte(); + const constraintFlags = bitstream.readAlignedByte(); + const levelIdc = bitstream.readAlignedByte(); + (0, _miscJs.readExpGolomb)(bitstream); // seq_parameter_set_id + let chromaFormatIdc = null; + let bitDepthLumaMinus8 = null; + let bitDepthChromaMinus8 = null; + // Handle high profile chroma_format_idc + if (profileIdc === 100 || profileIdc === 110 || profileIdc === 122 || profileIdc === 244 || profileIdc === 44 || profileIdc === 83 || profileIdc === 86 || profileIdc === 118 || profileIdc === 128) { + chromaFormatIdc = (0, _miscJs.readExpGolomb)(bitstream); + if (chromaFormatIdc === 3) bitstream.skipBits(1); // separate_colour_plane_flag + bitDepthLumaMinus8 = (0, _miscJs.readExpGolomb)(bitstream); + bitDepthChromaMinus8 = (0, _miscJs.readExpGolomb)(bitstream); + bitstream.skipBits(1); // qpprime_y_zero_transform_bypass_flag + const seqScalingMatrixPresentFlag = bitstream.readBits(1); + if (seqScalingMatrixPresentFlag) for(let i = 0; i < (chromaFormatIdc !== 3 ? 8 : 12); i++){ + const seqScalingListPresentFlag = bitstream.readBits(1); + if (seqScalingListPresentFlag) { + const sizeOfScalingList = i < 6 ? 16 : 64; + let lastScale = 8; + let nextScale = 8; + for(let j = 0; j < sizeOfScalingList; j++){ + if (nextScale !== 0) { + const deltaScale = (0, _miscJs.readSignedExpGolomb)(bitstream); + nextScale = (lastScale + deltaScale + 256) % 256; + } + lastScale = nextScale === 0 ? lastScale : nextScale; + } + } + } + } + (0, _miscJs.readExpGolomb)(bitstream); // log2_max_frame_num_minus4 + const picOrderCntType = (0, _miscJs.readExpGolomb)(bitstream); + if (picOrderCntType === 0) (0, _miscJs.readExpGolomb)(bitstream); // log2_max_pic_order_cnt_lsb_minus4 + else if (picOrderCntType === 1) { + bitstream.skipBits(1); // delta_pic_order_always_zero_flag + (0, _miscJs.readSignedExpGolomb)(bitstream); // offset_for_non_ref_pic + (0, _miscJs.readSignedExpGolomb)(bitstream); // offset_for_top_to_bottom_field + const numRefFramesInPicOrderCntCycle = (0, _miscJs.readExpGolomb)(bitstream); + for(let i = 0; i < numRefFramesInPicOrderCntCycle; i++)(0, _miscJs.readSignedExpGolomb)(bitstream); // offset_for_ref_frame[i] + } + (0, _miscJs.readExpGolomb)(bitstream); // max_num_ref_frames + bitstream.skipBits(1); // gaps_in_frame_num_value_allowed_flag + (0, _miscJs.readExpGolomb)(bitstream); // pic_width_in_mbs_minus1 + (0, _miscJs.readExpGolomb)(bitstream); // pic_height_in_map_units_minus1 + const frameMbsOnlyFlag = bitstream.readBits(1); + return { + profileIdc, + constraintFlags, + levelIdc, + frameMbsOnlyFlag, + chromaFormatIdc, + bitDepthLumaMinus8, + bitDepthChromaMinus8 + }; + } catch (error) { + console.error('Error parsing AVC SPS:', error); + return null; + } +}; +const extractHevcNalUnits = (packetData, decoderConfig)=>{ + if (decoderConfig.description) { + // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config + const bytes = (0, _miscJs.toUint8Array)(decoderConfig.description); + const lengthSizeMinusOne = bytes[21] & 3; + const lengthSize = lengthSizeMinusOne + 1; + return findNalUnitsInLengthPrefixed(packetData, lengthSize); + } else // Stream is in Annex B format + return findNalUnitsInAnnexB(packetData); +}; +const extractNalUnitTypeForHevc = (data)=>{ + return data[0] >> 1 & 0x3F; +}; +const extractHevcDecoderConfigurationRecord = (packetData)=>{ + try { + const nalUnits = findNalUnitsInAnnexB(packetData); + const vpsUnits = nalUnits.filter((unit)=>extractNalUnitTypeForHevc(unit) === HevcNalUnitType.VPS_NUT); + const spsUnits = nalUnits.filter((unit)=>extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SPS_NUT); + const ppsUnits = nalUnits.filter((unit)=>extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PPS_NUT); + const seiUnits = nalUnits.filter((unit)=>extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PREFIX_SEI_NUT || extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SUFFIX_SEI_NUT); + if (spsUnits.length === 0 || ppsUnits.length === 0) return null; + const sps = spsUnits[0]; + const bitstream = new (0, _miscJs.Bitstream)(removeEmulationPreventionBytes(sps)); + bitstream.skipBits(16); // NAL header + bitstream.readBits(4); // sps_video_parameter_set_id + const sps_max_sub_layers_minus1 = bitstream.readBits(3); + const sps_temporal_id_nesting_flag = bitstream.readBits(1); + const { general_profile_space, general_tier_flag, general_profile_idc, general_profile_compatibility_flags, general_constraint_indicator_flags, general_level_idc } = parseProfileTierLevel(bitstream, sps_max_sub_layers_minus1); + (0, _miscJs.readExpGolomb)(bitstream); // sps_seq_parameter_set_id + const chroma_format_idc = (0, _miscJs.readExpGolomb)(bitstream); + if (chroma_format_idc === 3) bitstream.skipBits(1); // separate_colour_plane_flag + (0, _miscJs.readExpGolomb)(bitstream); // pic_width_in_luma_samples + (0, _miscJs.readExpGolomb)(bitstream); // pic_height_in_luma_samples + if (bitstream.readBits(1)) { + (0, _miscJs.readExpGolomb)(bitstream); // conf_win_left_offset + (0, _miscJs.readExpGolomb)(bitstream); // conf_win_right_offset + (0, _miscJs.readExpGolomb)(bitstream); // conf_win_top_offset + (0, _miscJs.readExpGolomb)(bitstream); // conf_win_bottom_offset + } + const bit_depth_luma_minus8 = (0, _miscJs.readExpGolomb)(bitstream); + const bit_depth_chroma_minus8 = (0, _miscJs.readExpGolomb)(bitstream); + (0, _miscJs.readExpGolomb)(bitstream); // log2_max_pic_order_cnt_lsb_minus4 + const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1); + const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1; + for(let i = maxNum; i <= sps_max_sub_layers_minus1; i++){ + (0, _miscJs.readExpGolomb)(bitstream); // sps_max_dec_pic_buffering_minus1[i] + (0, _miscJs.readExpGolomb)(bitstream); // sps_max_num_reorder_pics[i] + (0, _miscJs.readExpGolomb)(bitstream); // sps_max_latency_increase_plus1[i] + } + (0, _miscJs.readExpGolomb)(bitstream); // log2_min_luma_coding_block_size_minus3 + (0, _miscJs.readExpGolomb)(bitstream); // log2_diff_max_min_luma_coding_block_size + (0, _miscJs.readExpGolomb)(bitstream); // log2_min_luma_transform_block_size_minus2 + (0, _miscJs.readExpGolomb)(bitstream); // log2_diff_max_min_luma_transform_block_size + (0, _miscJs.readExpGolomb)(bitstream); // max_transform_hierarchy_depth_inter + (0, _miscJs.readExpGolomb)(bitstream); // max_transform_hierarchy_depth_intra + if (bitstream.readBits(1)) { + if (bitstream.readBits(1)) skipScalingListData(bitstream); + } + bitstream.skipBits(1); // amp_enabled_flag + bitstream.skipBits(1); // sample_adaptive_offset_enabled_flag + if (bitstream.readBits(1)) { + bitstream.skipBits(4); // pcm_sample_bit_depth_luma_minus1 + bitstream.skipBits(4); // pcm_sample_bit_depth_chroma_minus1 + (0, _miscJs.readExpGolomb)(bitstream); // log2_min_pcm_luma_coding_block_size_minus3 + (0, _miscJs.readExpGolomb)(bitstream); // log2_diff_max_min_pcm_luma_coding_block_size + bitstream.skipBits(1); // pcm_loop_filter_disabled_flag + } + const num_short_term_ref_pic_sets = (0, _miscJs.readExpGolomb)(bitstream); + skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets); + if (bitstream.readBits(1)) { + const num_long_term_ref_pics_sps = (0, _miscJs.readExpGolomb)(bitstream); + for(let i = 0; i < num_long_term_ref_pics_sps; i++){ + (0, _miscJs.readExpGolomb)(bitstream); // lt_ref_pic_poc_lsb_sps[i] + bitstream.skipBits(1); // used_by_curr_pic_lt_sps_flag[i] + } + } + bitstream.skipBits(1); // sps_temporal_mvp_enabled_flag + bitstream.skipBits(1); // strong_intra_smoothing_enabled_flag + let min_spatial_segmentation_idc = 0; + if (bitstream.readBits(1)) min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1); + // Parse PPS for parallelismType + let parallelismType = 0; + if (ppsUnits.length > 0) { + const pps = ppsUnits[0]; + const ppsBitstream = new (0, _miscJs.Bitstream)(removeEmulationPreventionBytes(pps)); + ppsBitstream.skipBits(16); // NAL header + (0, _miscJs.readExpGolomb)(ppsBitstream); // pps_pic_parameter_set_id + (0, _miscJs.readExpGolomb)(ppsBitstream); // pps_seq_parameter_set_id + ppsBitstream.skipBits(1); // dependent_slice_segments_enabled_flag + ppsBitstream.skipBits(1); // output_flag_present_flag + ppsBitstream.skipBits(3); // num_extra_slice_header_bits + ppsBitstream.skipBits(1); // sign_data_hiding_enabled_flag + ppsBitstream.skipBits(1); // cabac_init_present_flag + (0, _miscJs.readExpGolomb)(ppsBitstream); // num_ref_idx_l0_default_active_minus1 + (0, _miscJs.readExpGolomb)(ppsBitstream); // num_ref_idx_l1_default_active_minus1 + (0, _miscJs.readSignedExpGolomb)(ppsBitstream); // init_qp_minus26 + ppsBitstream.skipBits(1); // constrained_intra_pred_flag + ppsBitstream.skipBits(1); // transform_skip_enabled_flag + if (ppsBitstream.readBits(1)) (0, _miscJs.readExpGolomb)(ppsBitstream); // diff_cu_qp_delta_depth + (0, _miscJs.readSignedExpGolomb)(ppsBitstream); // pps_cb_qp_offset + (0, _miscJs.readSignedExpGolomb)(ppsBitstream); // pps_cr_qp_offset + ppsBitstream.skipBits(1); // pps_slice_chroma_qp_offsets_present_flag + ppsBitstream.skipBits(1); // weighted_pred_flag + ppsBitstream.skipBits(1); // weighted_bipred_flag + ppsBitstream.skipBits(1); // transquant_bypass_enabled_flag + const tiles_enabled_flag = ppsBitstream.readBits(1); + const entropy_coding_sync_enabled_flag = ppsBitstream.readBits(1); + if (!tiles_enabled_flag && !entropy_coding_sync_enabled_flag) parallelismType = 0; + else if (tiles_enabled_flag && !entropy_coding_sync_enabled_flag) parallelismType = 2; + else if (!tiles_enabled_flag && entropy_coding_sync_enabled_flag) parallelismType = 3; + else parallelismType = 0; + } + const arrays = [ + ...vpsUnits.length ? [ + { + arrayCompleteness: 1, + nalUnitType: HevcNalUnitType.VPS_NUT, + nalUnits: vpsUnits + } + ] : [], + ...spsUnits.length ? [ + { + arrayCompleteness: 1, + nalUnitType: HevcNalUnitType.SPS_NUT, + nalUnits: spsUnits + } + ] : [], + ...ppsUnits.length ? [ + { + arrayCompleteness: 1, + nalUnitType: HevcNalUnitType.PPS_NUT, + nalUnits: ppsUnits + } + ] : [], + ...seiUnits.length ? [ + { + arrayCompleteness: 1, + nalUnitType: extractNalUnitTypeForHevc(seiUnits[0]), + nalUnits: seiUnits + } + ] : [] + ]; + const record = { + configurationVersion: 1, + generalProfileSpace: general_profile_space, + generalTierFlag: general_tier_flag, + generalProfileIdc: general_profile_idc, + generalProfileCompatibilityFlags: general_profile_compatibility_flags, + generalConstraintIndicatorFlags: general_constraint_indicator_flags, + generalLevelIdc: general_level_idc, + minSpatialSegmentationIdc: min_spatial_segmentation_idc, + parallelismType, + chromaFormatIdc: chroma_format_idc, + bitDepthLumaMinus8: bit_depth_luma_minus8, + bitDepthChromaMinus8: bit_depth_chroma_minus8, + avgFrameRate: 0, + constantFrameRate: 0, + numTemporalLayers: sps_max_sub_layers_minus1 + 1, + temporalIdNested: sps_temporal_id_nesting_flag, + lengthSizeMinusOne: 3, + arrays + }; + return record; + } catch (error) { + console.error('Error building HEVC Decoder Configuration Record:', error); + return null; + } +}; +const parseProfileTierLevel = (bitstream, maxNumSubLayersMinus1)=>{ + const general_profile_space = bitstream.readBits(2); + const general_tier_flag = bitstream.readBits(1); + const general_profile_idc = bitstream.readBits(5); + let general_profile_compatibility_flags = 0; + for(let i = 0; i < 32; i++)general_profile_compatibility_flags = general_profile_compatibility_flags << 1 | bitstream.readBits(1); + const general_constraint_indicator_flags = new Uint8Array(6); + for(let i = 0; i < 6; i++)general_constraint_indicator_flags[i] = bitstream.readBits(8); + const general_level_idc = bitstream.readBits(8); + const sub_layer_profile_present_flag = []; + const sub_layer_level_present_flag = []; + for(let i = 0; i < maxNumSubLayersMinus1; i++){ + sub_layer_profile_present_flag.push(bitstream.readBits(1)); + sub_layer_level_present_flag.push(bitstream.readBits(1)); + } + if (maxNumSubLayersMinus1 > 0) for(let i = maxNumSubLayersMinus1; i < 8; i++)bitstream.skipBits(2); // reserved_zero_2bits + for(let i = 0; i < maxNumSubLayersMinus1; i++){ + if (sub_layer_profile_present_flag[i]) bitstream.skipBits(88); + if (sub_layer_level_present_flag[i]) bitstream.skipBits(8); + } + return { + general_profile_space, + general_tier_flag, + general_profile_idc, + general_profile_compatibility_flags, + general_constraint_indicator_flags, + general_level_idc + }; +}; +const skipScalingListData = (bitstream)=>{ + for(let sizeId = 0; sizeId < 4; sizeId++)for(let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++){ + const scaling_list_pred_mode_flag = bitstream.readBits(1); + if (!scaling_list_pred_mode_flag) (0, _miscJs.readExpGolomb)(bitstream); // scaling_list_pred_matrix_id_delta + else { + const coefNum = Math.min(64, 1 << 4 + (sizeId << 1)); + if (sizeId > 1) (0, _miscJs.readSignedExpGolomb)(bitstream); // scaling_list_dc_coef_minus8 + for(let i = 0; i < coefNum; i++)(0, _miscJs.readSignedExpGolomb)(bitstream); // scaling_list_delta_coef + } + } +}; +const skipAllStRefPicSets = (bitstream, num_short_term_ref_pic_sets)=>{ + const NumDeltaPocs = []; + for(let stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; stRpsIdx++)NumDeltaPocs[stRpsIdx] = skipStRefPicSet(bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs); +}; +const skipStRefPicSet = (bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs)=>{ + let NumDeltaPocsThis = 0; + let inter_ref_pic_set_prediction_flag = 0; + let RefRpsIdx = 0; + if (stRpsIdx !== 0) inter_ref_pic_set_prediction_flag = bitstream.readBits(1); + if (inter_ref_pic_set_prediction_flag) { + if (stRpsIdx === num_short_term_ref_pic_sets) { + const delta_idx_minus1 = (0, _miscJs.readExpGolomb)(bitstream); + RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1); + } else RefRpsIdx = stRpsIdx - 1; + bitstream.readBits(1); // delta_rps_sign + (0, _miscJs.readExpGolomb)(bitstream); // abs_delta_rps_minus1 + // The number of iterations is NumDeltaPocs[RefRpsIdx] + 1 + const numDelta = NumDeltaPocs[RefRpsIdx] ?? 0; + for(let j = 0; j <= numDelta; j++){ + const used_by_curr_pic_flag = bitstream.readBits(1); + if (!used_by_curr_pic_flag) bitstream.readBits(1); // use_delta_flag + } + NumDeltaPocsThis = NumDeltaPocs[RefRpsIdx]; + } else { + const num_negative_pics = (0, _miscJs.readExpGolomb)(bitstream); + const num_positive_pics = (0, _miscJs.readExpGolomb)(bitstream); + for(let i = 0; i < num_negative_pics; i++){ + (0, _miscJs.readExpGolomb)(bitstream); // delta_poc_s0_minus1[i] + bitstream.readBits(1); // used_by_curr_pic_s0_flag[i] + } + for(let i = 0; i < num_positive_pics; i++){ + (0, _miscJs.readExpGolomb)(bitstream); // delta_poc_s1_minus1[i] + bitstream.readBits(1); // used_by_curr_pic_s1_flag[i] + } + NumDeltaPocsThis = num_negative_pics + num_positive_pics; + } + return NumDeltaPocsThis; +}; +const parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1)=>{ + if (bitstream.readBits(1)) { + const aspect_ratio_idc = bitstream.readBits(8); + if (aspect_ratio_idc === 255) { + bitstream.readBits(16); // sar_width + bitstream.readBits(16); // sar_height + } + } + if (bitstream.readBits(1)) bitstream.readBits(1); // overscan_appropriate_flag + if (bitstream.readBits(1)) { + bitstream.readBits(3); // video_format + bitstream.readBits(1); // video_full_range_flag + if (bitstream.readBits(1)) { + bitstream.readBits(8); // colour_primaries + bitstream.readBits(8); // transfer_characteristics + bitstream.readBits(8); // matrix_coeffs + } + } + if (bitstream.readBits(1)) { + (0, _miscJs.readExpGolomb)(bitstream); // chroma_sample_loc_type_top_field + (0, _miscJs.readExpGolomb)(bitstream); // chroma_sample_loc_type_bottom_field + } + bitstream.readBits(1); // neutral_chroma_indication_flag + bitstream.readBits(1); // field_seq_flag + bitstream.readBits(1); // frame_field_info_present_flag + if (bitstream.readBits(1)) { + (0, _miscJs.readExpGolomb)(bitstream); // def_disp_win_left_offset + (0, _miscJs.readExpGolomb)(bitstream); // def_disp_win_right_offset + (0, _miscJs.readExpGolomb)(bitstream); // def_disp_win_top_offset + (0, _miscJs.readExpGolomb)(bitstream); // def_disp_win_bottom_offset + } + if (bitstream.readBits(1)) { + bitstream.readBits(32); // vui_num_units_in_tick + bitstream.readBits(32); // vui_time_scale + if (bitstream.readBits(1)) (0, _miscJs.readExpGolomb)(bitstream); // vui_num_ticks_poc_diff_one_minus1 + if (bitstream.readBits(1)) skipHrdParameters(bitstream, true, sps_max_sub_layers_minus1); + } + if (bitstream.readBits(1)) { + bitstream.readBits(1); // tiles_fixed_structure_flag + bitstream.readBits(1); // motion_vectors_over_pic_boundaries_flag + bitstream.readBits(1); // restricted_ref_pic_lists_flag + const min_spatial_segmentation_idc = (0, _miscJs.readExpGolomb)(bitstream); + // skip the rest + (0, _miscJs.readExpGolomb)(bitstream); // max_bytes_per_pic_denom + (0, _miscJs.readExpGolomb)(bitstream); // max_bits_per_min_cu_denom + (0, _miscJs.readExpGolomb)(bitstream); // log2_max_mv_length_horizontal + (0, _miscJs.readExpGolomb)(bitstream); // log2_max_mv_length_vertical + return min_spatial_segmentation_idc; + } + return 0; +}; +const skipHrdParameters = (bitstream, commonInfPresentFlag, maxNumSubLayersMinus1)=>{ + let nal_hrd_parameters_present_flag = false; + let vcl_hrd_parameters_present_flag = false; + let sub_pic_hrd_params_present_flag = false; + if (commonInfPresentFlag) { + nal_hrd_parameters_present_flag = bitstream.readBits(1) === 1; + vcl_hrd_parameters_present_flag = bitstream.readBits(1) === 1; + if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) { + sub_pic_hrd_params_present_flag = bitstream.readBits(1) === 1; + if (sub_pic_hrd_params_present_flag) { + bitstream.readBits(8); // tick_divisor_minus2 + bitstream.readBits(5); // du_cpb_removal_delay_increment_length_minus1 + bitstream.readBits(1); // sub_pic_cpb_params_in_pic_timing_sei_flag + bitstream.readBits(5); // dpb_output_delay_du_length_minus1 + } + bitstream.readBits(4); // bit_rate_scale + bitstream.readBits(4); // cpb_size_scale + if (sub_pic_hrd_params_present_flag) bitstream.readBits(4); // cpb_size_du_scale + bitstream.readBits(5); // initial_cpb_removal_delay_length_minus1 + bitstream.readBits(5); // au_cpb_removal_delay_length_minus1 + bitstream.readBits(5); // dpb_output_delay_length_minus1 + } + } + for(let i = 0; i <= maxNumSubLayersMinus1; i++){ + const fixed_pic_rate_general_flag = bitstream.readBits(1) === 1; + let fixed_pic_rate_within_cvs_flag = true; // Default assumption if general is true + if (!fixed_pic_rate_general_flag) fixed_pic_rate_within_cvs_flag = bitstream.readBits(1) === 1; + let low_delay_hrd_flag = false; // Default assumption + if (fixed_pic_rate_within_cvs_flag) (0, _miscJs.readExpGolomb)(bitstream); // elemental_duration_in_tc_minus1[i] + else low_delay_hrd_flag = bitstream.readBits(1) === 1; + let CpbCnt = 1; // Default if low_delay is true + if (!low_delay_hrd_flag) { + const cpb_cnt_minus1 = (0, _miscJs.readExpGolomb)(bitstream); // cpb_cnt_minus1[i] + CpbCnt = cpb_cnt_minus1 + 1; + } + if (nal_hrd_parameters_present_flag) skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag); + if (vcl_hrd_parameters_present_flag) skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag); + } +}; +const skipSubLayerHrdParameters = (bitstream, CpbCnt, sub_pic_hrd_params_present_flag)=>{ + for(let i = 0; i < CpbCnt; i++){ + (0, _miscJs.readExpGolomb)(bitstream); // bit_rate_value_minus1[i] + (0, _miscJs.readExpGolomb)(bitstream); // cpb_size_value_minus1[i] + if (sub_pic_hrd_params_present_flag) { + (0, _miscJs.readExpGolomb)(bitstream); // cpb_size_du_value_minus1[i] + (0, _miscJs.readExpGolomb)(bitstream); // bit_rate_du_value_minus1[i] + } + bitstream.readBits(1); // cbr_flag[i] + } +}; +const serializeHevcDecoderConfigurationRecord = (record)=>{ + const bytes = []; + bytes.push(record.configurationVersion); + bytes.push((record.generalProfileSpace & 0x3) << 6 | (record.generalTierFlag & 0x1) << 5 | record.generalProfileIdc & 0x1F); + bytes.push(record.generalProfileCompatibilityFlags >>> 24 & 0xFF); + bytes.push(record.generalProfileCompatibilityFlags >>> 16 & 0xFF); + bytes.push(record.generalProfileCompatibilityFlags >>> 8 & 0xFF); + bytes.push(record.generalProfileCompatibilityFlags & 0xFF); + bytes.push(...record.generalConstraintIndicatorFlags); + bytes.push(record.generalLevelIdc & 0xFF); + bytes.push(0xF0 | record.minSpatialSegmentationIdc >> 8 & 0x0F); // Reserved + high nibble + bytes.push(record.minSpatialSegmentationIdc & 0xFF); // Low byte + bytes.push(0xFC | record.parallelismType & 0x03); + bytes.push(0xFC | record.chromaFormatIdc & 0x03); + bytes.push(0xF8 | record.bitDepthLumaMinus8 & 0x07); + bytes.push(0xF8 | record.bitDepthChromaMinus8 & 0x07); + bytes.push(record.avgFrameRate >> 8 & 0xFF); // High byte + bytes.push(record.avgFrameRate & 0xFF); // Low byte + bytes.push((record.constantFrameRate & 0x03) << 6 | (record.numTemporalLayers & 0x07) << 3 | (record.temporalIdNested & 0x01) << 2 | record.lengthSizeMinusOne & 0x03); + bytes.push(record.arrays.length & 0xFF); + for (const arr of record.arrays){ + bytes.push((arr.arrayCompleteness & 0x01) << 7 | 0 | arr.nalUnitType & 0x3F); + bytes.push(arr.nalUnits.length >> 8 & 0xFF); // High byte + bytes.push(arr.nalUnits.length & 0xFF); // Low byte + for (const nal of arr.nalUnits){ + bytes.push(nal.length >> 8 & 0xFF); // High byte + bytes.push(nal.length & 0xFF); // Low byte + for(let i = 0; i < nal.length; i++)bytes.push(nal[i]); + } + } + return new Uint8Array(bytes); +}; +const extractVp9CodecInfoFromPacket = (packet)=>{ + // eslint-disable-next-line @stylistic/max-len + // https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf + // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf + const bitstream = new (0, _miscJs.Bitstream)(packet); + // Frame marker (0b10) + const frameMarker = bitstream.readBits(2); + if (frameMarker !== 2) return null; + // Profile + const profileLowBit = bitstream.readBits(1); + const profileHighBit = bitstream.readBits(1); + const profile = (profileHighBit << 1) + profileLowBit; + // Skip reserved bit for profile 3 + if (profile === 3) bitstream.skipBits(1); + // show_existing_frame + const showExistingFrame = bitstream.readBits(1); + if (showExistingFrame === 1) return null; + // frame_type (0 = key frame) + const frameType = bitstream.readBits(1); + if (frameType !== 0) return null; + // Skip show_frame and error_resilient_mode + bitstream.skipBits(2); + // Sync code (0x498342) + const syncCode = bitstream.readBits(24); + if (syncCode !== 0x498342) return null; + // Color config + let bitDepth = 8; + if (profile >= 2) { + const tenOrTwelveBit = bitstream.readBits(1); + bitDepth = tenOrTwelveBit ? 12 : 10; + } + // Color space + const colorSpace = bitstream.readBits(3); + let chromaSubsampling = 0; + let videoFullRangeFlag = 0; + if (colorSpace !== 7) { + const colorRange = bitstream.readBits(1); + videoFullRangeFlag = colorRange; + if (profile === 1 || profile === 3) { + const subsamplingX = bitstream.readBits(1); + const subsamplingY = bitstream.readBits(1); + // 0 = 4:2:0 vertical + // 1 = 4:2:0 colocated + // 2 = 4:2:2 + // 3 = 4:4:4 + chromaSubsampling = !subsamplingX && !subsamplingY ? 3 // 0,0 = 4:4:4 + : subsamplingX && !subsamplingY ? 2 // 1,0 = 4:2:2 + : 1; // 1,1 = 4:2:0 colocated (default) + // Skip reserved bit + bitstream.skipBits(1); + } else // For profile 0 and 2, always 4:2:0 + chromaSubsampling = 1; // Using colocated as default + } else { + // RGB is always 4:4:4 + chromaSubsampling = 3; + videoFullRangeFlag = 1; + } + // Parse frame size + const widthMinusOne = bitstream.readBits(16); + const heightMinusOne = bitstream.readBits(16); + const width = widthMinusOne + 1; + const height = heightMinusOne + 1; + // Calculate level based on dimensions + const pictureSize = width * height; + let level = (0, _miscJs.last)((0, _codecJs.VP9_LEVEL_TABLE)).level; // Default to highest level + for (const entry of (0, _codecJs.VP9_LEVEL_TABLE))if (pictureSize <= entry.maxPictureSize) { + level = entry.level; + break; + } + // Map color_space to standard values + const matrixCoefficients = colorSpace === 7 ? 0 : colorSpace === 2 ? 1 : colorSpace === 1 ? 6 : 2; + const colourPrimaries = colorSpace === 2 ? 1 : colorSpace === 1 ? 6 : 2; + const transferCharacteristics = colorSpace === 2 ? 1 : colorSpace === 1 ? 6 : 2; + return { + profile, + level, + bitDepth, + chromaSubsampling, + videoFullRangeFlag, + colourPrimaries, + transferCharacteristics, + matrixCoefficients + }; +}; +const iterateAv1PacketObus = function*(packet) { + // https://aomediacodec.github.io/av1-spec/av1-spec.pdf + const bitstream = new (0, _miscJs.Bitstream)(packet); + const readLeb128 = ()=>{ + let value = 0; + for(let i = 0; i < 8; i++){ + const byte = bitstream.readAlignedByte(); + value |= (byte & 0x7f) << i * 7; + if (!(byte & 0x80)) break; + // Spec requirement + if (i === 7 && byte & 0x80) return null; + } + // Spec requirement + if (value >= 2 ** 32 - 1) return null; + return value; + }; + while(bitstream.getBitsLeft() >= 8){ + // Parse OBU header + bitstream.skipBits(1); + const obuType = bitstream.readBits(4); + const obuExtension = bitstream.readBits(1); + const obuHasSizeField = bitstream.readBits(1); + bitstream.skipBits(1); + // Skip extension header if present + if (obuExtension) bitstream.skipBits(8); + // Read OBU size if present + let obuSize; + if (obuHasSizeField) { + const obuSizeValue = readLeb128(); + if (obuSizeValue === null) return; // It was invalid + obuSize = obuSizeValue; + } else // Calculate remaining bits and convert to bytes, rounding down + obuSize = Math.floor(bitstream.getBitsLeft() / 8); + (0, _miscJs.assert)(bitstream.pos % 8 === 0); + yield { + type: obuType, + data: packet.subarray(bitstream.pos / 8, bitstream.pos / 8 + obuSize) + }; + // Move to next OBU + bitstream.skipBits(obuSize * 8); + } +}; +const extractAv1CodecInfoFromPacket = (packet)=>{ + // https://aomediacodec.github.io/av1-spec/av1-spec.pdf + for (const { type, data } of iterateAv1PacketObus(packet)){ + if (type !== 1) continue; // 1 == OBU_SEQUENCE_HEADER + const bitstream = new (0, _miscJs.Bitstream)(data); + // Read sequence header fields + const seqProfile = bitstream.readBits(3); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const stillPicture = bitstream.readBits(1); + const reducedStillPictureHeader = bitstream.readBits(1); + let seqLevel = 0; + let seqTier = 0; + let bufferDelayLengthMinus1 = 0; + if (reducedStillPictureHeader) seqLevel = bitstream.readBits(5); + else { + // Parse timing_info_present_flag + const timingInfoPresentFlag = bitstream.readBits(1); + if (timingInfoPresentFlag) { + // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval) + bitstream.skipBits(32); // num_units_in_display_tick + bitstream.skipBits(32); // time_scale + const equalPictureInterval = bitstream.readBits(1); + if (equalPictureInterval) // Skip num_ticks_per_picture_minus_1 (uvlc) + // Since this is variable length, we'd need to implement uvlc reading + // For now, we'll return null as this is rare + return null; + } + // Parse decoder_model_info_present_flag + const decoderModelInfoPresentFlag = bitstream.readBits(1); + if (decoderModelInfoPresentFlag) { + // Store buffer_delay_length_minus_1 instead of just skipping + bufferDelayLengthMinus1 = bitstream.readBits(5); + bitstream.skipBits(32); // num_units_in_decoding_tick + bitstream.skipBits(5); // buffer_removal_time_length_minus_1 + bitstream.skipBits(5); // frame_presentation_time_length_minus_1 + } + // Parse operating_points_cnt_minus_1 + const operatingPointsCntMinus1 = bitstream.readBits(5); + // For each operating point + for(let i = 0; i <= operatingPointsCntMinus1; i++){ + // operating_point_idc[i] + bitstream.skipBits(12); + // seq_level_idx[i] + const seqLevelIdx = bitstream.readBits(5); + if (i === 0) seqLevel = seqLevelIdx; + if (seqLevelIdx > 7) { + // seq_tier[i] + const seqTierTemp = bitstream.readBits(1); + if (i === 0) seqTier = seqTierTemp; + } + if (decoderModelInfoPresentFlag) { + // decoder_model_present_for_this_op[i] + const decoderModelPresentForThisOp = bitstream.readBits(1); + if (decoderModelPresentForThisOp) { + const n = bufferDelayLengthMinus1 + 1; + bitstream.skipBits(n); // decoder_buffer_delay[op] + bitstream.skipBits(n); // encoder_buffer_delay[op] + bitstream.skipBits(1); // low_delay_mode_flag[op] + } + } + // initial_display_delay_present_flag + const initialDisplayDelayPresentFlag = bitstream.readBits(1); + if (initialDisplayDelayPresentFlag) // initial_display_delay_minus_1[i] + bitstream.skipBits(4); + } + } + // Frame size + const frameWidthBitsMinus1 = bitstream.readBits(4); + const frameHeightBitsMinus1 = bitstream.readBits(4); + const n1 = frameWidthBitsMinus1 + 1; + bitstream.skipBits(n1); // max_frame_width_minus_1 + const n2 = frameHeightBitsMinus1 + 1; + bitstream.skipBits(n2); // max_frame_height_minus_1 + // Frame IDs + let frameIdNumbersPresentFlag = 0; + if (reducedStillPictureHeader) frameIdNumbersPresentFlag = 0; + else frameIdNumbersPresentFlag = bitstream.readBits(1); + if (frameIdNumbersPresentFlag) { + bitstream.skipBits(4); // delta_frame_id_length_minus_2 + bitstream.skipBits(3); // additional_frame_id_length_minus_1 + } + bitstream.skipBits(1); // use_128x128_superblock + bitstream.skipBits(1); // enable_filter_intra + bitstream.skipBits(1); // enable_intra_edge_filter + if (!reducedStillPictureHeader) { + bitstream.skipBits(1); // enable_interintra_compound + bitstream.skipBits(1); // enable_masked_compound + bitstream.skipBits(1); // enable_warped_motion + bitstream.skipBits(1); // enable_dual_filter + const enableOrderHint = bitstream.readBits(1); + if (enableOrderHint) { + bitstream.skipBits(1); // enable_jnt_comp + bitstream.skipBits(1); // enable_ref_frame_mvs + } + const seqChooseScreenContentTools = bitstream.readBits(1); + let seqForceScreenContentTools = 0; + if (seqChooseScreenContentTools) seqForceScreenContentTools = 2; // SELECT_SCREEN_CONTENT_TOOLS + else seqForceScreenContentTools = bitstream.readBits(1); + if (seqForceScreenContentTools > 0) { + const seqChooseIntegerMv = bitstream.readBits(1); + if (!seqChooseIntegerMv) bitstream.skipBits(1); // seq_force_integer_mv + } + if (enableOrderHint) bitstream.skipBits(3); // order_hint_bits_minus_1 + } + bitstream.skipBits(1); // enable_superres + bitstream.skipBits(1); // enable_cdef + bitstream.skipBits(1); // enable_restoration + // color_config() + const highBitdepth = bitstream.readBits(1); + let bitDepth = 8; + if (seqProfile === 2 && highBitdepth) { + const twelveBit = bitstream.readBits(1); + bitDepth = twelveBit ? 12 : 10; + } else if (seqProfile <= 2) bitDepth = highBitdepth ? 10 : 8; + let monochrome = 0; + if (seqProfile !== 1) monochrome = bitstream.readBits(1); + let chromaSubsamplingX = 1; + let chromaSubsamplingY = 1; + let chromaSamplePosition = 0; + if (!monochrome) { + if (seqProfile === 0) { + chromaSubsamplingX = 1; + chromaSubsamplingY = 1; + } else if (seqProfile === 1) { + chromaSubsamplingX = 0; + chromaSubsamplingY = 0; + } else if (bitDepth === 12) { + chromaSubsamplingX = bitstream.readBits(1); + if (chromaSubsamplingX) chromaSubsamplingY = bitstream.readBits(1); + } + if (chromaSubsamplingX && chromaSubsamplingY) chromaSamplePosition = bitstream.readBits(2); + } + return { + profile: seqProfile, + level: seqLevel, + tier: seqTier, + bitDepth, + monochrome, + chromaSubsamplingX, + chromaSubsamplingY, + chromaSamplePosition + }; + } + return null; +}; +const parseOpusIdentificationHeader = (bytes)=>{ + const view = (0, _miscJs.toDataView)(bytes); + const outputChannelCount = view.getUint8(9); + const preSkip = view.getUint16(10, true); + const inputSampleRate = view.getUint32(12, true); + const outputGain = view.getInt16(16, true); + const channelMappingFamily = view.getUint8(18); + let channelMappingTable = null; + if (channelMappingFamily) channelMappingTable = bytes.subarray(19, 21 + outputChannelCount); + return { + outputChannelCount, + preSkip, + inputSampleRate, + outputGain, + channelMappingFamily, + channelMappingTable + }; +}; +// From https://datatracker.ietf.org/doc/html/rfc6716, in 48 kHz samples +const OPUS_FRAME_DURATION_TABLE = [ + 480, + 960, + 1920, + 2880, + 480, + 960, + 1920, + 2880, + 480, + 960, + 1920, + 2880, + 480, + 960, + 480, + 960, + 120, + 240, + 480, + 960, + 120, + 240, + 480, + 960, + 120, + 240, + 480, + 960, + 120, + 240, + 480, + 960 +]; +const parseOpusTocByte = (packet)=>{ + const config = packet[0] >> 3; + return { + durationInSamples: OPUS_FRAME_DURATION_TABLE[config] + }; +}; +const parseModesFromVorbisSetupPacket = (setupHeader)=>{ + // Verify that this is a Setup header. + if (setupHeader.length < 7) throw new Error('Setup header is too short.'); + if (setupHeader[0] !== 5) throw new Error('Wrong packet type in Setup header.'); + const signature = String.fromCharCode(...setupHeader.slice(1, 7)); + if (signature !== 'vorbis') throw new Error('Invalid packet signature in Setup header.'); + // Reverse the entire buffer. + const bufSize = setupHeader.length; + const revBuffer = new Uint8Array(bufSize); + for(let i = 0; i < bufSize; i++)revBuffer[i] = setupHeader[bufSize - 1 - i]; + // Initialize a Bitstream on the reversed buffer. + const bitstream = new (0, _miscJs.Bitstream)(revBuffer); + // --- Find the framing bit. + // In FFmpeg code, we scan until get_bits1() returns 1. + let gotFramingBit = 0; + while(bitstream.getBitsLeft() > 97)if (bitstream.readBits(1) === 1) { + gotFramingBit = bitstream.pos; + break; + } + if (gotFramingBit === 0) throw new Error('Invalid Setup header: framing bit not found.'); + // --- Search backwards for a valid mode header. + // We try to “guess” the number of modes by reading a fixed pattern. + let modeCount = 0; + let gotModeHeader = false; + let lastModeCount = 0; + while(bitstream.getBitsLeft() >= 97){ + const tempPos = bitstream.pos; + const a = bitstream.readBits(8); + const b = bitstream.readBits(16); + const c = bitstream.readBits(16); + // If a > 63 or b or c nonzero, assume we’ve gone too far. + if (a > 63 || b !== 0 || c !== 0) { + bitstream.pos = tempPos; + break; + } + bitstream.skipBits(1); + modeCount++; + if (modeCount > 64) break; + const bsClone = bitstream.clone(); + const candidate = bsClone.readBits(6) + 1; + if (candidate === modeCount) { + gotModeHeader = true; + lastModeCount = modeCount; + } + } + if (!gotModeHeader) throw new Error('Invalid Setup header: mode header not found.'); + if (lastModeCount > 63) throw new Error(`Unsupported mode count: ${lastModeCount}.`); + const finalModeCount = lastModeCount; + // --- Reinitialize the bitstream. + bitstream.pos = 0; + // Skip the bits up to the found framing bit. + bitstream.skipBits(gotFramingBit); + // --- Now read, for each mode (in reverse order), 40 bits then one bit. + // That one bit is the mode blockflag. + const modeBlockflags = Array(finalModeCount).fill(0); + for(let i = finalModeCount - 1; i >= 0; i--){ + bitstream.skipBits(40); + modeBlockflags[i] = bitstream.readBits(1); + } + return { + modeBlockflags + }; +}; +const determineVideoPacketType = (codec, decoderConfig, packetData)=>{ + switch(codec){ + case 'avc': + { + const nalUnits = extractAvcNalUnits(packetData, decoderConfig); + let isKeyframe = nalUnits.some((x)=>extractNalUnitTypeForAvc(x) === AvcNalUnitType.IDR); + if (!isKeyframe && (!(0, _miscJs.isChromium)() || (0, _miscJs.getChromiumVersion)() >= 144)) // In addition to IDR, Recovery Point SEI also counts as a valid H.264 keyframe by current consensus. + // See https://github.com/w3c/webcodecs/issues/650 for the relevant discussion. WebKit and Firefox have + // always supported them, but Chromium hasn't, therefore the (admittedly dirty) version check. + for (const nalUnit of nalUnits){ + const type = extractNalUnitTypeForAvc(nalUnit); + if (type !== AvcNalUnitType.SEI) continue; + const bytes = removeEmulationPreventionBytes(nalUnit); + let pos = 1; // Skip NALU header + // sei_rbsp() + do { + // sei_message() + let payloadType = 0; + while(true){ + const nextByte = bytes[pos++]; + if (nextByte === undefined) break; + payloadType += nextByte; + if (nextByte < 255) break; + } + let payloadSize = 0; + while(true){ + const nextByte = bytes[pos++]; + if (nextByte === undefined) break; + payloadSize += nextByte; + if (nextByte < 255) break; + } + // sei_payload() + const PAYLOAD_TYPE_RECOVERY_POINT = 6; + if (payloadType === PAYLOAD_TYPE_RECOVERY_POINT) { + const bitstream = new (0, _miscJs.Bitstream)(bytes); + bitstream.pos = 8 * pos; + const recoveryFrameCount = (0, _miscJs.readExpGolomb)(bitstream); + const exactMatchFlag = bitstream.readBits(1); + if (recoveryFrameCount === 0 && exactMatchFlag === 1) { + // https://github.com/w3c/webcodecs/pull/910 + // "recovery_frame_cnt == 0 and exact_match_flag=1 in the SEI recovery payload" + isKeyframe = true; + break; + } + } + pos += payloadSize; + }while (pos < bytes.length - 1); + } + return isKeyframe ? 'key' : 'delta'; + } + case 'hevc': + { + const nalUnits = extractHevcNalUnits(packetData, decoderConfig); + const isKeyframe = nalUnits.some((x)=>{ + const type = extractNalUnitTypeForHevc(x); + return HevcNalUnitType.BLA_W_LP <= type && type <= HevcNalUnitType.RSV_IRAP_VCL23; + }); + return isKeyframe ? 'key' : 'delta'; + } + case 'vp8': + { + // VP8, once again, by far the easiest to deal with. + const frameType = packetData[0] & 1; + return frameType === 0 ? 'key' : 'delta'; + } + case 'vp9': + { + const bitstream = new (0, _miscJs.Bitstream)(packetData); + if (bitstream.readBits(2) !== 2) return null; + const profileLowBit = bitstream.readBits(1); + const profileHighBit = bitstream.readBits(1); + const profile = (profileHighBit << 1) + profileLowBit; + // Skip reserved bit for profile 3 + if (profile === 3) bitstream.skipBits(1); + const showExistingFrame = bitstream.readBits(1); + if (showExistingFrame) return null; + const frameType = bitstream.readBits(1); + return frameType === 0 ? 'key' : 'delta'; + } + case 'av1': + { + let reducedStillPictureHeader = false; + for (const { type, data } of iterateAv1PacketObus(packetData)){ + if (type === 1) { + const bitstream = new (0, _miscJs.Bitstream)(data); + bitstream.skipBits(4); + reducedStillPictureHeader = !!bitstream.readBits(1); + } else if (type === 3 // OBU_FRAME_HEADER + || type === 6 // OBU_FRAME + || type === 7 // OBU_REDUNDANT_FRAME_HEADER + ) { + if (reducedStillPictureHeader) return 'key'; + const bitstream = new (0, _miscJs.Bitstream)(data); + const showExistingFrame = bitstream.readBits(1); + if (showExistingFrame) return null; + const frameType = bitstream.readBits(2); + return frameType === 0 ? 'key' : 'delta'; + } + } + return null; + } + default: + (0, _miscJs.assertNever)(codec); + (0, _miscJs.assert)(false); + } +}; +var FlacBlockType; +(function(FlacBlockType) { + FlacBlockType[FlacBlockType["STREAMINFO"] = 0] = "STREAMINFO"; + FlacBlockType[FlacBlockType["VORBIS_COMMENT"] = 4] = "VORBIS_COMMENT"; + FlacBlockType[FlacBlockType["PICTURE"] = 6] = "PICTURE"; +})(FlacBlockType || (FlacBlockType = {})); +const readVorbisComments = (bytes, metadataTags)=>{ + // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2 + const commentView = (0, _miscJs.toDataView)(bytes); + let commentPos = 0; + const vendorStringLength = commentView.getUint32(commentPos, true); + commentPos += 4; + const vendorString = (0, _miscJs.textDecoder).decode(bytes.subarray(commentPos, commentPos + vendorStringLength)); + commentPos += vendorStringLength; + if (vendorStringLength > 0) { + // Expose the vendor string in the raw metadata + metadataTags.raw ??= {}; + metadataTags.raw['vendor'] ??= vendorString; + } + const listLength = commentView.getUint32(commentPos, true); + commentPos += 4; + // Loop over all metadata tags + for(let i = 0; i < listLength; i++){ + const stringLength = commentView.getUint32(commentPos, true); + commentPos += 4; + const string = (0, _miscJs.textDecoder).decode(bytes.subarray(commentPos, commentPos + stringLength)); + commentPos += stringLength; + const separatorIndex = string.indexOf('='); + if (separatorIndex === -1) continue; + const key = string.slice(0, separatorIndex).toUpperCase(); + const value = string.slice(separatorIndex + 1); + metadataTags.raw ??= {}; + metadataTags.raw[key] ??= value; + switch(key){ + case 'TITLE': + metadataTags.title ??= value; + break; + case 'DESCRIPTION': + metadataTags.description ??= value; + break; + case 'ARTIST': + metadataTags.artist ??= value; + break; + case 'ALBUM': + metadataTags.album ??= value; + break; + case 'ALBUMARTIST': + metadataTags.albumArtist ??= value; + break; + case 'COMMENT': + metadataTags.comment ??= value; + break; + case 'LYRICS': + metadataTags.lyrics ??= value; + break; + case 'TRACKNUMBER': + { + const parts = value.split('/'); + const trackNum = Number.parseInt(parts[0], 10); + const tracksTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(trackNum) && trackNum > 0) metadataTags.trackNumber ??= trackNum; + if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'TRACKTOTAL': + { + const tracksTotal = Number.parseInt(value, 10); + if (Number.isInteger(tracksTotal) && tracksTotal > 0) metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'DISCNUMBER': + { + const parts = value.split('/'); + const discNum = Number.parseInt(parts[0], 10); + const discsTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(discNum) && discNum > 0) metadataTags.discNumber ??= discNum; + if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) metadataTags.discsTotal ??= discsTotal; + } + break; + case 'DISCTOTAL': + { + const discsTotal = Number.parseInt(value, 10); + if (Number.isInteger(discsTotal) && discsTotal > 0) metadataTags.discsTotal ??= discsTotal; + } + break; + case 'DATE': + { + const date = new Date(value); + if (!Number.isNaN(date.getTime())) metadataTags.date ??= date; + } + break; + case 'GENRE': + metadataTags.genre ??= value; + break; + case 'METADATA_BLOCK_PICTURE': + { + // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8 + const decoded = (0, _miscJs.base64ToBytes)(value); + const view = (0, _miscJs.toDataView)(decoded); + const pictureType = view.getUint32(0, false); + const mediaTypeLength = view.getUint32(4, false); + const mediaType = String.fromCharCode(...decoded.subarray(8, 8 + mediaTypeLength)); // ASCII + const descriptionLength = view.getUint32(8 + mediaTypeLength, false); + const description = (0, _miscJs.textDecoder).decode(decoded.subarray(12 + mediaTypeLength, 12 + mediaTypeLength + descriptionLength)); + const dataLength = view.getUint32(mediaTypeLength + descriptionLength + 28); + const data = decoded.subarray(mediaTypeLength + descriptionLength + 32, mediaTypeLength + descriptionLength + 32 + dataLength); + metadataTags.images ??= []; + metadataTags.images.push({ + data, + mimeType: mediaType, + kind: pictureType === 3 ? 'coverFront' : pictureType === 4 ? 'coverBack' : 'unknown', + name: undefined, + description: description || undefined + }); + } + break; + } + } +}; +const createVorbisComments = (headerBytes, tags, writeImages)=>{ + // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2 + const commentHeaderParts = [ + headerBytes + ]; + const vendorString = 'Mediabunny'; + const encodedVendorString = (0, _miscJs.textEncoder).encode(vendorString); + let currentBuffer = new Uint8Array(4 + encodedVendorString.length); + let currentView = new DataView(currentBuffer.buffer); + currentView.setUint32(0, encodedVendorString.length, true); + currentBuffer.set(encodedVendorString, 4); + commentHeaderParts.push(currentBuffer); + const writtenTags = new Set(); + const addCommentTag = (key, value)=>{ + const joined = `${key}=${value}`; + const encoded = (0, _miscJs.textEncoder).encode(joined); + currentBuffer = new Uint8Array(4 + encoded.length); + currentView = new DataView(currentBuffer.buffer); + currentView.setUint32(0, encoded.length, true); + currentBuffer.set(encoded, 4); + commentHeaderParts.push(currentBuffer); + writtenTags.add(key); + }; + for (const { key, value } of (0, _miscJs.keyValueIterator)(tags))switch(key){ + case 'title': + addCommentTag('TITLE', value); + break; + case 'description': + addCommentTag('DESCRIPTION', value); + break; + case 'artist': + addCommentTag('ARTIST', value); + break; + case 'album': + addCommentTag('ALBUM', value); + break; + case 'albumArtist': + addCommentTag('ALBUMARTIST', value); + break; + case 'genre': + addCommentTag('GENRE', value); + break; + case 'date': + { + const rawVersion = tags.raw?.['DATE'] ?? tags.raw?.['date']; + if (rawVersion && typeof rawVersion === 'string') addCommentTag('DATE', rawVersion); + else addCommentTag('DATE', value.toISOString().slice(0, 10)); + } + break; + case 'comment': + addCommentTag('COMMENT', value); + break; + case 'lyrics': + addCommentTag('LYRICS', value); + break; + case 'trackNumber': + addCommentTag('TRACKNUMBER', value.toString()); + break; + case 'tracksTotal': + addCommentTag('TRACKTOTAL', value.toString()); + break; + case 'discNumber': + addCommentTag('DISCNUMBER', value.toString()); + break; + case 'discsTotal': + addCommentTag('DISCTOTAL', value.toString()); + break; + case 'images': + // For example, in .flac, we put the pictures in a different section, + // not in the Vorbis comment header. + if (!writeImages) break; + for (const image of value){ + // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8 + const pictureType = image.kind === 'coverFront' ? 3 : image.kind === 'coverBack' ? 4 : 0; + const encodedMediaType = new Uint8Array(image.mimeType.length); + for(let i = 0; i < image.mimeType.length; i++)encodedMediaType[i] = image.mimeType.charCodeAt(i); + const encodedDescription = (0, _miscJs.textEncoder).encode(image.description ?? ''); + const buffer = new Uint8Array(8 // MIME type length + + encodedMediaType.length // MIME type + + 4 // Description length + + encodedDescription.length // Description + + 16 // Width, height, color depth, number of colors + + 4 // Picture data length + + image.data.length); + const view = (0, _miscJs.toDataView)(buffer); + view.setUint32(0, pictureType, false); + view.setUint32(4, encodedMediaType.length, false); + buffer.set(encodedMediaType, 8); + view.setUint32(8 + encodedMediaType.length, encodedDescription.length, false); + buffer.set(encodedDescription, 12 + encodedMediaType.length); + // Skip a bunch of fields (width, height, color depth, number of colors) + view.setUint32(28 + encodedMediaType.length + encodedDescription.length, image.data.length, false); + buffer.set(image.data, 32 + encodedMediaType.length + encodedDescription.length); + const encoded = (0, _miscJs.bytesToBase64)(buffer); + addCommentTag('METADATA_BLOCK_PICTURE', encoded); + } + break; + case 'raw': + break; + default: + (0, _miscJs.assertNever)(key); + } + if (tags.raw) for(const key in tags.raw){ + const value = tags.raw[key] ?? tags.raw[key.toLowerCase()]; + if (key === 'vendor' || value == null || writtenTags.has(key)) continue; + if (typeof value === 'string') addCommentTag(key, value); + } + const listLengthBuffer = new Uint8Array(4); + (0, _miscJs.toDataView)(listLengthBuffer).setUint32(0, writtenTags.size, true); + commentHeaderParts.splice(2, 0, listLengthBuffer); // Insert after the header and vendor section + // Merge all comment header parts into a single buffer + const commentHeaderLength = commentHeaderParts.reduce((a, b)=>a + b.length, 0); + const commentHeader = new Uint8Array(commentHeaderLength); + let pos = 0; + for (const part of commentHeaderParts){ + commentHeader.set(part, pos); + pos += part.length; + } + return commentHeader; +}; + +},{"./codec.js":"4oSIO","./misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"dZcnn":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Demuxer", ()=>Demuxer); +class Demuxer { + constructor(input){ + this.input = input; + } +} + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"dPVVR":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * Represents a media track in an input file. + * @group Input files & tracks + * @public + */ parcelHelpers.export(exports, "InputTrack", ()=>InputTrack); +/** + * Represents a video track in an input file. + * @group Input files & tracks + * @public + */ parcelHelpers.export(exports, "InputVideoTrack", ()=>InputVideoTrack); +/** + * Represents an audio track in an input file. + * @group Input files & tracks + * @public + */ parcelHelpers.export(exports, "InputAudioTrack", ()=>InputAudioTrack); +var _codecDataJs = require("./codec-data.js"); +var _customCoderJs = require("./custom-coder.js"); +var _mediaSinkJs = require("./media-sink.js"); +var _miscJs = require("./misc.js"); +var _packetJs = require("./packet.js"); +class InputTrack { + /** @internal */ constructor(input, backing){ + this.input = input; + this._backing = backing; + } + /** Returns true if and only if this track is a video track. */ isVideoTrack() { + return this instanceof InputVideoTrack; + } + /** Returns true if and only if this track is an audio track. */ isAudioTrack() { + return this instanceof InputAudioTrack; + } + /** The unique ID of this track in the input file. */ get id() { + return this._backing.getId(); + } + /** + * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny + * and depends entirely on the container format. + * + * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec. + * + * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`). + * - For Matroska files, this field returns the value of the `CodecID` element. + * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk. + * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`. + * - In all other cases, this field is `null`. + */ get internalCodecId() { + return this._backing.getInternalCodecId(); + } + /** + * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined). + */ get languageCode() { + return this._backing.getLanguageCode(); + } + /** A user-defined name for this track. */ get name() { + return this._backing.getName(); + } + /** + * A positive number x such that all timestamps and durations of all packets of this track are + * integer multiples of 1/x. + */ get timeResolution() { + return this._backing.getTimeResolution(); + } + /** The track's disposition, i.e. information about its intended usage. */ get disposition() { + return this._backing.getDisposition(); + } + /** + * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value + * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples + * with a negative timestamp should not be presented. + */ getFirstTimestamp() { + return this._backing.getFirstTimestamp(); + } + /** Returns the end timestamp of the last packet of this track, in seconds. */ computeDuration() { + return this._backing.computeDuration(); + } + /** + * Computes aggregate packet statistics for this track, such as average packet rate or bitrate. + * + * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have + * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all + * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the + * entire file. + */ async computePacketStats(targetPacketCount = Infinity) { + const sink = new (0, _mediaSinkJs.EncodedPacketSink)(this); + let startTimestamp = Infinity; + let endTimestamp = -Infinity; + let packetCount = 0; + let totalPacketBytes = 0; + for await (const packet of sink.packets(undefined, undefined, { + metadataOnly: true + })){ + if (packetCount >= targetPacketCount && packet.timestamp >= endTimestamp) break; + startTimestamp = Math.min(startTimestamp, packet.timestamp); + endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration); + packetCount++; + totalPacketBytes += packet.byteLength; + } + return { + packetCount, + averagePacketRate: packetCount ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16)) : 0, + averageBitrate: packetCount ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16)) : 0 + }; + } +} +class InputVideoTrack extends InputTrack { + /** @internal */ constructor(input, backing){ + super(input, backing); + this._backing = backing; + } + get type() { + return 'video'; + } + get codec() { + return this._backing.getCodec(); + } + /** The width in pixels of the track's coded samples, before any transformations or rotations. */ get codedWidth() { + return this._backing.getCodedWidth(); + } + /** The height in pixels of the track's coded samples, before any transformations or rotations. */ get codedHeight() { + return this._backing.getCodedHeight(); + } + /** The angle in degrees by which the track's frames should be rotated (clockwise). */ get rotation() { + return this._backing.getRotation(); + } + /** The width in pixels of the track's frames after rotation. */ get displayWidth() { + const rotation = this._backing.getRotation(); + return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight(); + } + /** The height in pixels of the track's frames after rotation. */ get displayHeight() { + const rotation = this._backing.getRotation(); + return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth(); + } + /** Returns the color space of the track's samples. */ getColorSpace() { + return this._backing.getColorSpace(); + } + /** If this method returns true, the track's samples use a high dynamic range (HDR). */ async hasHighDynamicRange() { + const colorSpace = await this._backing.getColorSpace(); + return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432' || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg' || colorSpace.matrix === 'bt2020-ncl'; + } + /** Checks if this track may contain transparent samples with alpha data. */ canBeTransparent() { + return this._backing.canBeTransparent(); + } + /** + * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the + * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns + * null if the track's codec is unknown. + */ getDecoderConfig() { + return this._backing.getDecoderConfig(); + } + async getCodecParameterString() { + const decoderConfig = await this._backing.getDecoderConfig(); + return decoderConfig?.codec ?? null; + } + async canDecode() { + try { + const decoderConfig = await this._backing.getDecoderConfig(); + if (!decoderConfig) return false; + const codec = this._backing.getCodec(); + (0, _miscJs.assert)(codec !== null); + if ((0, _customCoderJs.customVideoDecoders).some((x)=>x.supports(codec, decoderConfig))) return true; + if (typeof VideoDecoder === 'undefined') return false; + const support = await VideoDecoder.isConfigSupported(decoderConfig); + return support.supported === true; + } catch (error) { + console.error('Error during decodability check:', error); + return false; + } + } + async determinePacketType(packet) { + if (!(packet instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('packet must be an EncodedPacket.'); + if (packet.isMetadataOnly) throw new TypeError('packet must not be metadata-only to determine its type.'); + if (this.codec === null) return null; + const decoderConfig = await this.getDecoderConfig(); + (0, _miscJs.assert)(decoderConfig); + return (0, _codecDataJs.determineVideoPacketType)(this.codec, decoderConfig, packet.data); + } +} +class InputAudioTrack extends InputTrack { + /** @internal */ constructor(input, backing){ + super(input, backing); + this._backing = backing; + } + get type() { + return 'audio'; + } + get codec() { + return this._backing.getCodec(); + } + /** The number of audio channels in the track. */ get numberOfChannels() { + return this._backing.getNumberOfChannels(); + } + /** The track's audio sample rate in hertz. */ get sampleRate() { + return this._backing.getSampleRate(); + } + /** + * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the + * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns + * null if the track's codec is unknown. + */ getDecoderConfig() { + return this._backing.getDecoderConfig(); + } + async getCodecParameterString() { + const decoderConfig = await this._backing.getDecoderConfig(); + return decoderConfig?.codec ?? null; + } + async canDecode() { + try { + const decoderConfig = await this._backing.getDecoderConfig(); + if (!decoderConfig) return false; + const codec = this._backing.getCodec(); + (0, _miscJs.assert)(codec !== null); + if ((0, _customCoderJs.customAudioDecoders).some((x)=>x.supports(codec, decoderConfig))) return true; + if (decoderConfig.codec.startsWith('pcm-')) return true; // Since we decode it ourselves + else { + if (typeof AudioDecoder === 'undefined') return false; + const support = await AudioDecoder.isConfigSupported(decoderConfig); + return support.supported === true; + } + } catch (error) { + console.error('Error during decodability check:', error); + return false; + } + } + async determinePacketType(packet) { + if (!(packet instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('packet must be an EncodedPacket.'); + if (this.codec === null) return null; + return 'key'; // No audio codec with delta packets + } +} + +},{"./codec-data.js":"bzpVB","./custom-coder.js":"95k1I","./media-sink.js":"6Ym7M","./misc.js":"kkhLS","./packet.js":"esYjd","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"95k1I":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ /** + * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the + * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. + * @group Custom coders + * @public + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "CustomVideoDecoder", ()=>CustomVideoDecoder); +/** + * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the + * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. + * @group Custom coders + * @public + */ parcelHelpers.export(exports, "CustomAudioDecoder", ()=>CustomAudioDecoder); +/** + * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the + * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. + * @group Custom coders + * @public + */ parcelHelpers.export(exports, "CustomVideoEncoder", ()=>CustomVideoEncoder); +/** + * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the + * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. + * @group Custom coders + * @public + */ parcelHelpers.export(exports, "CustomAudioEncoder", ()=>CustomAudioEncoder); +parcelHelpers.export(exports, "customVideoDecoders", ()=>customVideoDecoders); +parcelHelpers.export(exports, "customAudioDecoders", ()=>customAudioDecoders); +parcelHelpers.export(exports, "customVideoEncoders", ()=>customVideoEncoders); +parcelHelpers.export(exports, "customAudioEncoders", ()=>customAudioEncoders); +parcelHelpers.export(exports, "registerDecoder", ()=>registerDecoder); +parcelHelpers.export(exports, "registerEncoder", ()=>registerEncoder); +class CustomVideoDecoder { + /** Returns true if and only if the decoder can decode the given codec configuration. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars + static supports(codec, config) { + return false; + } +} +class CustomAudioDecoder { + /** Returns true if and only if the decoder can decode the given codec configuration. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars + static supports(codec, config) { + return false; + } +} +class CustomVideoEncoder { + /** Returns true if and only if the encoder can encode the given codec configuration. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars + static supports(codec, config) { + return false; + } +} +class CustomAudioEncoder { + /** Returns true if and only if the encoder can encode the given codec configuration. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars + static supports(codec, config) { + return false; + } +} +const customVideoDecoders = []; +const customAudioDecoders = []; +const customVideoEncoders = []; +const customAudioEncoders = []; +const registerDecoder = (decoder)=>{ + if (decoder.prototype instanceof CustomVideoDecoder) { + const casted = decoder; + if (customVideoDecoders.includes(casted)) { + console.warn('Video decoder already registered.'); + return; + } + customVideoDecoders.push(casted); + } else if (decoder.prototype instanceof CustomAudioDecoder) { + const casted = decoder; + if (customAudioDecoders.includes(casted)) { + console.warn('Audio decoder already registered.'); + return; + } + customAudioDecoders.push(casted); + } else throw new TypeError('Decoder must be a CustomVideoDecoder or CustomAudioDecoder.'); +}; +const registerEncoder = (encoder)=>{ + if (encoder.prototype instanceof CustomVideoEncoder) { + const casted = encoder; + if (customVideoEncoders.includes(casted)) { + console.warn('Video encoder already registered.'); + return; + } + customVideoEncoders.push(casted); + } else if (encoder.prototype instanceof CustomAudioEncoder) { + const casted = encoder; + if (customAudioEncoders.includes(casted)) { + console.warn('Audio encoder already registered.'); + return; + } + customAudioEncoders.push(casted); + } else throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.'); +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"6Ym7M":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * Sink for retrieving encoded packets from an input track. + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "EncodedPacketSink", ()=>EncodedPacketSink); +/** + * Base class for decoded media sample sinks. + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "BaseMediaSampleSink", ()=>BaseMediaSampleSink); +/** + * A sink that retrieves decoded video samples (video frames) from a video track. + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "VideoSampleSink", ()=>VideoSampleSink); +/** + * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than + * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation + * metadata. + * + * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise. + * + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "CanvasSink", ()=>CanvasSink); +/** + * Sink for retrieving decoded audio samples from an audio track. + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "AudioSampleSink", ()=>AudioSampleSink); +/** + * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is + * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the + * Web Audio API. + * @group Media sinks + * @public + */ parcelHelpers.export(exports, "AudioBufferSink", ()=>AudioBufferSink); +var _codecJs = require("./codec.js"); +var _codecDataJs = require("./codec-data.js"); +var _customCoderJs = require("./custom-coder.js"); +var _inputJs = require("./input.js"); +var _inputTrackJs = require("./input-track.js"); +var _miscJs = require("./misc.js"); +var _packetJs = require("./packet.js"); +var _pcmJs = require("./pcm.js"); +var _sampleJs = require("./sample.js"); +const validatePacketRetrievalOptions = (options)=>{ + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') throw new TypeError('options.metadataOnly, when defined, must be a boolean.'); + if (options.verifyKeyPackets !== undefined && typeof options.verifyKeyPackets !== 'boolean') throw new TypeError('options.verifyKeyPackets, when defined, must be a boolean.'); + if (options.verifyKeyPackets && options.metadataOnly) throw new TypeError('options.verifyKeyPackets and options.metadataOnly cannot be enabled together.'); +}; +const validateTimestamp = (timestamp)=>{ + if (!(0, _miscJs.isNumber)(timestamp)) throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine +}; +const maybeFixPacketType = (track, promise, options)=>{ + if (options.verifyKeyPackets) return promise.then(async (packet)=>{ + if (!packet || packet.type === 'delta') return packet; + const determinedType = await track.determinePacketType(packet); + if (determinedType) // @ts-expect-error Technically readonly + packet.type = determinedType; + return packet; + }); + else return promise; +}; +class EncodedPacketSink { + /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */ constructor(track){ + if (!(track instanceof (0, _inputTrackJs.InputTrack))) throw new TypeError('track must be an InputTrack.'); + this._track = track; + } + /** + * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very + * likely to be a key packet. + */ getFirstPacket(options = {}) { + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + return maybeFixPacketType(this._track, this._track._backing.getFirstPacket(options), options); + } + /** + * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet + * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be + * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp + * is before the first packet in the track. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ getPacket(timestamp, options = {}) { + validateTimestamp(timestamp); + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + return maybeFixPacketType(this._track, this._track._backing.getPacket(timestamp, options), options); + } + /** + * Retrieves the packet following the given packet (in decode order), or null if the given packet is the + * last packet. + */ getNextPacket(packet, options = {}) { + if (!(packet instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('packet must be an EncodedPacket.'); + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + return maybeFixPacketType(this._track, this._track._backing.getNextPacket(packet, options), options); + } + /** + * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last + * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet + * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's + * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first + * key packet in the track. + * + * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ async getKeyPacket(timestamp, options = {}) { + validateTimestamp(timestamp); + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + if (!options.verifyKeyPackets) return this._track._backing.getKeyPacket(timestamp, options); + const packet = await this._track._backing.getKeyPacket(timestamp, options); + if (!packet) return packet; + (0, _miscJs.assert)(packet.type === 'key'); + const determinedType = await this._track.determinePacketType(packet); + if (determinedType === 'delta') // Try returning the previous key packet (in hopes that it's actually a key packet) + return this.getKeyPacket(packet.timestamp - 1 / this._track.timeResolution, options); + return packet; + } + /** + * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last + * key packet. + * + * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. + */ async getNextKeyPacket(packet, options = {}) { + if (!(packet instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('packet must be an EncodedPacket.'); + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + if (!options.verifyKeyPackets) return this._track._backing.getNextKeyPacket(packet, options); + const nextPacket = await this._track._backing.getNextKeyPacket(packet, options); + if (!nextPacket) return nextPacket; + (0, _miscJs.assert)(nextPacket.type === 'key'); + const determinedType = await this._track.determinePacketType(nextPacket); + if (determinedType === 'delta') // Try returning the next key packet (in hopes that it's actually a key packet) + return this.getNextKeyPacket(nextPacket, options); + return nextPacket; + } + /** + * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this + * method will intelligently preload packets based on the speed of the consumer. + * + * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded. + * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded. + */ packets(startPacket, endPacket, options = {}) { + if (startPacket !== undefined && !(startPacket instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('startPacket must be an EncodedPacket.'); + if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.'); + if (endPacket !== undefined && !(endPacket instanceof (0, _packetJs.EncodedPacket))) throw new TypeError('endPacket must be an EncodedPacket.'); + validatePacketRetrievalOptions(options); + if (this._track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + const packetQueue = []; + let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)(); + let { promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)(); + let ended = false; + let terminated = false; + // This stores errors that are "out of band" in the sense that they didn't occur in the normal flow of this + // method but instead in a different context. This error should not go unnoticed and must be bubbled up to + // the consumer. + let outOfBandError = null; + const timestamps = []; + // The queue should always be big enough to hold 1 second worth of packets + const maxQueueSize = ()=>Math.max(2, timestamps.length); + // The following is the "pump" process that keeps pumping packets into the queue + (async ()=>{ + let packet = startPacket ?? await this.getFirstPacket(options); + while(packet && !terminated && !this._track.input._disposed){ + if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) break; + if (packetQueue.length > maxQueueSize()) { + ({ promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)()); + await queueDequeue; + continue; + } + packetQueue.push(packet); + onQueueNotEmpty(); + ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)()); + packet = await this.getNextPacket(packet, options); + } + ended = true; + onQueueNotEmpty(); + })().catch((error)=>{ + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); + const track = this._track; + return { + async next () { + while(true){ + if (track.input._disposed) throw new (0, _inputJs.InputDisposedError)(); + else if (terminated) return { + value: undefined, + done: true + }; + else if (outOfBandError) throw outOfBandError; + else if (packetQueue.length > 0) { + const value = packetQueue.shift(); + const now = performance.now(); + timestamps.push(now); + while(timestamps.length > 0 && now - timestamps[0] >= 1000)timestamps.shift(); + onQueueDequeue(); + return { + value, + done: false + }; + } else if (ended) return { + value: undefined, + done: true + }; + else await queueNotEmpty; + } + }, + async return () { + terminated = true; + onQueueDequeue(); + onQueueNotEmpty(); + return { + value: undefined, + done: true + }; + }, + async throw (error) { + throw error; + }, + [Symbol.asyncIterator] () { + return this; + } + }; + } +} +class DecoderWrapper { + constructor(onSample, onError){ + this.onSample = onSample; + this.onError = onError; + } +} +class BaseMediaSampleSink { + /** @internal */ mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) { + validateTimestamp(startTimestamp); + validateTimestamp(endTimestamp); + const sampleQueue = []; + let firstSampleQueued = false; + let lastSample = null; + let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)(); + let { promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)(); + let decoderIsFlushed = false; + let ended = false; + let terminated = false; + // This stores errors that are "out of band" in the sense that they didn't occur in the normal flow of this + // method but instead in a different context. This error should not go unnoticed and must be bubbled up to + // the consumer. + let outOfBandError = null; + // The following is the "pump" process that keeps pumping packets into the decoder + (async ()=>{ + const decoderError = new Error(); + const decoder = await this._createDecoder((sample)=>{ + onQueueDequeue(); + if (sample.timestamp >= endTimestamp) ended = true; + if (ended) { + sample.close(); + return; + } + if (lastSample) { + if (sample.timestamp > startTimestamp) { + // We don't know ahead of time what the first first is. This is because the first first is the + // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to + // wait for the first first after the start timestamp, and then we'll know that the previous + // first was the first first. + sampleQueue.push(lastSample); + firstSampleQueued = true; + } else lastSample.close(); + } + if (sample.timestamp >= startTimestamp) { + sampleQueue.push(sample); + firstSampleQueued = true; + } + lastSample = firstSampleQueued ? null : sample; + if (sampleQueue.length > 0) { + onQueueNotEmpty(); + ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)()); + } + }, (error)=>{ + if (!outOfBandError) { + error.stack = decoderError.stack; // Provide a more useful stack trace + outOfBandError = error; + onQueueNotEmpty(); + } + }); + const packetSink = this._createPacketSink(); + const keyPacket = await packetSink.getKeyPacket(startTimestamp, { + verifyKeyPackets: true + }) ?? await packetSink.getFirstPacket(); + let currentPacket = keyPacket; + let endPacket = undefined; + if (endTimestamp < Infinity) { + // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order + // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds + // this end time. However, we can still put a bound on it: Since key frames are by definition never + // out of order, we can stop at the first key frame after the end timestamp. + const packet = await packetSink.getPacket(endTimestamp); + const keyPacket = !packet ? null : packet.type === 'key' && packet.timestamp === endTimestamp ? packet : await packetSink.getNextKeyPacket(packet, { + verifyKeyPackets: true + }); + if (keyPacket) endPacket = keyPacket; + } + const packets = packetSink.packets(keyPacket ?? undefined, endPacket); + await packets.next(); // Skip the start packet as we already have it + while(currentPacket && !ended && !this._track.input._disposed){ + const maxQueueSize = computeMaxQueueSize(sampleQueue.length); + if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) { + ({ promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)()); + await queueDequeue; + continue; + } + decoder.decode(currentPacket); + const packetResult = await packets.next(); + if (packetResult.done) break; + currentPacket = packetResult.value; + } + await packets.return(); + if (!terminated && !this._track.input._disposed) await decoder.flush(); + decoder.close(); + if (!firstSampleQueued && lastSample) sampleQueue.push(lastSample); + decoderIsFlushed = true; + onQueueNotEmpty(); // To unstuck the generator + })().catch((error)=>{ + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); + const track = this._track; + const closeSamples = ()=>{ + lastSample?.close(); + for (const sample of sampleQueue)sample.close(); + }; + return { + async next () { + while(true){ + if (track.input._disposed) { + closeSamples(); + throw new (0, _inputJs.InputDisposedError)(); + } else if (terminated) return { + value: undefined, + done: true + }; + else if (outOfBandError) { + closeSamples(); + throw outOfBandError; + } else if (sampleQueue.length > 0) { + const value = sampleQueue.shift(); + onQueueDequeue(); + return { + value, + done: false + }; + } else if (!decoderIsFlushed) await queueNotEmpty; + else return { + value: undefined, + done: true + }; + } + }, + async return () { + terminated = true; + ended = true; + onQueueDequeue(); + onQueueNotEmpty(); + closeSamples(); + return { + value: undefined, + done: true + }; + }, + async throw (error) { + throw error; + }, + [Symbol.asyncIterator] () { + return this; + } + }; + } + /** @internal */ mediaSamplesAtTimestamps(timestamps) { + (0, _miscJs.validateAnyIterable)(timestamps); + const timestampIterator = (0, _miscJs.toAsyncIterator)(timestamps); + const timestampsOfInterest = []; + const sampleQueue = []; + let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)(); + let { promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)(); + let decoderIsFlushed = false; + let terminated = false; + // This stores errors that are "out of band" in the sense that they didn't occur in the normal flow of this + // method but instead in a different context. This error should not go unnoticed and must be bubbled up to + // the consumer. + let outOfBandError = null; + const pushToQueue = (sample)=>{ + sampleQueue.push(sample); + onQueueNotEmpty(); + ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = (0, _miscJs.promiseWithResolvers)()); + }; + // The following is the "pump" process that keeps pumping packets into the decoder + (async ()=>{ + const decoderError = new Error(); + const decoder = await this._createDecoder((sample)=>{ + onQueueDequeue(); + if (terminated) { + sample.close(); + return; + } + let sampleUses = 0; + while(timestampsOfInterest.length > 0 && sample.timestamp - timestampsOfInterest[0] > -0.0000000001 // Give it a little epsilon + ){ + sampleUses++; + timestampsOfInterest.shift(); + } + if (sampleUses > 0) for(let i = 0; i < sampleUses; i++)// Clone the sample if we need to emit it multiple times + pushToQueue(i < sampleUses - 1 ? sample.clone() : sample); + else sample.close(); + }, (error)=>{ + if (!outOfBandError) { + error.stack = decoderError.stack; // Provide a more useful stack trace + outOfBandError = error; + onQueueNotEmpty(); + } + }); + const packetSink = this._createPacketSink(); + let lastPacket = null; + let lastKeyPacket = null; + // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts + // at the last key frame and goes until this sequence number. + let maxSequenceNumber = -1; + const decodePackets = async ()=>{ + (0, _miscJs.assert)(lastKeyPacket); + // Start at the current key packet + let currentPacket = lastKeyPacket; + decoder.decode(currentPacket); + while(currentPacket.sequenceNumber < maxSequenceNumber){ + const maxQueueSize = computeMaxQueueSize(sampleQueue.length); + while(sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated){ + ({ promise: queueDequeue, resolve: onQueueDequeue } = (0, _miscJs.promiseWithResolvers)()); + await queueDequeue; + } + if (terminated) break; + const nextPacket = await packetSink.getNextPacket(currentPacket); + (0, _miscJs.assert)(nextPacket); + decoder.decode(nextPacket); + currentPacket = nextPacket; + } + maxSequenceNumber = -1; + }; + const flushDecoder = async ()=>{ + await decoder.flush(); + // We don't expect this list to have any elements in it anymore, but in case it does, let's emit + // nulls for every remaining element, then clear it. + for(let i = 0; i < timestampsOfInterest.length; i++)pushToQueue(null); + timestampsOfInterest.length = 0; + }; + for await (const timestamp of timestampIterator){ + validateTimestamp(timestamp); + if (terminated || this._track.input._disposed) break; + const targetPacket = await packetSink.getPacket(timestamp); + const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp, { + verifyKeyPackets: true + }); + if (!keyPacket) { + if (maxSequenceNumber !== -1) { + await decodePackets(); + await flushDecoder(); + } + pushToQueue(null); + lastPacket = null; + continue; + } + // Check if the key packet has changed or if we're going back in time + if (lastPacket && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber || targetPacket.timestamp < lastPacket.timestamp)) { + await decodePackets(); + await flushDecoder(); // Always flush here, improves decoder compatibility + } + timestampsOfInterest.push(targetPacket.timestamp); + maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber); + lastPacket = targetPacket; + lastKeyPacket = keyPacket; + } + if (!terminated && !this._track.input._disposed) { + if (maxSequenceNumber !== -1) // We still need to decode packets + await decodePackets(); + await flushDecoder(); + } + decoder.close(); + decoderIsFlushed = true; + onQueueNotEmpty(); // To unstuck the generator + })().catch((error)=>{ + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); + const track = this._track; + const closeSamples = ()=>{ + for (const sample of sampleQueue)sample?.close(); + }; + return { + async next () { + while(true){ + if (track.input._disposed) { + closeSamples(); + throw new (0, _inputJs.InputDisposedError)(); + } else if (terminated) return { + value: undefined, + done: true + }; + else if (outOfBandError) { + closeSamples(); + throw outOfBandError; + } else if (sampleQueue.length > 0) { + const value = sampleQueue.shift(); + (0, _miscJs.assert)(value !== undefined); + onQueueDequeue(); + return { + value, + done: false + }; + } else if (!decoderIsFlushed) await queueNotEmpty; + else return { + value: undefined, + done: true + }; + } + }, + async return () { + terminated = true; + onQueueDequeue(); + onQueueNotEmpty(); + closeSamples(); + return { + value: undefined, + done: true + }; + }, + async throw (error) { + throw error; + }, + [Symbol.asyncIterator] () { + return this; + } + }; + } +} +const computeMaxQueueSize = (decodedSampleQueueSize)=>{ + // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up + // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact, + // some decoders only start flushing out decoded chunks when the packet queue is large enough. + return decodedSampleQueueSize === 0 ? 40 : 8; +}; +class VideoDecoderWrapper extends DecoderWrapper { + constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution){ + super(onSample, onError); + this.codec = codec; + this.decoderConfig = decoderConfig; + this.rotation = rotation; + this.timeResolution = timeResolution; + this.decoder = null; + this.customDecoder = null; + this.customDecoderCallSerializer = new (0, _miscJs.CallSerializer)(); + this.customDecoderQueueSize = 0; + this.inputTimestamps = []; // Timestamps input into the decoder, sorted. + this.sampleQueue = []; // Safari-specific thing, check usage. + this.currentPacketIndex = 0; + this.raslSkipped = false; // For HEVC stuff + // Alpha stuff + this.alphaDecoder = null; + this.alphaHadKeyframe = false; + this.colorQueue = []; + this.alphaQueue = []; + this.merger = null; + this.mergerCreationFailed = false; + this.decodedAlphaChunkCount = 0; + this.alphaDecoderQueueSize = 0; + /** Each value is the number of decoded alpha chunks at which a null alpha frame should be added. */ this.nullAlphaFrameQueue = []; + this.currentAlphaPacketIndex = 0; + this.alphaRaslSkipped = false; // For HEVC stuff + const MatchingCustomDecoder = (0, _customCoderJs.customVideoDecoders).find((x)=>x.supports(codec, decoderConfig)); + if (MatchingCustomDecoder) { + // @ts-expect-error "Can't create instance of abstract class 🤓" + this.customDecoder = new MatchingCustomDecoder(); + // @ts-expect-error It's technically readonly + this.customDecoder.codec = codec; + // @ts-expect-error It's technically readonly + this.customDecoder.config = decoderConfig; + // @ts-expect-error It's technically readonly + this.customDecoder.onSample = (sample)=>{ + if (!(sample instanceof (0, _sampleJs.VideoSample))) throw new TypeError('The argument passed to onSample must be a VideoSample.'); + this.finalizeAndEmitSample(sample); + }; + this.customDecoderCallSerializer.call(()=>this.customDecoder.init()); + } else { + const colorHandler = (frame)=>{ + if (this.alphaQueue.length > 0) { + // Even when no alpha data is present (most of the time), there will be nulls in this queue + const alphaFrame = this.alphaQueue.shift(); + (0, _miscJs.assert)(alphaFrame !== undefined); + this.mergeAlpha(frame, alphaFrame); + } else this.colorQueue.push(frame); + }; + if (codec === 'avc' && this.decoderConfig.description && (0, _miscJs.isChromium)()) { + // Chromium has/had a bug with playing interlaced AVC (https://issues.chromium.org/issues/456919096) + // which can be worked around by requesting that software decoding be used. So, here we peek into the + // AVC description, if present, and switch to software decoding if we find interlaced content. + const record = (0, _codecDataJs.deserializeAvcDecoderConfigurationRecord)((0, _miscJs.toUint8Array)(this.decoderConfig.description)); + if (record && record.sequenceParameterSets.length > 0) { + const sps = (0, _codecDataJs.parseAvcSps)(record.sequenceParameterSets[0]); + if (sps && sps.frameMbsOnlyFlag === 0) this.decoderConfig = { + ...this.decoderConfig, + hardwareAcceleration: 'prefer-software' + }; + } + } + this.decoder = new VideoDecoder({ + output: (frame)=>{ + try { + colorHandler(frame); + } catch (error) { + this.onError(error); + } + }, + error: onError + }); + this.decoder.configure(this.decoderConfig); + } + } + getDecodeQueueSize() { + if (this.customDecoder) return this.customDecoderQueueSize; + else { + (0, _miscJs.assert)(this.decoder); + return Math.max(this.decoder.decodeQueueSize, this.alphaDecoder?.decodeQueueSize ?? 0); + } + } + decode(packet) { + if (this.codec === 'hevc' && this.currentPacketIndex > 0 && !this.raslSkipped) { + if (this.hasHevcRaslPicture(packet.data)) return; // Drop + this.raslSkipped = true; + } + this.currentPacketIndex++; + if (this.customDecoder) { + this.customDecoderQueueSize++; + this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(packet)).then(()=>this.customDecoderQueueSize--); + } else { + (0, _miscJs.assert)(this.decoder); + if (!(0, _miscJs.isWebKit)()) (0, _miscJs.insertSorted)(this.inputTimestamps, packet.timestamp, (x)=>x); + this.decoder.decode(packet.toEncodedVideoChunk()); + this.decodeAlphaData(packet); + } + } + decodeAlphaData(packet) { + if (!packet.sideData.alpha || this.mergerCreationFailed) { + // No alpha side data in the packet, most common case + this.pushNullAlphaFrame(); + return; + } + if (!this.merger) try { + this.merger = new ColorAlphaMerger(); + } catch (error) { + console.error('Due to an error, only color data will be decoded.', error); + this.mergerCreationFailed = true; + this.decodeAlphaData(packet); // Go again + return; + } + // Check if we need to set up the alpha decoder + if (!this.alphaDecoder) { + const alphaHandler = (frame)=>{ + this.alphaDecoderQueueSize--; + if (this.colorQueue.length > 0) { + const colorFrame = this.colorQueue.shift(); + (0, _miscJs.assert)(colorFrame !== undefined); + this.mergeAlpha(colorFrame, frame); + } else this.alphaQueue.push(frame); + // Check if any null frames have been queued for this point + this.decodedAlphaChunkCount++; + while(this.nullAlphaFrameQueue.length > 0 && this.nullAlphaFrameQueue[0] === this.decodedAlphaChunkCount){ + this.nullAlphaFrameQueue.shift(); + if (this.colorQueue.length > 0) { + const colorFrame = this.colorQueue.shift(); + (0, _miscJs.assert)(colorFrame !== undefined); + this.mergeAlpha(colorFrame, null); + } else this.alphaQueue.push(null); + } + }; + this.alphaDecoder = new VideoDecoder({ + output: (frame)=>{ + try { + alphaHandler(frame); + } catch (error) { + this.onError(error); + } + }, + error: this.onError + }); + this.alphaDecoder.configure(this.decoderConfig); + } + const type = (0, _codecDataJs.determineVideoPacketType)(this.codec, this.decoderConfig, packet.sideData.alpha); + // Alpha packets might follow a different key frame rhythm than the main packets. Therefore, before we start + // decoding, we must first find a packet that's actually a key frame. Until then, we treat the image as opaque. + if (!this.alphaHadKeyframe) this.alphaHadKeyframe = type === 'key'; + if (this.alphaHadKeyframe) { + // Same RASL skipping logic as for color, unlikely to be hit (since who uses HEVC with separate alpha??) but + // here for symmetry. + if (this.codec === 'hevc' && this.currentAlphaPacketIndex > 0 && !this.alphaRaslSkipped) { + if (this.hasHevcRaslPicture(packet.sideData.alpha)) { + this.pushNullAlphaFrame(); + return; + } + this.alphaRaslSkipped = true; + } + this.currentAlphaPacketIndex++; + this.alphaDecoder.decode(packet.alphaToEncodedVideoChunk(type ?? packet.type)); + this.alphaDecoderQueueSize++; + } else this.pushNullAlphaFrame(); + } + pushNullAlphaFrame() { + if (this.alphaDecoderQueueSize === 0) // Easy + this.alphaQueue.push(null); + else // There are still alpha chunks being decoded, so pushing `null` immediately would result in out-of-order + // data and be incorrect. Instead, we need to enqueue a "null frame" for when the current decoder workload + // has finished. + this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount + this.alphaDecoderQueueSize); + } + /** + * If we're using HEVC, we need to make sure to skip any RASL slices that follow a non-IDR key frame such as + * CRA_NUT. This is because RASL slices cannot be decoded without data before the CRA_NUT. Browsers behave + * differently here: Chromium drops the packets, Safari throws a decoder error. Either way, it's not good + * and causes bugs upstream. So, let's take the dropping into our own hands. + */ hasHevcRaslPicture(packetData) { + const nalUnits = (0, _codecDataJs.extractHevcNalUnits)(packetData, this.decoderConfig); + return nalUnits.some((x)=>{ + const type = (0, _codecDataJs.extractNalUnitTypeForHevc)(x); + return type === (0, _codecDataJs.HevcNalUnitType).RASL_N || type === (0, _codecDataJs.HevcNalUnitType).RASL_R; + }); + } + /** Handler for the WebCodecs VideoDecoder for ironing out browser differences. */ sampleHandler(sample) { + if ((0, _miscJs.isWebKit)()) { + // For correct B-frame handling, we don't just hand over the frames directly but instead add them to + // a queue, because we want to ensure frames are emitted in presentation order. We flush the queue + // each time we receive a frame with a timestamp larger than the highest we've seen so far, as we + // can sure that is not a B-frame. Typically, WebCodecs automatically guarantees that frames are + // emitted in presentation order, but Safari doesn't always follow this rule. + if (this.sampleQueue.length > 0 && sample.timestamp >= (0, _miscJs.last)(this.sampleQueue).timestamp) { + for (const sample of this.sampleQueue)this.finalizeAndEmitSample(sample); + this.sampleQueue.length = 0; + } + (0, _miscJs.insertSorted)(this.sampleQueue, sample, (x)=>x.timestamp); + } else { + // Assign it the next earliest timestamp from the input. We do this because browsers, by spec, are + // required to emit decoded frames in presentation order *while* retaining the timestamp of their + // originating EncodedVideoChunk. For files with B-frames but no out-of-order timestamps (like a + // missing ctts box, for example), this causes a mismatch. We therefore fix the timestamps and + // ensure they are sorted by doing this. + const timestamp = this.inputTimestamps.shift(); + // There's no way we'd have more decoded frames than encoded packets we passed in. Actually, the + // correspondence should be 1:1. + (0, _miscJs.assert)(timestamp !== undefined); + sample.setTimestamp(timestamp); + this.finalizeAndEmitSample(sample); + } + } + finalizeAndEmitSample(sample) { + // Round the timestamps to the time resolution + sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution); + sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution); + sample.setRotation(this.rotation); + this.onSample(sample); + } + mergeAlpha(color, alpha) { + if (!alpha) { + // Nothing needs to be merged + const finalSample = new (0, _sampleJs.VideoSample)(color); + this.sampleHandler(finalSample); + return; + } + (0, _miscJs.assert)(this.merger); + this.merger.update(color, alpha); + color.close(); + alpha.close(); + const finalFrame = new VideoFrame(this.merger.canvas, { + timestamp: color.timestamp, + duration: color.duration ?? undefined + }); + const finalSample = new (0, _sampleJs.VideoSample)(finalFrame); + this.sampleHandler(finalSample); + } + async flush() { + if (this.customDecoder) await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()); + else { + (0, _miscJs.assert)(this.decoder); + await Promise.all([ + this.decoder.flush(), + this.alphaDecoder?.flush() + ]); + this.colorQueue.forEach((x)=>x.close()); + this.colorQueue.length = 0; + this.alphaQueue.forEach((x)=>x?.close()); + this.alphaQueue.length = 0; + this.alphaHadKeyframe = false; + this.decodedAlphaChunkCount = 0; + this.alphaDecoderQueueSize = 0; + this.nullAlphaFrameQueue.length = 0; + this.currentAlphaPacketIndex = 0; + this.alphaRaslSkipped = false; + } + if ((0, _miscJs.isWebKit)()) { + for (const sample of this.sampleQueue)this.finalizeAndEmitSample(sample); + this.sampleQueue.length = 0; + } + this.currentPacketIndex = 0; + this.raslSkipped = false; + } + close() { + if (this.customDecoder) this.customDecoderCallSerializer.call(()=>this.customDecoder.close()); + else { + (0, _miscJs.assert)(this.decoder); + this.decoder.close(); + this.alphaDecoder?.close(); + this.colorQueue.forEach((x)=>x.close()); + this.colorQueue.length = 0; + this.alphaQueue.forEach((x)=>x?.close()); + this.alphaQueue.length = 0; + this.merger?.close(); + } + for (const sample of this.sampleQueue)sample.close(); + this.sampleQueue.length = 0; + } +} +/** Utility class that merges together color and alpha information using simple WebGL 2 shaders. */ class ColorAlphaMerger { + constructor(){ + // Canvas will be resized later + if (typeof OffscreenCanvas !== 'undefined') // Prefer OffscreenCanvas for Worker environments + this.canvas = new OffscreenCanvas(300, 150); + else this.canvas = document.createElement('canvas'); + const gl = this.canvas.getContext('webgl2', { + premultipliedAlpha: false + }); // Casting because of some TypeScript weirdness + if (!gl) throw new Error('Couldn\'t acquire WebGL 2 context.'); + this.gl = gl; + this.program = this.createProgram(); + this.vao = this.createVAO(); + this.colorTexture = this.createTexture(); + this.alphaTexture = this.createTexture(); + this.gl.useProgram(this.program); + this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_colorTexture'), 0); + this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_alphaTexture'), 1); + } + createProgram() { + const vertexShader = this.createShader(this.gl.VERTEX_SHADER, `#version 300 es + in vec2 a_position; + in vec2 a_texCoord; + out vec2 v_texCoord; + + void main() { + gl_Position = vec4(a_position, 0.0, 1.0); + v_texCoord = a_texCoord; + } + `); + const fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, `#version 300 es + precision highp float; + + uniform sampler2D u_colorTexture; + uniform sampler2D u_alphaTexture; + in vec2 v_texCoord; + out vec4 fragColor; + + void main() { + vec3 color = texture(u_colorTexture, v_texCoord).rgb; + float alpha = texture(u_alphaTexture, v_texCoord).r; + fragColor = vec4(color, alpha); + } + `); + const program = this.gl.createProgram(); + this.gl.attachShader(program, vertexShader); + this.gl.attachShader(program, fragmentShader); + this.gl.linkProgram(program); + return program; + } + createShader(type, source) { + const shader = this.gl.createShader(type); + this.gl.shaderSource(shader, source); + this.gl.compileShader(shader); + return shader; + } + createVAO() { + const vao = this.gl.createVertexArray(); + this.gl.bindVertexArray(vao); + const vertices = new Float32Array([ + -1, + -1, + 0, + 1, + 1, + -1, + 1, + 1, + -1, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ]); + const buffer = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer); + this.gl.bufferData(this.gl.ARRAY_BUFFER, vertices, this.gl.STATIC_DRAW); + const positionLocation = this.gl.getAttribLocation(this.program, 'a_position'); + const texCoordLocation = this.gl.getAttribLocation(this.program, 'a_texCoord'); + this.gl.enableVertexAttribArray(positionLocation); + this.gl.vertexAttribPointer(positionLocation, 2, this.gl.FLOAT, false, 16, 0); + this.gl.enableVertexAttribArray(texCoordLocation); + this.gl.vertexAttribPointer(texCoordLocation, 2, this.gl.FLOAT, false, 16, 8); + return vao; + } + createTexture() { + const texture = this.gl.createTexture(); + this.gl.bindTexture(this.gl.TEXTURE_2D, texture); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR); + return texture; + } + update(color, alpha) { + if (color.displayWidth !== this.canvas.width || color.displayHeight !== this.canvas.height) { + this.canvas.width = color.displayWidth; + this.canvas.height = color.displayHeight; + } + this.gl.activeTexture(this.gl.TEXTURE0); + this.gl.bindTexture(this.gl.TEXTURE_2D, this.colorTexture); + this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, color); + this.gl.activeTexture(this.gl.TEXTURE1); + this.gl.bindTexture(this.gl.TEXTURE_2D, this.alphaTexture); + this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, alpha); + this.gl.viewport(0, 0, this.canvas.width, this.canvas.height); + this.gl.clear(this.gl.COLOR_BUFFER_BIT); + this.gl.bindVertexArray(this.vao); + this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4); + } + close() { + this.gl.getExtension('WEBGL_lose_context')?.loseContext(); + this.gl = null; + } +} +class VideoSampleSink extends BaseMediaSampleSink { + /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */ constructor(videoTrack){ + if (!(videoTrack instanceof (0, _inputTrackJs.InputVideoTrack))) throw new TypeError('videoTrack must be an InputVideoTrack.'); + super(); + this._track = videoTrack; + } + /** @internal */ async _createDecoder(onSample, onError) { + if (!await this._track.canDecode()) throw new Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track."); + const codec = this._track.codec; + const rotation = this._track.rotation; + const decoderConfig = await this._track.getDecoderConfig(); + const timeResolution = this._track.timeResolution; + (0, _miscJs.assert)(codec && decoderConfig); + return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution); + } + /** @internal */ _createPacketSink() { + return new EncodedPacketSink(this._track); + } + /** + * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns + * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ async getSample(timestamp) { + validateTimestamp(timestamp); + for await (const sample of this.mediaSamplesAtTimestamps([ + timestamp + ]))return sample; + throw new Error('Internal error: Iterator returned nothing.'); + } + /** + * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method + * will intelligently pre-decode a few frames ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). + */ samples(startTimestamp = 0, endTimestamp = Infinity) { + return this.mediaSamplesInRange(startTimestamp, endTimestamp); + } + /** + * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may + * yield null if no frame is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ samplesAtTimestamps(timestamps) { + return this.mediaSamplesAtTimestamps(timestamps); + } +} +class CanvasSink { + /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */ constructor(videoTrack, options = {}){ + /** @internal */ this._nextCanvasIndex = 0; + if (!(videoTrack instanceof (0, _inputTrackJs.InputVideoTrack))) throw new TypeError('videoTrack must be an InputVideoTrack.'); + if (options && typeof options !== 'object') throw new TypeError('options must be an object.'); + if (options.alpha !== undefined && typeof options.alpha !== 'boolean') throw new TypeError('options.alpha, when provided, must be a boolean.'); + if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) throw new TypeError('options.width, when defined, must be a positive integer.'); + if (options.height !== undefined && (!Number.isInteger(options.height) || options.height <= 0)) throw new TypeError('options.height, when defined, must be a positive integer.'); + if (options.fit !== undefined && ![ + 'fill', + 'contain', + 'cover' + ].includes(options.fit)) throw new TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".'); + if (options.width !== undefined && options.height !== undefined && options.fit === undefined) throw new TypeError('When both options.width and options.height are provided, options.fit must also be provided.'); + if (options.rotation !== undefined && ![ + 0, + 90, + 180, + 270 + ].includes(options.rotation)) throw new TypeError('options.rotation, when provided, must be 0, 90, 180 or 270.'); + if (options.crop !== undefined) (0, _sampleJs.validateCropRectangle)(options.crop, 'options.'); + if (options.poolSize !== undefined && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) throw new TypeError('poolSize must be a non-negative integer.'); + const rotation = options.rotation ?? videoTrack.rotation; + const [rotatedWidth, rotatedHeight] = rotation % 180 === 0 ? [ + videoTrack.codedWidth, + videoTrack.codedHeight + ] : [ + videoTrack.codedHeight, + videoTrack.codedWidth + ]; + const crop = options.crop; + if (crop) (0, _sampleJs.clampCropRectangle)(crop, rotatedWidth, rotatedHeight); + let [width, height] = crop ? [ + crop.width, + crop.height + ] : [ + rotatedWidth, + rotatedHeight + ]; + const originalAspectRatio = width / height; + // If width and height aren't defined together, deduce the missing value using the aspect ratio + if (options.width !== undefined && options.height === undefined) { + width = options.width; + height = Math.round(width / originalAspectRatio); + } else if (options.width === undefined && options.height !== undefined) { + height = options.height; + width = Math.round(height * originalAspectRatio); + } else if (options.width !== undefined && options.height !== undefined) { + width = options.width; + height = options.height; + } + this._videoTrack = videoTrack; + this._alpha = options.alpha ?? false; + this._width = width; + this._height = height; + this._rotation = rotation; + this._crop = crop; + this._fit = options.fit ?? 'fill'; + this._videoSampleSink = new VideoSampleSink(videoTrack); + this._canvasPool = Array.from({ + length: options.poolSize ?? 0 + }, ()=>null); + } + /** @internal */ _videoSampleToWrappedCanvas(sample) { + let canvas = this._canvasPool[this._nextCanvasIndex]; + let canvasIsNew = false; + if (!canvas) { + if (typeof document !== 'undefined') { + // Prefer an HTMLCanvasElement + canvas = document.createElement('canvas'); + canvas.width = this._width; + canvas.height = this._height; + } else canvas = new OffscreenCanvas(this._width, this._height); + if (this._canvasPool.length > 0) this._canvasPool[this._nextCanvasIndex] = canvas; + canvasIsNew = true; + } + if (this._canvasPool.length > 0) this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length; + const context = canvas.getContext('2d', { + alpha: this._alpha || (0, _miscJs.isFirefox)() + }); + (0, _miscJs.assert)(context); + context.resetTransform(); + if (!canvasIsNew) { + if (!this._alpha && (0, _miscJs.isFirefox)()) { + context.fillStyle = 'black'; + context.fillRect(0, 0, this._width, this._height); + } else context.clearRect(0, 0, this._width, this._height); + } + sample.drawWithFit(context, { + fit: this._fit, + rotation: this._rotation, + crop: this._crop + }); + const result = { + canvas, + timestamp: sample.timestamp, + duration: sample.duration + }; + sample.close(); + return result; + } + /** + * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically, + * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given + * timestamp. Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ async getCanvas(timestamp) { + validateTimestamp(timestamp); + const sample = await this._videoSampleSink.getSample(timestamp); + return sample && this._videoSampleToWrappedCanvas(sample); + } + /** + * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This + * method will intelligently pre-decode a few frames ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive). + */ canvases(startTimestamp = 0, endTimestamp = Infinity) { + return (0, _miscJs.mapAsyncGenerator)(this._videoSampleSink.samples(startTimestamp, endTimestamp), (sample)=>this._videoSampleToWrappedCanvas(sample)); + } + /** + * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized + * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is + * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if + * no frame is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ canvasesAtTimestamps(timestamps) { + return (0, _miscJs.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(timestamps), (sample)=>sample && this._videoSampleToWrappedCanvas(sample)); + } +} +class AudioDecoderWrapper extends DecoderWrapper { + constructor(onSample, onError, codec, decoderConfig){ + super(onSample, onError); + this.decoder = null; + this.customDecoder = null; + this.customDecoderCallSerializer = new (0, _miscJs.CallSerializer)(); + this.customDecoderQueueSize = 0; + // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially + // inaccurate) packet timestamps. + this.currentTimestamp = null; + const sampleHandler = (sample)=>{ + if (this.currentTimestamp === null || Math.abs(sample.timestamp - this.currentTimestamp) >= sample.duration) // We need to sync with the sample timestamp again + this.currentTimestamp = sample.timestamp; + const preciseTimestamp = this.currentTimestamp; + this.currentTimestamp += sample.duration; + if (sample.numberOfFrames === 0) { + // We skip zero-data (empty) AudioSamples. These are sometimes emitted, for example, by Firefox when it + // decodes Vorbis (at the start). + sample.close(); + return; + } + // Round the timestamp to the sample rate + const sampleRate = decoderConfig.sampleRate; + sample.setTimestamp(Math.round(preciseTimestamp * sampleRate) / sampleRate); + onSample(sample); + }; + const MatchingCustomDecoder = (0, _customCoderJs.customAudioDecoders).find((x)=>x.supports(codec, decoderConfig)); + if (MatchingCustomDecoder) { + // @ts-expect-error "Can't create instance of abstract class 🤓" + this.customDecoder = new MatchingCustomDecoder(); + // @ts-expect-error It's technically readonly + this.customDecoder.codec = codec; + // @ts-expect-error It's technically readonly + this.customDecoder.config = decoderConfig; + // @ts-expect-error It's technically readonly + this.customDecoder.onSample = (sample)=>{ + if (!(sample instanceof (0, _sampleJs.AudioSample))) throw new TypeError('The argument passed to onSample must be an AudioSample.'); + sampleHandler(sample); + }; + this.customDecoderCallSerializer.call(()=>this.customDecoder.init()); + } else { + this.decoder = new AudioDecoder({ + output: (data)=>{ + try { + sampleHandler(new (0, _sampleJs.AudioSample)(data)); + } catch (error) { + this.onError(error); + } + }, + error: onError + }); + this.decoder.configure(decoderConfig); + } + } + getDecodeQueueSize() { + if (this.customDecoder) return this.customDecoderQueueSize; + else { + (0, _miscJs.assert)(this.decoder); + return this.decoder.decodeQueueSize; + } + } + decode(packet) { + if (this.customDecoder) { + this.customDecoderQueueSize++; + this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(packet)).then(()=>this.customDecoderQueueSize--); + } else { + (0, _miscJs.assert)(this.decoder); + this.decoder.decode(packet.toEncodedAudioChunk()); + } + } + flush() { + if (this.customDecoder) return this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()); + else { + (0, _miscJs.assert)(this.decoder); + return this.decoder.flush(); + } + } + close() { + if (this.customDecoder) this.customDecoderCallSerializer.call(()=>this.customDecoder.close()); + else { + (0, _miscJs.assert)(this.decoder); + this.decoder.close(); + } + } +} +// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple +// decoder that maps any input PCM format into a PCM format supported by the browser. +class PcmAudioDecoderWrapper extends DecoderWrapper { + constructor(onSample, onError, decoderConfig){ + super(onSample, onError); + this.decoderConfig = decoderConfig; + // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially + // inaccurate) packet timestamps. + this.currentTimestamp = null; + (0, _miscJs.assert)((0, _codecJs.PCM_AUDIO_CODECS).includes(decoderConfig.codec)); + this.codec = decoderConfig.codec; + const { dataType, sampleSize, littleEndian } = (0, _codecJs.parsePcmCodec)(this.codec); + this.inputSampleSize = sampleSize; + switch(sampleSize){ + case 1: + if (dataType === 'unsigned') this.readInputValue = (view, byteOffset)=>view.getUint8(byteOffset) - 128; + else if (dataType === 'signed') this.readInputValue = (view, byteOffset)=>view.getInt8(byteOffset); + else if (dataType === 'ulaw') this.readInputValue = (view, byteOffset)=>(0, _pcmJs.fromUlaw)(view.getUint8(byteOffset)); + else if (dataType === 'alaw') this.readInputValue = (view, byteOffset)=>(0, _pcmJs.fromAlaw)(view.getUint8(byteOffset)); + else (0, _miscJs.assert)(false); + break; + case 2: + if (dataType === 'unsigned') this.readInputValue = (view, byteOffset)=>view.getUint16(byteOffset, littleEndian) - 2 ** 15; + else if (dataType === 'signed') this.readInputValue = (view, byteOffset)=>view.getInt16(byteOffset, littleEndian); + else (0, _miscJs.assert)(false); + break; + case 3: + if (dataType === 'unsigned') this.readInputValue = (view, byteOffset)=>(0, _miscJs.getUint24)(view, byteOffset, littleEndian) - 2 ** 23; + else if (dataType === 'signed') this.readInputValue = (view, byteOffset)=>(0, _miscJs.getInt24)(view, byteOffset, littleEndian); + else (0, _miscJs.assert)(false); + break; + case 4: + if (dataType === 'unsigned') this.readInputValue = (view, byteOffset)=>view.getUint32(byteOffset, littleEndian) - 2 ** 31; + else if (dataType === 'signed') this.readInputValue = (view, byteOffset)=>view.getInt32(byteOffset, littleEndian); + else if (dataType === 'float') this.readInputValue = (view, byteOffset)=>view.getFloat32(byteOffset, littleEndian); + else (0, _miscJs.assert)(false); + break; + case 8: + if (dataType === 'float') this.readInputValue = (view, byteOffset)=>view.getFloat64(byteOffset, littleEndian); + else (0, _miscJs.assert)(false); + break; + default: + (0, _miscJs.assertNever)(sampleSize); + (0, _miscJs.assert)(false); + } + switch(sampleSize){ + case 1: + if (dataType === 'ulaw' || dataType === 'alaw') { + this.outputSampleSize = 2; + this.outputFormat = 's16'; + this.writeOutputValue = (view, byteOffset, value)=>view.setInt16(byteOffset, value, true); + } else { + this.outputSampleSize = 1; + this.outputFormat = 'u8'; + this.writeOutputValue = (view, byteOffset, value)=>view.setUint8(byteOffset, value + 128); + } + break; + case 2: + this.outputSampleSize = 2; + this.outputFormat = 's16'; + this.writeOutputValue = (view, byteOffset, value)=>view.setInt16(byteOffset, value, true); + break; + case 3: + this.outputSampleSize = 4; + this.outputFormat = 's32'; + // From https://www.w3.org/TR/webcodecs: + // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are + // stored in s32, each sample MUST be left-shifted by 8 bits. + this.writeOutputValue = (view, byteOffset, value)=>view.setInt32(byteOffset, value << 8, true); + break; + case 4: + this.outputSampleSize = 4; + if (dataType === 'float') { + this.outputFormat = 'f32'; + this.writeOutputValue = (view, byteOffset, value)=>view.setFloat32(byteOffset, value, true); + } else { + this.outputFormat = 's32'; + this.writeOutputValue = (view, byteOffset, value)=>view.setInt32(byteOffset, value, true); + } + break; + case 8: + this.outputSampleSize = 4; + this.outputFormat = 'f32'; + this.writeOutputValue = (view, byteOffset, value)=>view.setFloat32(byteOffset, value, true); + break; + default: + (0, _miscJs.assertNever)(sampleSize); + (0, _miscJs.assert)(false); + } + } + getDecodeQueueSize() { + return 0; + } + decode(packet) { + const inputView = (0, _miscJs.toDataView)(packet.data); + const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize; + const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize; + const outputBuffer = new ArrayBuffer(outputBufferSize); + const outputView = new DataView(outputBuffer); + for(let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++){ + const inputIndex = i * this.inputSampleSize; + const outputIndex = i * this.outputSampleSize; + const value = this.readInputValue(inputView, inputIndex); + this.writeOutputValue(outputView, outputIndex, value); + } + const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate; + if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) // We need to sync with the packet timestamp again + this.currentTimestamp = packet.timestamp; + const preciseTimestamp = this.currentTimestamp; + this.currentTimestamp += preciseDuration; + const audioSample = new (0, _sampleJs.AudioSample)({ + format: this.outputFormat, + data: outputBuffer, + numberOfChannels: this.decoderConfig.numberOfChannels, + sampleRate: this.decoderConfig.sampleRate, + numberOfFrames, + timestamp: preciseTimestamp + }); + this.onSample(audioSample); + } + async flush() { + // Do nothing + } + close() { + // Do nothing + } +} +class AudioSampleSink extends BaseMediaSampleSink { + /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */ constructor(audioTrack){ + if (!(audioTrack instanceof (0, _inputTrackJs.InputAudioTrack))) throw new TypeError('audioTrack must be an InputAudioTrack.'); + super(); + this._track = audioTrack; + } + /** @internal */ async _createDecoder(onSample, onError) { + if (!await this._track.canDecode()) throw new Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track."); + const codec = this._track.codec; + const decoderConfig = await this._track.getDecoderConfig(); + (0, _miscJs.assert)(codec && decoderConfig); + if ((0, _codecJs.PCM_AUDIO_CODECS).includes(decoderConfig.codec)) return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig); + else return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig); + } + /** @internal */ _createPacketSink() { + return new EncodedPacketSink(this._track); + } + /** + * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns + * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ async getSample(timestamp) { + validateTimestamp(timestamp); + for await (const sample of this.mediaSamplesAtTimestamps([ + timestamp + ]))return sample; + throw new Error('Internal error: Iterator returned nothing.'); + } + /** + * Creates an async iterator that yields the audio samples of this track in presentation order. This method + * will intelligently pre-decode a few samples ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). + */ samples(startTimestamp = 0, endTimestamp = Infinity) { + return this.mediaSamplesInRange(startTimestamp, endTimestamp); + } + /** + * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may + * yield null if no sample is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ samplesAtTimestamps(timestamps) { + return this.mediaSamplesAtTimestamps(timestamps); + } +} +class AudioBufferSink { + /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */ constructor(audioTrack){ + if (!(audioTrack instanceof (0, _inputTrackJs.InputAudioTrack))) throw new TypeError('audioTrack must be an InputAudioTrack.'); + this._audioSampleSink = new AudioSampleSink(audioTrack); + } + /** @internal */ _audioSampleToWrappedArrayBuffer(sample) { + const result = { + buffer: sample.toAudioBuffer(), + timestamp: sample.timestamp, + duration: sample.duration + }; + sample.close(); + return result; + } + /** + * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns + * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ async getBuffer(timestamp) { + validateTimestamp(timestamp); + const data = await this._audioSampleSink.getSample(timestamp); + return data && this._audioSampleToWrappedArrayBuffer(data); + } + /** + * Creates an async iterator that yields audio buffers of this track in presentation order. This method + * will intelligently pre-decode a few buffers ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive). + */ buffers(startTimestamp = 0, endTimestamp = Infinity) { + return (0, _miscJs.mapAsyncGenerator)(this._audioSampleSink.samples(startTimestamp, endTimestamp), (data)=>this._audioSampleToWrappedArrayBuffer(data)); + } + /** + * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may + * yield null if no buffer is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ buffersAtTimestamps(timestamps) { + return (0, _miscJs.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(timestamps), (data)=>data && this._audioSampleToWrappedArrayBuffer(data)); + } +} + +},{"./codec.js":"4oSIO","./codec-data.js":"bzpVB","./custom-coder.js":"95k1I","./input.js":"4IqVo","./input-track.js":"dPVVR","./misc.js":"kkhLS","./packet.js":"esYjd","./pcm.js":"heqRW","./sample.js":"dJBvg","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"esYjd":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "PLACEHOLDER_DATA", ()=>PLACEHOLDER_DATA); +/** + * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) and + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk), but can also be used + * standalone. + * @group Packets + * @public + */ parcelHelpers.export(exports, "EncodedPacket", ()=>EncodedPacket); +var _miscJs = require("./misc.js"); +const PLACEHOLDER_DATA = /* #__PURE__ */ new Uint8Array(0); +class EncodedPacket { + /** Creates a new {@link EncodedPacket} from raw bytes and timing information. */ constructor(/** The encoded data of this packet. */ data, /** The type of this packet. */ type, /** + * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps + * should not be presented. + */ timestamp, /** The duration of this packet in seconds. */ duration, /** + * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A + * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet. + * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative + * ordering. Negative sequence numbers mean the sequence number is undefined. + */ sequenceNumber = -1, byteLength, sideData){ + this.data = data; + this.type = type; + this.timestamp = timestamp; + this.duration = duration; + this.sequenceNumber = sequenceNumber; + if (data === PLACEHOLDER_DATA && byteLength === undefined) throw new Error('Internal error: byteLength must be explicitly provided when constructing metadata-only packets.'); + if (byteLength === undefined) byteLength = data.byteLength; + if (!(data instanceof Uint8Array)) throw new TypeError('data must be a Uint8Array.'); + if (type !== 'key' && type !== 'delta') throw new TypeError('type must be either "key" or "delta".'); + if (!Number.isFinite(timestamp)) throw new TypeError('timestamp must be a number.'); + if (!Number.isFinite(duration) || duration < 0) throw new TypeError('duration must be a non-negative number.'); + if (!Number.isFinite(sequenceNumber)) throw new TypeError('sequenceNumber must be a number.'); + if (!Number.isInteger(byteLength) || byteLength < 0) throw new TypeError('byteLength must be a non-negative integer.'); + if (sideData !== undefined && (typeof sideData !== 'object' || !sideData)) throw new TypeError('sideData, when provided, must be an object.'); + if (sideData?.alpha !== undefined && !(sideData.alpha instanceof Uint8Array)) throw new TypeError('sideData.alpha, when provided, must be a Uint8Array.'); + if (sideData?.alphaByteLength !== undefined && (!Number.isInteger(sideData.alphaByteLength) || sideData.alphaByteLength < 0)) throw new TypeError('sideData.alphaByteLength, when provided, must be a non-negative integer.'); + this.byteLength = byteLength; + this.sideData = sideData ?? {}; + if (this.sideData.alpha && this.sideData.alphaByteLength === undefined) this.sideData.alphaByteLength = this.sideData.alpha.byteLength; + } + /** + * If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. They are the + * result of retrieving packets with {@link PacketRetrievalOptions.metadataOnly} set to `true`. + */ get isMetadataOnly() { + return this.data === PLACEHOLDER_DATA; + } + /** The timestamp of this packet in microseconds. */ get microsecondTimestamp() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.timestamp); + } + /** The duration of this packet in microseconds. */ get microsecondDuration() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.duration); + } + /** Converts this packet to an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the + * WebCodecs API. */ toEncodedVideoChunk() { + if (this.isMetadataOnly) throw new TypeError('Metadata-only packets cannot be converted to a video chunk.'); + if (typeof EncodedVideoChunk === 'undefined') throw new Error('Your browser does not support EncodedVideoChunk.'); + return new EncodedVideoChunk({ + data: this.data, + type: this.type, + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration + }); + } + /** + * Converts this packet to an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the + * WebCodecs API, using the alpha side data instead of the color data. Throws if no alpha side data is defined. + */ alphaToEncodedVideoChunk(type = this.type) { + if (!this.sideData.alpha) throw new TypeError('This packet does not contain alpha side data.'); + if (this.isMetadataOnly) throw new TypeError('Metadata-only packets cannot be converted to a video chunk.'); + if (typeof EncodedVideoChunk === 'undefined') throw new Error('Your browser does not support EncodedVideoChunk.'); + return new EncodedVideoChunk({ + data: this.sideData.alpha, + type, + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration + }); + } + /** Converts this packet to an + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk) for use with the + * WebCodecs API. */ toEncodedAudioChunk() { + if (this.isMetadataOnly) throw new TypeError('Metadata-only packets cannot be converted to an audio chunk.'); + if (typeof EncodedAudioChunk === 'undefined') throw new Error('Your browser does not support EncodedAudioChunk.'); + return new EncodedAudioChunk({ + data: this.data, + type: this.type, + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration + }); + } + /** + * Creates an {@link EncodedPacket} from an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) or + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk). This method is useful + * for converting chunks from the WebCodecs API to `EncodedPacket` instances. + */ static fromEncodedChunk(chunk, sideData) { + if (!(chunk instanceof EncodedVideoChunk || chunk instanceof EncodedAudioChunk)) throw new TypeError('chunk must be an EncodedVideoChunk or EncodedAudioChunk.'); + const data = new Uint8Array(chunk.byteLength); + chunk.copyTo(data); + return new EncodedPacket(data, chunk.type, chunk.timestamp / 1e6, (chunk.duration ?? 0) / 1e6, undefined, undefined, sideData); + } + /** Clones this packet while optionally updating timing information. */ clone(options) { + if (options !== undefined && (typeof options !== 'object' || options === null)) throw new TypeError('options, when provided, must be an object.'); + if (options?.timestamp !== undefined && !Number.isFinite(options.timestamp)) throw new TypeError('options.timestamp, when provided, must be a number.'); + if (options?.duration !== undefined && !Number.isFinite(options.duration)) throw new TypeError('options.duration, when provided, must be a number.'); + return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength); + } +} + +},{"./misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"heqRW":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ // https://github.com/dystopiancode/pcm-g711/blob/master/pcm-g711/g711.c +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "toUlaw", ()=>toUlaw); +parcelHelpers.export(exports, "fromUlaw", ()=>fromUlaw); +parcelHelpers.export(exports, "toAlaw", ()=>toAlaw); +parcelHelpers.export(exports, "fromAlaw", ()=>fromAlaw); +const toUlaw = (s16)=>{ + const MULAW_MAX = 0x1FFF; + const MULAW_BIAS = 33; + let number = s16; + let mask = 0x1000; + let sign = 0; + let position = 12; + let lsb = 0; + if (number < 0) { + number = -number; + sign = 0x80; + } + number += MULAW_BIAS; + if (number > MULAW_MAX) number = MULAW_MAX; + while((number & mask) !== mask && position >= 5){ + mask >>= 1; + position--; + } + lsb = number >> position - 4 & 0x0f; + return ~(sign | position - 5 << 4 | lsb) & 0xFF; +}; +const fromUlaw = (u8)=>{ + const MULAW_BIAS = 33; + let sign = 0; + let position = 0; + let number = ~u8; + if (number & 0x80) { + number &= -129; + sign = -1; + } + position = ((number & 0xF0) >> 4) + 5; + const decoded = (1 << position | (number & 0x0F) << position - 4 | 1 << position - 5) - MULAW_BIAS; + return sign === 0 ? decoded : -decoded; +}; +const toAlaw = (s16)=>{ + const ALAW_MAX = 0xFFF; + let mask = 0x800; + let sign = 0; + let position = 11; + let lsb = 0; + let number = s16; + if (number < 0) { + number = -number; + sign = 0x80; + } + if (number > ALAW_MAX) number = ALAW_MAX; + while((number & mask) !== mask && position >= 5){ + mask >>= 1; + position--; + } + lsb = number >> (position === 4 ? 1 : position - 4) & 0x0f; + return (sign | position - 4 << 4 | lsb) ^ 0x55; +}; +const fromAlaw = (u8)=>{ + let sign = 0x00; + let position = 0; + let number = u8 ^ 0x55; + if (number & 0x80) { + number &= -129; + sign = -1; + } + position = ((number & 0xF0) >> 4) + 4; + let decoded = 0; + if (position !== 4) decoded = 1 << position | (number & 0x0F) << position - 4 | 1 << position - 5; + else decoded = number << 1 | 1; + return sign === 0 ? decoded : -decoded; +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"dJBvg":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** + * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's + * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame), but can also be used standalone. + * @group Samples + * @public + */ parcelHelpers.export(exports, "VideoSample", ()=>VideoSample); +parcelHelpers.export(exports, "clampCropRectangle", ()=>clampCropRectangle); +parcelHelpers.export(exports, "validateCropRectangle", ()=>validateCropRectangle); +/** + * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's + * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData), but can also be used standalone. + * @group Samples + * @public + */ parcelHelpers.export(exports, "AudioSample", ()=>AudioSample); +var _miscJs = require("./misc.js"); +(0, _miscJs.polyfillSymbolDispose)(); +// Let's manually handle logging the garbage collection errors that are typically logged by the browser. This way, they +// also kick for audio samples (which is normally not the case), making sure any incorrect code is quickly caught. +let lastVideoGcErrorLog = -Infinity; +let lastAudioGcErrorLog = -Infinity; +let finalizationRegistry = null; +if (typeof FinalizationRegistry !== 'undefined') finalizationRegistry = new FinalizationRegistry((value)=>{ + const now = Date.now(); + if (value.type === 'video') { + if (now - lastVideoGcErrorLog >= 1000) { + // This error is annoying but oh so important + console.error(`A VideoSample was garbage collected without first being closed. For proper resource management,` + ` make sure to call close() on all your VideoSamples as soon as you're done using them.`); + lastVideoGcErrorLog = now; + } + if (typeof VideoFrame !== 'undefined' && value.data instanceof VideoFrame) value.data.close(); // Prevent the browser error since we're logging our own + } else { + if (now - lastAudioGcErrorLog >= 1000) { + console.error(`An AudioSample was garbage collected without first being closed. For proper resource management,` + ` make sure to call close() on all your AudioSamples as soon as you're done using them.`); + lastAudioGcErrorLog = now; + } + if (typeof AudioData !== 'undefined' && value.data instanceof AudioData) value.data.close(); + } +}); +class VideoSample { + /** The width of the frame in pixels after rotation. */ get displayWidth() { + return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight; + } + /** The height of the frame in pixels after rotation. */ get displayHeight() { + return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth; + } + /** The presentation timestamp of the frame in microseconds. */ get microsecondTimestamp() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.timestamp); + } + /** The duration of the frame in microseconds. */ get microsecondDuration() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.duration); + } + /** + * Whether this sample uses a pixel format that can hold transparency data. Note that this doesn't necessarily mean + * that the sample is transparent. + */ get hasAlpha() { + return this.format && this.format.includes('A'); + } + constructor(data, init){ + /** @internal */ this._closed = false; + if (data instanceof ArrayBuffer || typeof SharedArrayBuffer !== 'undefined' && data instanceof SharedArrayBuffer || ArrayBuffer.isView(data)) { + if (!init || typeof init !== 'object') throw new TypeError('init must be an object.'); + if (!('format' in init) || typeof init.format !== 'string') throw new TypeError('init.format must be a string.'); + if (!Number.isInteger(init.codedWidth) || init.codedWidth <= 0) throw new TypeError('init.codedWidth must be a positive integer.'); + if (!Number.isInteger(init.codedHeight) || init.codedHeight <= 0) throw new TypeError('init.codedHeight must be a positive integer.'); + if (init.rotation !== undefined && ![ + 0, + 90, + 180, + 270 + ].includes(init.rotation)) throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.'); + if (!Number.isFinite(init.timestamp)) throw new TypeError('init.timestamp must be a number.'); + if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) throw new TypeError('init.duration, when provided, must be a non-negative number.'); + this._data = (0, _miscJs.toUint8Array)(data).slice(); // Copy it + this.format = init.format; + this.codedWidth = init.codedWidth; + this.codedHeight = init.codedHeight; + this.rotation = init.rotation ?? 0; + this.timestamp = init.timestamp; + this.duration = init.duration ?? 0; + this.colorSpace = new VideoColorSpace(init.colorSpace); + } else if (typeof VideoFrame !== 'undefined' && data instanceof VideoFrame) { + if (init?.rotation !== undefined && ![ + 0, + 90, + 180, + 270 + ].includes(init.rotation)) throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.'); + if (init?.timestamp !== undefined && !Number.isFinite(init?.timestamp)) throw new TypeError('init.timestamp, when provided, must be a number.'); + if (init?.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) throw new TypeError('init.duration, when provided, must be a non-negative number.'); + this._data = data; + this.format = data.format; + // Copying the display dimensions here, assuming no innate VideoFrame rotation + this.codedWidth = data.displayWidth; + this.codedHeight = data.displayHeight; + // The VideoFrame's rotation is ignored here. It's still a new field, and I'm not sure of any application + // where the browser makes use of it. If a case gets found, I'll add it. + this.rotation = init?.rotation ?? 0; + this.timestamp = init?.timestamp ?? data.timestamp / 1e6; + this.duration = init?.duration ?? (data.duration ?? 0) / 1e6; + this.colorSpace = data.colorSpace; + } else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement || typeof SVGImageElement !== 'undefined' && data instanceof SVGImageElement || typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap || typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement || typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement || typeof OffscreenCanvas !== 'undefined' && data instanceof OffscreenCanvas) { + if (!init || typeof init !== 'object') throw new TypeError('init must be an object.'); + if (init.rotation !== undefined && ![ + 0, + 90, + 180, + 270 + ].includes(init.rotation)) throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.'); + if (!Number.isFinite(init.timestamp)) throw new TypeError('init.timestamp must be a number.'); + if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) throw new TypeError('init.duration, when provided, must be a non-negative number.'); + if (typeof VideoFrame !== 'undefined') return new VideoSample(new VideoFrame(data, { + timestamp: Math.trunc(init.timestamp * (0, _miscJs.SECOND_TO_MICROSECOND_FACTOR)), + // Drag 0 to undefined + duration: Math.trunc((init.duration ?? 0) * (0, _miscJs.SECOND_TO_MICROSECOND_FACTOR)) || undefined + }), init); + let width = 0; + let height = 0; + // Determine the dimensions of the thing + if ('naturalWidth' in data) { + width = data.naturalWidth; + height = data.naturalHeight; + } else if ('videoWidth' in data) { + width = data.videoWidth; + height = data.videoHeight; + } else if ('width' in data) { + width = Number(data.width); + height = Number(data.height); + } + if (!width || !height) throw new TypeError('Could not determine dimensions.'); + const canvas = new OffscreenCanvas(width, height); + const context = canvas.getContext('2d', { + alpha: (0, _miscJs.isFirefox)(), + willReadFrequently: true + }); + (0, _miscJs.assert)(context); + // Draw it to a canvas + context.drawImage(data, 0, 0); + this._data = canvas; + this.format = 'RGBX'; + this.codedWidth = width; + this.codedHeight = height; + this.rotation = init.rotation ?? 0; + this.timestamp = init.timestamp; + this.duration = init.duration ?? 0; + this.colorSpace = new VideoColorSpace({ + matrix: 'rgb', + primaries: 'bt709', + transfer: 'iec61966-2-1', + fullRange: true + }); + } else throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.'); + finalizationRegistry?.register(this, { + type: 'video', + data: this._data + }, this); + } + /** Clones this video sample. */ clone() { + if (this._closed) throw new Error('VideoSample is closed.'); + (0, _miscJs.assert)(this._data !== null); + if (isVideoFrame(this._data)) return new VideoSample(this._data.clone(), { + timestamp: this.timestamp, + duration: this.duration, + rotation: this.rotation + }); + else if (this._data instanceof Uint8Array) return new VideoSample(this._data.slice(), { + format: this.format, + codedWidth: this.codedWidth, + codedHeight: this.codedHeight, + timestamp: this.timestamp, + duration: this.duration, + colorSpace: this.colorSpace, + rotation: this.rotation + }); + else return new VideoSample(this._data, { + format: this.format, + codedWidth: this.codedWidth, + codedHeight: this.codedHeight, + timestamp: this.timestamp, + duration: this.duration, + colorSpace: this.colorSpace, + rotation: this.rotation + }); + } + /** + * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not + * needed anymore. + */ close() { + if (this._closed) return; + finalizationRegistry?.unregister(this); + if (isVideoFrame(this._data)) this._data.close(); + else this._data = null; // GC that shit + this._closed = true; + } + /** Returns the number of bytes required to hold this video sample's pixel data. */ allocationSize() { + if (this._closed) throw new Error('VideoSample is closed.'); + (0, _miscJs.assert)(this._data !== null); + if (isVideoFrame(this._data)) return this._data.allocationSize(); + else if (this._data instanceof Uint8Array) return this._data.byteLength; + else return this.codedWidth * this.codedHeight * 4; // RGBX + } + /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */ async copyTo(destination) { + if (!(0, _miscJs.isAllowSharedBufferSource)(destination)) throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.'); + if (this._closed) throw new Error('VideoSample is closed.'); + (0, _miscJs.assert)(this._data !== null); + if (isVideoFrame(this._data)) await this._data.copyTo(destination); + else if (this._data instanceof Uint8Array) { + const dest = (0, _miscJs.toUint8Array)(destination); + dest.set(this._data); + } else { + const canvas = this._data; + const context = canvas.getContext('2d'); + (0, _miscJs.assert)(context); + const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight); + const dest = (0, _miscJs.toUint8Array)(destination); + dest.set(imageData.data); + } + } + /** + * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this + * method *must* be closed separately from this video sample. + */ toVideoFrame() { + if (this._closed) throw new Error('VideoSample is closed.'); + (0, _miscJs.assert)(this._data !== null); + if (isVideoFrame(this._data)) return new VideoFrame(this._data, { + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration || undefined + }); + else if (this._data instanceof Uint8Array) return new VideoFrame(this._data, { + format: this.format, + codedWidth: this.codedWidth, + codedHeight: this.codedHeight, + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration || undefined, + colorSpace: this.colorSpace + }); + else return new VideoFrame(this._data, { + timestamp: this.microsecondTimestamp, + duration: this.microsecondDuration || undefined + }); + } + draw(context, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) { + let sx = 0; + let sy = 0; + let sWidth = this.displayWidth; + let sHeight = this.displayHeight; + let dx = 0; + let dy = 0; + let dWidth = this.displayWidth; + let dHeight = this.displayHeight; + if (arg5 !== undefined) { + sx = arg1; + sy = arg2; + sWidth = arg3; + sHeight = arg4; + dx = arg5; + dy = arg6; + if (arg7 !== undefined) { + dWidth = arg7; + dHeight = arg8; + } else { + dWidth = sWidth; + dHeight = sHeight; + } + } else { + dx = arg1; + dy = arg2; + if (arg3 !== undefined) { + dWidth = arg3; + dHeight = arg4; + } + } + if (!(typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D || typeof OffscreenCanvasRenderingContext2D !== 'undefined' && context instanceof OffscreenCanvasRenderingContext2D)) throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.'); + if (!Number.isFinite(sx)) throw new TypeError('sx must be a number.'); + if (!Number.isFinite(sy)) throw new TypeError('sy must be a number.'); + if (!Number.isFinite(sWidth) || sWidth < 0) throw new TypeError('sWidth must be a non-negative number.'); + if (!Number.isFinite(sHeight) || sHeight < 0) throw new TypeError('sHeight must be a non-negative number.'); + if (!Number.isFinite(dx)) throw new TypeError('dx must be a number.'); + if (!Number.isFinite(dy)) throw new TypeError('dy must be a number.'); + if (!Number.isFinite(dWidth) || dWidth < 0) throw new TypeError('dWidth must be a non-negative number.'); + if (!Number.isFinite(dHeight) || dHeight < 0) throw new TypeError('dHeight must be a non-negative number.'); + if (this._closed) throw new Error('VideoSample is closed.'); + ({ sx, sy, sWidth, sHeight } = this._rotateSourceRegion(sx, sy, sWidth, sHeight, this.rotation)); + const source = this.toCanvasImageSource(); + context.save(); + const centerX = dx + dWidth / 2; + const centerY = dy + dHeight / 2; + context.translate(centerX, centerY); + context.rotate(this.rotation * Math.PI / 180); + const aspectRatioChange = this.rotation % 180 === 0 ? 1 : dWidth / dHeight; + // Scale to compensate for aspect ratio changes when rotated + context.scale(1 / aspectRatioChange, aspectRatioChange); + context.drawImage(source, sx, sy, sWidth, sHeight, -dWidth / 2, -dHeight / 2, dWidth, dHeight); + context.restore(); + } + /** + * Draws the sample in the middle of the canvas corresponding to the context with the specified fit behavior. + */ drawWithFit(context, options) { + if (!(typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D || typeof OffscreenCanvasRenderingContext2D !== 'undefined' && context instanceof OffscreenCanvasRenderingContext2D)) throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (![ + 'fill', + 'contain', + 'cover' + ].includes(options.fit)) throw new TypeError('options.fit must be \'fill\', \'contain\', or \'cover\'.'); + if (options.rotation !== undefined && ![ + 0, + 90, + 180, + 270 + ].includes(options.rotation)) throw new TypeError('options.rotation, when provided, must be 0, 90, 180, or 270.'); + if (options.crop !== undefined) validateCropRectangle(options.crop, 'options.'); + const canvasWidth = context.canvas.width; + const canvasHeight = context.canvas.height; + const rotation = options.rotation ?? this.rotation; + const [rotatedWidth, rotatedHeight] = rotation % 180 === 0 ? [ + this.codedWidth, + this.codedHeight + ] : [ + this.codedHeight, + this.codedWidth + ]; + if (options.crop) clampCropRectangle(options.crop, rotatedWidth, rotatedHeight); + // These variables specify where the final sample will be drawn on the canvas + let dx; + let dy; + let newWidth; + let newHeight; + const { sx, sy, sWidth, sHeight } = this._rotateSourceRegion(options.crop?.left ?? 0, options.crop?.top ?? 0, options.crop?.width ?? rotatedWidth, options.crop?.height ?? rotatedHeight, rotation); + if (options.fit === 'fill') { + dx = 0; + dy = 0; + newWidth = canvasWidth; + newHeight = canvasHeight; + } else { + const [sampleWidth, sampleHeight] = options.crop ? [ + options.crop.width, + options.crop.height + ] : [ + rotatedWidth, + rotatedHeight + ]; + const scale = options.fit === 'contain' ? Math.min(canvasWidth / sampleWidth, canvasHeight / sampleHeight) : Math.max(canvasWidth / sampleWidth, canvasHeight / sampleHeight); + newWidth = sampleWidth * scale; + newHeight = sampleHeight * scale; + dx = (canvasWidth - newWidth) / 2; + dy = (canvasHeight - newHeight) / 2; + } + context.save(); + const aspectRatioChange = rotation % 180 === 0 ? 1 : newWidth / newHeight; + context.translate(canvasWidth / 2, canvasHeight / 2); + context.rotate(rotation * Math.PI / 180); + // This aspect ratio compensation is done so that we can draw the sample with the intended dimensions and + // don't need to think about how those dimensions change after the rotation + context.scale(1 / aspectRatioChange, aspectRatioChange); + context.translate(-canvasWidth / 2, -canvasHeight / 2); + // Important that we don't use .draw() here since that would take rotation into account, but we wanna handle it + // ourselves here + context.drawImage(this.toCanvasImageSource(), sx, sy, sWidth, sHeight, dx, dy, newWidth, newHeight); + context.restore(); + } + /** @internal */ _rotateSourceRegion(sx, sy, sWidth, sHeight, rotation) { + // The provided sx,sy,sWidth,sHeight refer to the final rotated image, but that's not actually how the image is + // stored. Therefore, we must map these back onto the original, pre-rotation image. + if (rotation === 90) [sx, sy, sWidth, sHeight] = [ + sy, + this.codedHeight - sx - sWidth, + sHeight, + sWidth + ]; + else if (rotation === 180) [sx, sy] = [ + this.codedWidth - sx - sWidth, + this.codedHeight - sy - sHeight + ]; + else if (rotation === 270) [sx, sy, sWidth, sHeight] = [ + this.codedWidth - sy - sHeight, + sx, + sHeight, + sWidth + ]; + return { + sx, + sy, + sWidth, + sHeight + }; + } + /** + * Converts this video sample to a + * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource) for drawing to a canvas. + * + * You must use the value returned by this method immediately, as any VideoFrame created internally will + * automatically be closed in the next microtask. + */ toCanvasImageSource() { + if (this._closed) throw new Error('VideoSample is closed.'); + (0, _miscJs.assert)(this._data !== null); + if (this._data instanceof Uint8Array) { + // Requires VideoFrame to be defined + const videoFrame = this.toVideoFrame(); + queueMicrotask(()=>videoFrame.close()); // Let's automatically close the frame in the next microtask + return videoFrame; + } else return this._data; + } + /** Sets the rotation metadata of this video sample. */ setRotation(newRotation) { + if (![ + 0, + 90, + 180, + 270 + ].includes(newRotation)) throw new TypeError('newRotation must be 0, 90, 180, or 270.'); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.rotation = newRotation; + } + /** Sets the presentation timestamp of this video sample, in seconds. */ setTimestamp(newTimestamp) { + if (!Number.isFinite(newTimestamp)) throw new TypeError('newTimestamp must be a number.'); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.timestamp = newTimestamp; + } + /** Sets the duration of this video sample, in seconds. */ setDuration(newDuration) { + if (!Number.isFinite(newDuration) || newDuration < 0) throw new TypeError('newDuration must be a non-negative number.'); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.duration = newDuration; + } + /** Calls `.close()`. */ [Symbol.dispose]() { + this.close(); + } +} +const isVideoFrame = (x)=>{ + return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame; +}; +const clampCropRectangle = (crop, outerWidth, outerHeight)=>{ + crop.left = Math.min(crop.left, outerWidth); + crop.top = Math.min(crop.top, outerHeight); + crop.width = Math.min(crop.width, outerWidth - crop.left); + crop.height = Math.min(crop.height, outerHeight - crop.top); + (0, _miscJs.assert)(crop.width >= 0); + (0, _miscJs.assert)(crop.height >= 0); +}; +const validateCropRectangle = (crop, prefix)=>{ + if (!crop || typeof crop !== 'object') throw new TypeError(prefix + 'crop, when provided, must be an object.'); + if (!Number.isInteger(crop.left) || crop.left < 0) throw new TypeError(prefix + 'crop.left must be a non-negative integer.'); + if (!Number.isInteger(crop.top) || crop.top < 0) throw new TypeError(prefix + 'crop.top must be a non-negative integer.'); + if (!Number.isInteger(crop.width) || crop.width < 0) throw new TypeError(prefix + 'crop.width must be a non-negative integer.'); + if (!Number.isInteger(crop.height) || crop.height < 0) throw new TypeError(prefix + 'crop.height must be a non-negative integer.'); +}; +const AUDIO_SAMPLE_FORMATS = new Set([ + 'f32', + 'f32-planar', + 's16', + 's16-planar', + 's32', + 's32-planar', + 'u8', + 'u8-planar' +]); +class AudioSample { + /** The presentation timestamp of the sample in microseconds. */ get microsecondTimestamp() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.timestamp); + } + /** The duration of the sample in microseconds. */ get microsecondDuration() { + return Math.trunc((0, _miscJs.SECOND_TO_MICROSECOND_FACTOR) * this.duration); + } + /** + * Creates a new {@link AudioSample}, either from an existing + * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in + * {@link AudioSampleInit}. + */ constructor(init){ + /** @internal */ this._closed = false; + if (isAudioData(init)) { + if (init.format === null) throw new TypeError('AudioData with null format is not supported.'); + this._data = init; + this.format = init.format; + this.sampleRate = init.sampleRate; + this.numberOfFrames = init.numberOfFrames; + this.numberOfChannels = init.numberOfChannels; + this.timestamp = init.timestamp / 1e6; + this.duration = init.numberOfFrames / init.sampleRate; + } else { + if (!init || typeof init !== 'object') throw new TypeError('Invalid AudioDataInit: must be an object.'); + if (!AUDIO_SAMPLE_FORMATS.has(init.format)) throw new TypeError('Invalid AudioDataInit: invalid format.'); + if (!Number.isFinite(init.sampleRate) || init.sampleRate <= 0) throw new TypeError('Invalid AudioDataInit: sampleRate must be > 0.'); + if (!Number.isInteger(init.numberOfChannels) || init.numberOfChannels === 0) throw new TypeError('Invalid AudioDataInit: numberOfChannels must be an integer > 0.'); + if (!Number.isFinite(init?.timestamp)) throw new TypeError('init.timestamp must be a number.'); + const numberOfFrames = init.data.byteLength / (getBytesPerSample(init.format) * init.numberOfChannels); + if (!Number.isInteger(numberOfFrames)) throw new TypeError('Invalid AudioDataInit: data size is not a multiple of frame size.'); + this.format = init.format; + this.sampleRate = init.sampleRate; + this.numberOfFrames = numberOfFrames; + this.numberOfChannels = init.numberOfChannels; + this.timestamp = init.timestamp; + this.duration = numberOfFrames / init.sampleRate; + let dataBuffer; + if (init.data instanceof ArrayBuffer) dataBuffer = new Uint8Array(init.data); + else if (ArrayBuffer.isView(init.data)) dataBuffer = new Uint8Array(init.data.buffer, init.data.byteOffset, init.data.byteLength); + else throw new TypeError('Invalid AudioDataInit: data is not a BufferSource.'); + const expectedSize = this.numberOfFrames * this.numberOfChannels * getBytesPerSample(this.format); + if (dataBuffer.byteLength < expectedSize) throw new TypeError('Invalid AudioDataInit: insufficient data size.'); + this._data = dataBuffer; + } + finalizationRegistry?.register(this, { + type: 'audio', + data: this._data + }, this); + } + /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */ allocationSize(options) { + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) throw new TypeError('planeIndex must be a non-negative integer.'); + if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) throw new TypeError('Invalid format.'); + if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) throw new TypeError('frameOffset must be a non-negative integer.'); + if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) throw new TypeError('frameCount must be a non-negative integer.'); + if (this._closed) throw new Error('AudioSample is closed.'); + const destFormat = options.format ?? this.format; + const frameOffset = options.frameOffset ?? 0; + if (frameOffset >= this.numberOfFrames) throw new RangeError('frameOffset out of range'); + const copyFrameCount = options.frameCount !== undefined ? options.frameCount : this.numberOfFrames - frameOffset; + if (copyFrameCount > this.numberOfFrames - frameOffset) throw new RangeError('frameCount out of range'); + const bytesPerSample = getBytesPerSample(destFormat); + const isPlanar = formatIsPlanar(destFormat); + if (isPlanar && options.planeIndex >= this.numberOfChannels) throw new RangeError('planeIndex out of range'); + if (!isPlanar && options.planeIndex !== 0) throw new RangeError('planeIndex out of range'); + const elementCount = isPlanar ? copyFrameCount : copyFrameCount * this.numberOfChannels; + return elementCount * bytesPerSample; + } + /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */ copyTo(destination, options) { + if (!(0, _miscJs.isAllowSharedBufferSource)(destination)) throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.'); + if (!options || typeof options !== 'object') throw new TypeError('options must be an object.'); + if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) throw new TypeError('planeIndex must be a non-negative integer.'); + if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) throw new TypeError('Invalid format.'); + if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) throw new TypeError('frameOffset must be a non-negative integer.'); + if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) throw new TypeError('frameCount must be a non-negative integer.'); + if (this._closed) throw new Error('AudioSample is closed.'); + const { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options; + const destFormat = format ?? this.format; + if (!destFormat) throw new Error('Destination format not determined'); + const numFrames = this.numberOfFrames; + const numChannels = this.numberOfChannels; + const frameOffset = optFrameOffset ?? 0; + if (frameOffset >= numFrames) throw new RangeError('frameOffset out of range'); + const copyFrameCount = optFrameCount !== undefined ? optFrameCount : numFrames - frameOffset; + if (copyFrameCount > numFrames - frameOffset) throw new RangeError('frameCount out of range'); + const destBytesPerSample = getBytesPerSample(destFormat); + const destIsPlanar = formatIsPlanar(destFormat); + if (destIsPlanar && planeIndex >= numChannels) throw new RangeError('planeIndex out of range'); + if (!destIsPlanar && planeIndex !== 0) throw new RangeError('planeIndex out of range'); + const destElementCount = destIsPlanar ? copyFrameCount : copyFrameCount * numChannels; + const requiredSize = destElementCount * destBytesPerSample; + if (destination.byteLength < requiredSize) throw new RangeError('Destination buffer is too small'); + const destView = (0, _miscJs.toDataView)(destination); + const writeFn = getWriteFunction(destFormat); + if (isAudioData(this._data)) { + if (destIsPlanar) { + if (destFormat === 'f32-planar') // Simple, since the browser must support f32-planar, we can just delegate here + this._data.copyTo(destination, { + planeIndex, + frameOffset, + frameCount: copyFrameCount, + format: 'f32-planar' + }); + else { + // Allocate temporary buffer for f32-planar data + const tempBuffer = new ArrayBuffer(copyFrameCount * 4); + const tempArray = new Float32Array(tempBuffer); + this._data.copyTo(tempArray, { + planeIndex, + frameOffset, + frameCount: copyFrameCount, + format: 'f32-planar' + }); + // Convert each f32 sample to destination format + const tempView = new DataView(tempBuffer); + for(let i = 0; i < copyFrameCount; i++){ + const destOffset = i * destBytesPerSample; + const sample = tempView.getFloat32(i * 4, true); + writeFn(destView, destOffset, sample); + } + } + } else { + // Destination is interleaved. + // Allocate a temporary Float32Array to hold one channel's worth of data. + const numCh = numChannels; + const temp = new Float32Array(copyFrameCount); + for(let ch = 0; ch < numCh; ch++){ + this._data.copyTo(temp, { + planeIndex: ch, + frameOffset, + frameCount: copyFrameCount, + format: 'f32-planar' + }); + for(let i = 0; i < copyFrameCount; i++){ + const destIndex = i * numCh + ch; + const destOffset = destIndex * destBytesPerSample; + writeFn(destView, destOffset, temp[i]); + } + } + } + } else { + const uint8Data = this._data; + const srcView = (0, _miscJs.toDataView)(uint8Data); + const srcFormat = this.format; + const readFn = getReadFunction(srcFormat); + const srcBytesPerSample = getBytesPerSample(srcFormat); + const srcIsPlanar = formatIsPlanar(srcFormat); + for(let i = 0; i < copyFrameCount; i++){ + if (destIsPlanar) { + const destOffset = i * destBytesPerSample; + let srcOffset; + if (srcIsPlanar) srcOffset = (planeIndex * numFrames + (i + frameOffset)) * srcBytesPerSample; + else srcOffset = ((i + frameOffset) * numChannels + planeIndex) * srcBytesPerSample; + const normalized = readFn(srcView, srcOffset); + writeFn(destView, destOffset, normalized); + } else for(let ch = 0; ch < numChannels; ch++){ + const destIndex = i * numChannels + ch; + const destOffset = destIndex * destBytesPerSample; + let srcOffset; + if (srcIsPlanar) srcOffset = (ch * numFrames + (i + frameOffset)) * srcBytesPerSample; + else srcOffset = ((i + frameOffset) * numChannels + ch) * srcBytesPerSample; + const normalized = readFn(srcView, srcOffset); + writeFn(destView, destOffset, normalized); + } + } + } + } + /** Clones this audio sample. */ clone() { + if (this._closed) throw new Error('AudioSample is closed.'); + if (isAudioData(this._data)) { + const sample = new AudioSample(this._data.clone()); + sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy) + return sample; + } else return new AudioSample({ + format: this.format, + sampleRate: this.sampleRate, + numberOfFrames: this.numberOfFrames, + numberOfChannels: this.numberOfChannels, + timestamp: this.timestamp, + data: this._data + }); + } + /** + * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not + * needed anymore. + */ close() { + if (this._closed) return; + finalizationRegistry?.unregister(this); + if (isAudioData(this._data)) this._data.close(); + else this._data = new Uint8Array(0); + this._closed = true; + } + /** + * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this + * method *must* be closed separately from this audio sample. + */ toAudioData() { + if (this._closed) throw new Error('AudioSample is closed.'); + if (isAudioData(this._data)) { + if (this._data.timestamp === this.microsecondTimestamp) // Timestamp matches, let's just return the data (but cloned) + return this._data.clone(); + else // It's impossible to simply change an AudioData's timestamp, so we'll need to create a new one + if (formatIsPlanar(this.format)) { + const size = this.allocationSize({ + planeIndex: 0, + format: this.format + }); + const data = new ArrayBuffer(size * this.numberOfChannels); + // We gotta read out each plane individually + for(let i = 0; i < this.numberOfChannels; i++)this.copyTo(new Uint8Array(data, i * size, size), { + planeIndex: i, + format: this.format + }); + return new AudioData({ + format: this.format, + sampleRate: this.sampleRate, + numberOfFrames: this.numberOfFrames, + numberOfChannels: this.numberOfChannels, + timestamp: this.microsecondTimestamp, + data + }); + } else { + const data = new ArrayBuffer(this.allocationSize({ + planeIndex: 0, + format: this.format + })); + this.copyTo(data, { + planeIndex: 0, + format: this.format + }); + return new AudioData({ + format: this.format, + sampleRate: this.sampleRate, + numberOfFrames: this.numberOfFrames, + numberOfChannels: this.numberOfChannels, + timestamp: this.microsecondTimestamp, + data + }); + } + } else return new AudioData({ + format: this.format, + sampleRate: this.sampleRate, + numberOfFrames: this.numberOfFrames, + numberOfChannels: this.numberOfChannels, + timestamp: this.microsecondTimestamp, + data: this._data.buffer instanceof ArrayBuffer ? this._data.buffer : this._data.slice() + }); + } + /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */ toAudioBuffer() { + if (this._closed) throw new Error('AudioSample is closed.'); + const audioBuffer = new AudioBuffer({ + numberOfChannels: this.numberOfChannels, + length: this.numberOfFrames, + sampleRate: this.sampleRate + }); + const dataBytes = new Float32Array(this.allocationSize({ + planeIndex: 0, + format: 'f32-planar' + }) / 4); + for(let i = 0; i < this.numberOfChannels; i++){ + this.copyTo(dataBytes, { + planeIndex: i, + format: 'f32-planar' + }); + audioBuffer.copyToChannel(dataBytes, i); + } + return audioBuffer; + } + /** Sets the presentation timestamp of this audio sample, in seconds. */ setTimestamp(newTimestamp) { + if (!Number.isFinite(newTimestamp)) throw new TypeError('newTimestamp must be a number.'); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + this.timestamp = newTimestamp; + } + /** Calls `.close()`. */ [Symbol.dispose]() { + this.close(); + } + /** @internal */ static *_fromAudioBuffer(audioBuffer, timestamp) { + if (!(audioBuffer instanceof AudioBuffer)) throw new TypeError('audioBuffer must be an AudioBuffer.'); + const MAX_FLOAT_COUNT = 240000; // 5 seconds of mono 48 kHz audio per sample + const numberOfChannels = audioBuffer.numberOfChannels; + const sampleRate = audioBuffer.sampleRate; + const totalFrames = audioBuffer.length; + const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels); + let currentRelativeFrame = 0; + let remainingFrames = totalFrames; + // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays + while(remainingFrames > 0){ + const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames); + const chunkData = new Float32Array(numberOfChannels * framesToCopy); + for(let channel = 0; channel < numberOfChannels; channel++)audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame); + yield new AudioSample({ + format: 'f32-planar', + sampleRate, + numberOfFrames: framesToCopy, + numberOfChannels, + timestamp: timestamp + currentRelativeFrame / sampleRate, + data: chunkData + }); + currentRelativeFrame += framesToCopy; + remainingFrames -= framesToCopy; + } + } + /** + * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly + * one sample, but may create multiple if the AudioBuffer is exceedingly large. + */ static fromAudioBuffer(audioBuffer, timestamp) { + if (!(audioBuffer instanceof AudioBuffer)) throw new TypeError('audioBuffer must be an AudioBuffer.'); + const MAX_FLOAT_COUNT = 240000; // 5 seconds of mono 48 kHz audio per sample + const numberOfChannels = audioBuffer.numberOfChannels; + const sampleRate = audioBuffer.sampleRate; + const totalFrames = audioBuffer.length; + const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels); + let currentRelativeFrame = 0; + let remainingFrames = totalFrames; + const result = []; + // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays + while(remainingFrames > 0){ + const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames); + const chunkData = new Float32Array(numberOfChannels * framesToCopy); + for(let channel = 0; channel < numberOfChannels; channel++)audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame); + const audioSample = new AudioSample({ + format: 'f32-planar', + sampleRate, + numberOfFrames: framesToCopy, + numberOfChannels, + timestamp: timestamp + currentRelativeFrame / sampleRate, + data: chunkData + }); + result.push(audioSample); + currentRelativeFrame += framesToCopy; + remainingFrames -= framesToCopy; + } + return result; + } +} +const getBytesPerSample = (format)=>{ + switch(format){ + case 'u8': + case 'u8-planar': + return 1; + case 's16': + case 's16-planar': + return 2; + case 's32': + case 's32-planar': + return 4; + case 'f32': + case 'f32-planar': + return 4; + default: + throw new Error('Unknown AudioSampleFormat'); + } +}; +const formatIsPlanar = (format)=>{ + switch(format){ + case 'u8-planar': + case 's16-planar': + case 's32-planar': + case 'f32-planar': + return true; + default: + return false; + } +}; +const getReadFunction = (format)=>{ + switch(format){ + case 'u8': + case 'u8-planar': + return (view, offset)=>(view.getUint8(offset) - 128) / 128; + case 's16': + case 's16-planar': + return (view, offset)=>view.getInt16(offset, true) / 32768; + case 's32': + case 's32-planar': + return (view, offset)=>view.getInt32(offset, true) / 2147483648; + case 'f32': + case 'f32-planar': + return (view, offset)=>view.getFloat32(offset, true); + } +}; +const getWriteFunction = (format)=>{ + switch(format){ + case 'u8': + case 'u8-planar': + return (view, offset, value)=>view.setUint8(offset, (0, _miscJs.clamp)((value + 1) * 127.5, 0, 255)); + case 's16': + case 's16-planar': + return (view, offset, value)=>view.setInt16(offset, (0, _miscJs.clamp)(Math.round(value * 32767), -32768, 32767), true); + case 's32': + case 's32-planar': + return (view, offset, value)=>view.setInt32(offset, (0, _miscJs.clamp)(Math.round(value * 2147483647), -2147483648, 2147483647), true); + case 'f32': + case 'f32-planar': + return (view, offset, value)=>view.setFloat32(offset, value, true); + } +}; +const isAudioData = (x)=>{ + return typeof AudioData !== 'undefined' && x instanceof AudioData; +}; + +},{"./misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"2usK6":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "buildIsobmffMimeType", ()=>buildIsobmffMimeType); +const buildIsobmffMimeType = (info)=>{ + const base = info.hasVideo ? 'video/' : info.hasAudio ? 'audio/' : 'application/'; + let string = base + (info.isQuickTime ? 'quicktime' : 'mp4'); + if (info.codecStrings.length > 0) { + const uniqueCodecMimeTypes = [ + ...new Set(info.codecStrings) + ]; + string += `; codecs="${uniqueCodecMimeTypes.join(', ')}"`; + } + return string; +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"hjB9E":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "MIN_BOX_HEADER_SIZE", ()=>MIN_BOX_HEADER_SIZE); +parcelHelpers.export(exports, "MAX_BOX_HEADER_SIZE", ()=>MAX_BOX_HEADER_SIZE); +parcelHelpers.export(exports, "readBoxHeader", ()=>readBoxHeader); +parcelHelpers.export(exports, "readFixed_16_16", ()=>readFixed_16_16); +parcelHelpers.export(exports, "readFixed_2_30", ()=>readFixed_2_30); +parcelHelpers.export(exports, "readIsomVariableInteger", ()=>readIsomVariableInteger); +parcelHelpers.export(exports, "readMetadataStringShort", ()=>readMetadataStringShort); +parcelHelpers.export(exports, "readDataBox", ()=>readDataBox); +var _metadataJs = require("../metadata.js"); +var _miscJs = require("../misc.js"); +var _readerJs = require("../reader.js"); +const MIN_BOX_HEADER_SIZE = 8; +const MAX_BOX_HEADER_SIZE = 16; +const readBoxHeader = (slice)=>{ + let totalSize = (0, _readerJs.readU32Be)(slice); + const name = (0, _readerJs.readAscii)(slice, 4); + let headerSize = 8; + const hasLargeSize = totalSize === 1; + if (hasLargeSize) { + totalSize = (0, _readerJs.readU64Be)(slice); + headerSize = 16; + } + const contentSize = totalSize - headerSize; + if (contentSize < 0) return null; // Hardly a box is it + return { + name, + totalSize, + headerSize, + contentSize + }; +}; +const readFixed_16_16 = (slice)=>{ + return (0, _readerJs.readI32Be)(slice) / 0x10000; +}; +const readFixed_2_30 = (slice)=>{ + return (0, _readerJs.readI32Be)(slice) / 0x40000000; +}; +const readIsomVariableInteger = (slice)=>{ + let result = 0; + for(let i = 0; i < 4; i++){ + result <<= 7; + const nextByte = (0, _readerJs.readU8)(slice); + result |= nextByte & 0x7f; + if ((nextByte & 0x80) === 0) break; + } + return result; +}; +const readMetadataStringShort = (slice)=>{ + let stringLength = (0, _readerJs.readU16Be)(slice); + slice.skip(2); // Language + stringLength = Math.min(stringLength, slice.remainingLength); + return (0, _miscJs.textDecoder).decode((0, _readerJs.readBytes)(slice, stringLength)); +}; +const readDataBox = (slice)=>{ + const header = readBoxHeader(slice); + if (!header || header.name !== 'data') return null; + if (slice.remainingLength < 8) // Box is too small + return null; + const typeIndicator = (0, _readerJs.readU32Be)(slice); + slice.skip(4); // Locale indicator + const data = (0, _readerJs.readBytes)(slice, header.contentSize - 8); + switch(typeIndicator){ + case 1: + return (0, _miscJs.textDecoder).decode(data); // UTF-8 + case 2: + return new TextDecoder('utf-16be').decode(data); // UTF-16-BE + case 13: + return new (0, _metadataJs.RichImageData)(data, 'image/jpeg'); + case 14: + return new (0, _metadataJs.RichImageData)(data, 'image/png'); + case 27: + return new (0, _metadataJs.RichImageData)(data, 'image/bmp'); + default: + return data; + } +}; + +},{"../metadata.js":"3j8h1","../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"3j8h1":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ /** + * Image data with additional metadata. + * + * @group Metadata tags + * @public + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "RichImageData", ()=>RichImageData); +/** + * A file attached to a media file. + * + * @group Metadata tags + * @public + */ parcelHelpers.export(exports, "AttachedFile", ()=>AttachedFile); +parcelHelpers.export(exports, "validateMetadataTags", ()=>validateMetadataTags); +parcelHelpers.export(exports, "metadataTagsAreEmpty", ()=>metadataTagsAreEmpty); +parcelHelpers.export(exports, "DEFAULT_TRACK_DISPOSITION", ()=>DEFAULT_TRACK_DISPOSITION); +parcelHelpers.export(exports, "validateTrackDisposition", ()=>validateTrackDisposition); +class RichImageData { + /** Creates a new {@link RichImageData}. */ constructor(/** The raw image data. */ data, /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ mimeType){ + this.data = data; + this.mimeType = mimeType; + if (!(data instanceof Uint8Array)) throw new TypeError('data must be a Uint8Array.'); + if (typeof mimeType !== 'string') throw new TypeError('mimeType must be a string.'); + } +} +class AttachedFile { + /** Creates a new {@link AttachedFile}. */ constructor(/** The raw file data. */ data, /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */ mimeType, /** The name of the file. */ name, /** A description of the file. */ description){ + this.data = data; + this.mimeType = mimeType; + this.name = name; + this.description = description; + if (!(data instanceof Uint8Array)) throw new TypeError('data must be a Uint8Array.'); + if (mimeType !== undefined && typeof mimeType !== 'string') throw new TypeError('mimeType, when provided, must be a string.'); + if (name !== undefined && typeof name !== 'string') throw new TypeError('name, when provided, must be a string.'); + if (description !== undefined && typeof description !== 'string') throw new TypeError('description, when provided, must be a string.'); + } +} +const validateMetadataTags = (tags)=>{ + if (!tags || typeof tags !== 'object') throw new TypeError('tags must be an object.'); + if (tags.title !== undefined && typeof tags.title !== 'string') throw new TypeError('tags.title, when provided, must be a string.'); + if (tags.description !== undefined && typeof tags.description !== 'string') throw new TypeError('tags.description, when provided, must be a string.'); + if (tags.artist !== undefined && typeof tags.artist !== 'string') throw new TypeError('tags.artist, when provided, must be a string.'); + if (tags.album !== undefined && typeof tags.album !== 'string') throw new TypeError('tags.album, when provided, must be a string.'); + if (tags.albumArtist !== undefined && typeof tags.albumArtist !== 'string') throw new TypeError('tags.albumArtist, when provided, must be a string.'); + if (tags.trackNumber !== undefined && (!Number.isInteger(tags.trackNumber) || tags.trackNumber <= 0)) throw new TypeError('tags.trackNumber, when provided, must be a positive integer.'); + if (tags.tracksTotal !== undefined && (!Number.isInteger(tags.tracksTotal) || tags.tracksTotal <= 0)) throw new TypeError('tags.tracksTotal, when provided, must be a positive integer.'); + if (tags.discNumber !== undefined && (!Number.isInteger(tags.discNumber) || tags.discNumber <= 0)) throw new TypeError('tags.discNumber, when provided, must be a positive integer.'); + if (tags.discsTotal !== undefined && (!Number.isInteger(tags.discsTotal) || tags.discsTotal <= 0)) throw new TypeError('tags.discsTotal, when provided, must be a positive integer.'); + if (tags.genre !== undefined && typeof tags.genre !== 'string') throw new TypeError('tags.genre, when provided, must be a string.'); + if (tags.date !== undefined && (!(tags.date instanceof Date) || Number.isNaN(tags.date.getTime()))) throw new TypeError('tags.date, when provided, must be a valid Date.'); + if (tags.lyrics !== undefined && typeof tags.lyrics !== 'string') throw new TypeError('tags.lyrics, when provided, must be a string.'); + if (tags.images !== undefined) { + if (!Array.isArray(tags.images)) throw new TypeError('tags.images, when provided, must be an array.'); + for (const image of tags.images){ + if (!image || typeof image !== 'object') throw new TypeError('Each image in tags.images must be an object.'); + if (!(image.data instanceof Uint8Array)) throw new TypeError('Each image.data must be a Uint8Array.'); + if (typeof image.mimeType !== 'string') throw new TypeError('Each image.mimeType must be a string.'); + if (![ + 'coverFront', + 'coverBack', + 'unknown' + ].includes(image.kind)) throw new TypeError('Each image.kind must be \'coverFront\', \'coverBack\', or \'unknown\'.'); + } + } + if (tags.comment !== undefined && typeof tags.comment !== 'string') throw new TypeError('tags.comment, when provided, must be a string.'); + if (tags.raw !== undefined) { + if (!tags.raw || typeof tags.raw !== 'object') throw new TypeError('tags.raw, when provided, must be an object.'); + for (const value of Object.values(tags.raw)){ + if (value !== null && typeof value !== 'string' && !(value instanceof Uint8Array) && !(value instanceof RichImageData) && !(value instanceof AttachedFile)) throw new TypeError('Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.'); + } + } +}; +const metadataTagsAreEmpty = (tags)=>{ + return tags.title === undefined && tags.description === undefined && tags.artist === undefined && tags.album === undefined && tags.albumArtist === undefined && tags.trackNumber === undefined && tags.tracksTotal === undefined && tags.discNumber === undefined && tags.discsTotal === undefined && tags.genre === undefined && tags.date === undefined && tags.lyrics === undefined && (!tags.images || tags.images.length === 0) && tags.comment === undefined && (tags.raw === undefined || Object.keys(tags.raw).length === 0); +}; +const DEFAULT_TRACK_DISPOSITION = { + default: true, + forced: false, + original: false, + commentary: false, + hearingImpaired: false, + visuallyImpaired: false +}; +const validateTrackDisposition = (disposition)=>{ + if (!disposition || typeof disposition !== 'object') throw new TypeError('disposition must be an object.'); + if (disposition.default !== undefined && typeof disposition.default !== 'boolean') throw new TypeError('disposition.default must be a boolean.'); + if (disposition.forced !== undefined && typeof disposition.forced !== 'boolean') throw new TypeError('disposition.forced must be a boolean.'); + if (disposition.original !== undefined && typeof disposition.original !== 'boolean') throw new TypeError('disposition.original must be a boolean.'); + if (disposition.commentary !== undefined && typeof disposition.commentary !== 'boolean') throw new TypeError('disposition.commentary must be a boolean.'); + if (disposition.hearingImpaired !== undefined && typeof disposition.hearingImpaired !== 'boolean') throw new TypeError('disposition.hearingImpaired must be a boolean.'); + if (disposition.visuallyImpaired !== undefined && typeof disposition.visuallyImpaired !== 'boolean') throw new TypeError('disposition.visuallyImpaired must be a boolean.'); +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"fr2Ka":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Reader", ()=>Reader); +parcelHelpers.export(exports, "FileSlice", ()=>FileSlice); +parcelHelpers.export(exports, "readBytes", ()=>readBytes); +parcelHelpers.export(exports, "readU8", ()=>readU8); +parcelHelpers.export(exports, "readU16", ()=>readU16); +parcelHelpers.export(exports, "readU16Be", ()=>readU16Be); +parcelHelpers.export(exports, "readU24Be", ()=>readU24Be); +parcelHelpers.export(exports, "readI16Be", ()=>readI16Be); +parcelHelpers.export(exports, "readU32", ()=>readU32); +parcelHelpers.export(exports, "readU32Be", ()=>readU32Be); +parcelHelpers.export(exports, "readU32Le", ()=>readU32Le); +parcelHelpers.export(exports, "readI32Be", ()=>readI32Be); +parcelHelpers.export(exports, "readI32Le", ()=>readI32Le); +parcelHelpers.export(exports, "readU64", ()=>readU64); +parcelHelpers.export(exports, "readU64Be", ()=>readU64Be); +parcelHelpers.export(exports, "readI64Be", ()=>readI64Be); +parcelHelpers.export(exports, "readI64Le", ()=>readI64Le); +parcelHelpers.export(exports, "readF32Be", ()=>readF32Be); +parcelHelpers.export(exports, "readF64Be", ()=>readF64Be); +parcelHelpers.export(exports, "readAscii", ()=>readAscii); +var _inputJs = require("./input.js"); +var _miscJs = require("./misc.js"); +class Reader { + constructor(source){ + this.source = source; + } + requestSlice(start, length) { + if (this.source._disposed) throw new (0, _inputJs.InputDisposedError)(); + if (this.fileSize !== null && start + length > this.fileSize) return null; + const end = start + length; + const result = this.source._read(start, end); + if (result instanceof Promise) return result.then((x)=>{ + if (!x) return null; + return new FileSlice(x.bytes, x.view, x.offset, start, end); + }); + else { + if (!result) return null; + return new FileSlice(result.bytes, result.view, result.offset, start, end); + } + } + requestSliceRange(start, minLength, maxLength) { + if (this.source._disposed) throw new (0, _inputJs.InputDisposedError)(); + if (this.fileSize !== null) return this.requestSlice(start, (0, _miscJs.clamp)(this.fileSize - start, minLength, maxLength)); + else { + const promisedAttempt = this.requestSlice(start, maxLength); + const handleAttempt = (attempt)=>{ + if (attempt) return attempt; + const handleFileSize = (fileSize)=>{ + (0, _miscJs.assert)(fileSize !== null); // The slice couldn't fit, meaning we must know the file size now + return this.requestSlice(start, (0, _miscJs.clamp)(fileSize - start, minLength, maxLength)); + }; + const promisedFileSize = this.source._retrieveSize(); + if (promisedFileSize instanceof Promise) return promisedFileSize.then(handleFileSize); + else return handleFileSize(promisedFileSize); + }; + if (promisedAttempt instanceof Promise) return promisedAttempt.then(handleAttempt); + else return handleAttempt(promisedAttempt); + } + } +} +class FileSlice { + constructor(/** The underlying bytes backing this slice. Avoid using this directly and prefer reader functions instead. */ bytes, /** A view into the bytes backing this slice. Avoid using this directly and prefer reader functions instead. */ view, /** The offset in "file bytes" at which `bytes` begins in the file. */ offset, /** The offset in "file bytes" where this slice begins. */ start, /** The offset in "file bytes" where this slice ends (exclusive). */ end){ + this.bytes = bytes; + this.view = view; + this.offset = offset; + this.start = start; + this.end = end; + this.bufferPos = start - offset; + } + static tempFromBytes(bytes) { + return new FileSlice(bytes, (0, _miscJs.toDataView)(bytes), 0, 0, bytes.length); + } + get length() { + return this.end - this.start; + } + get filePos() { + return this.offset + this.bufferPos; + } + set filePos(value) { + this.bufferPos = value - this.offset; + } + /** The number of bytes left from the current pos to the end of the slice. */ get remainingLength() { + return Math.max(this.end - this.filePos, 0); + } + skip(byteCount) { + this.bufferPos += byteCount; + } + /** Creates a new subslice of this slice whose byte range must be contained within this slice. */ slice(filePos, length = this.end - filePos) { + if (filePos < this.start || filePos + length > this.end) throw new RangeError('Slicing outside of original slice.'); + return new FileSlice(this.bytes, this.view, this.offset, filePos, filePos + length); + } +} +const checkIsInRange = (slice, bytesToRead)=>{ + if (slice.filePos < slice.start || slice.filePos + bytesToRead > slice.end) throw new RangeError(`Tried reading [${slice.filePos}, ${slice.filePos + bytesToRead}), but slice is` + ` [${slice.start}, ${slice.end}). This is likely an internal error, please report it alongside the file` + ` that caused it.`); +}; +const readBytes = (slice, length)=>{ + checkIsInRange(slice, length); + const bytes = slice.bytes.subarray(slice.bufferPos, slice.bufferPos + length); + slice.bufferPos += length; + return bytes; +}; +const readU8 = (slice)=>{ + checkIsInRange(slice, 1); + return slice.view.getUint8(slice.bufferPos++); +}; +const readU16 = (slice, littleEndian)=>{ + checkIsInRange(slice, 2); + const value = slice.view.getUint16(slice.bufferPos, littleEndian); + slice.bufferPos += 2; + return value; +}; +const readU16Be = (slice)=>{ + checkIsInRange(slice, 2); + const value = slice.view.getUint16(slice.bufferPos, false); + slice.bufferPos += 2; + return value; +}; +const readU24Be = (slice)=>{ + checkIsInRange(slice, 3); + const value = (0, _miscJs.getUint24)(slice.view, slice.bufferPos, false); + slice.bufferPos += 3; + return value; +}; +const readI16Be = (slice)=>{ + checkIsInRange(slice, 2); + const value = slice.view.getInt16(slice.bufferPos, false); + slice.bufferPos += 2; + return value; +}; +const readU32 = (slice, littleEndian)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getUint32(slice.bufferPos, littleEndian); + slice.bufferPos += 4; + return value; +}; +const readU32Be = (slice)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getUint32(slice.bufferPos, false); + slice.bufferPos += 4; + return value; +}; +const readU32Le = (slice)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getUint32(slice.bufferPos, true); + slice.bufferPos += 4; + return value; +}; +const readI32Be = (slice)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getInt32(slice.bufferPos, false); + slice.bufferPos += 4; + return value; +}; +const readI32Le = (slice)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getInt32(slice.bufferPos, true); + slice.bufferPos += 4; + return value; +}; +const readU64 = (slice, littleEndian)=>{ + let low; + let high; + if (littleEndian) { + low = readU32(slice, true); + high = readU32(slice, true); + } else { + high = readU32(slice, false); + low = readU32(slice, false); + } + return high * 0x100000000 + low; +}; +const readU64Be = (slice)=>{ + const high = readU32Be(slice); + const low = readU32Be(slice); + return high * 0x100000000 + low; +}; +const readI64Be = (slice)=>{ + const high = readI32Be(slice); + const low = readU32Be(slice); + return high * 0x100000000 + low; +}; +const readI64Le = (slice)=>{ + const low = readU32Le(slice); + const high = readI32Le(slice); + return high * 0x100000000 + low; +}; +const readF32Be = (slice)=>{ + checkIsInRange(slice, 4); + const value = slice.view.getFloat32(slice.bufferPos, false); + slice.bufferPos += 4; + return value; +}; +const readF64Be = (slice)=>{ + checkIsInRange(slice, 8); + const value = slice.view.getFloat64(slice.bufferPos, false); + slice.bufferPos += 8; + return value; +}; +const readAscii = (slice, length)=>{ + checkIsInRange(slice, length); + let str = ''; + for(let i = 0; i < length; i++)str += String.fromCharCode(slice.bytes[slice.bufferPos++]); + return str; +}; + +},{"./input.js":"4IqVo","./misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"b6nkD":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +/** Wrapper around a number to be able to differentiate it in the writer. */ parcelHelpers.export(exports, "EBMLFloat32", ()=>EBMLFloat32); +/** Wrapper around a number to be able to differentiate it in the writer. */ parcelHelpers.export(exports, "EBMLFloat64", ()=>EBMLFloat64); +/** Wrapper around a number to be able to differentiate it in the writer. */ parcelHelpers.export(exports, "EBMLSignedInt", ()=>EBMLSignedInt); +parcelHelpers.export(exports, "EBMLUnicodeString", ()=>EBMLUnicodeString); +parcelHelpers.export(exports, "EBMLId", ()=>EBMLId); +parcelHelpers.export(exports, "LEVEL_0_EBML_IDS", ()=>LEVEL_0_EBML_IDS); +parcelHelpers.export(exports, "LEVEL_1_EBML_IDS", ()=>LEVEL_1_EBML_IDS); +parcelHelpers.export(exports, "LEVEL_0_AND_1_EBML_IDS", ()=>LEVEL_0_AND_1_EBML_IDS); +parcelHelpers.export(exports, "measureUnsignedInt", ()=>measureUnsignedInt); +parcelHelpers.export(exports, "measureUnsignedBigInt", ()=>measureUnsignedBigInt); +parcelHelpers.export(exports, "measureSignedInt", ()=>measureSignedInt); +parcelHelpers.export(exports, "measureVarInt", ()=>measureVarInt); +parcelHelpers.export(exports, "EBMLWriter", ()=>EBMLWriter); +parcelHelpers.export(exports, "MAX_VAR_INT_SIZE", ()=>MAX_VAR_INT_SIZE); +parcelHelpers.export(exports, "MIN_HEADER_SIZE", ()=>MIN_HEADER_SIZE); +parcelHelpers.export(exports, "MAX_HEADER_SIZE", ()=>MAX_HEADER_SIZE); +parcelHelpers.export(exports, "readVarIntSize", ()=>readVarIntSize); +parcelHelpers.export(exports, "readVarInt", ()=>readVarInt); +parcelHelpers.export(exports, "readUnsignedInt", ()=>readUnsignedInt); +parcelHelpers.export(exports, "readUnsignedBigInt", ()=>readUnsignedBigInt); +parcelHelpers.export(exports, "readSignedInt", ()=>readSignedInt); +parcelHelpers.export(exports, "readElementId", ()=>readElementId); +parcelHelpers.export(exports, "readElementSize", ()=>readElementSize); +parcelHelpers.export(exports, "readElementHeader", ()=>readElementHeader); +parcelHelpers.export(exports, "readAsciiString", ()=>readAsciiString); +parcelHelpers.export(exports, "readUnicodeString", ()=>readUnicodeString); +parcelHelpers.export(exports, "readFloat", ()=>readFloat); +parcelHelpers.export(exports, "searchForNextElementId", ()=>searchForNextElementId); +parcelHelpers.export(exports, "resync", ()=>resync); +parcelHelpers.export(exports, "CODEC_STRING_MAP", ()=>CODEC_STRING_MAP); +parcelHelpers.export(exports, "assertDefinedSize", ()=>assertDefinedSize); +var _miscJs = require("../misc.js"); +var _readerJs = require("../reader.js"); +class EBMLFloat32 { + constructor(value){ + this.value = value; + } +} +class EBMLFloat64 { + constructor(value){ + this.value = value; + } +} +class EBMLSignedInt { + constructor(value){ + this.value = value; + } +} +class EBMLUnicodeString { + constructor(value){ + this.value = value; + } +} +var EBMLId; +(function(EBMLId) { + EBMLId[EBMLId["EBML"] = 440786851] = "EBML"; + EBMLId[EBMLId["EBMLVersion"] = 17030] = "EBMLVersion"; + EBMLId[EBMLId["EBMLReadVersion"] = 17143] = "EBMLReadVersion"; + EBMLId[EBMLId["EBMLMaxIDLength"] = 17138] = "EBMLMaxIDLength"; + EBMLId[EBMLId["EBMLMaxSizeLength"] = 17139] = "EBMLMaxSizeLength"; + EBMLId[EBMLId["DocType"] = 17026] = "DocType"; + EBMLId[EBMLId["DocTypeVersion"] = 17031] = "DocTypeVersion"; + EBMLId[EBMLId["DocTypeReadVersion"] = 17029] = "DocTypeReadVersion"; + EBMLId[EBMLId["Void"] = 236] = "Void"; + EBMLId[EBMLId["Segment"] = 408125543] = "Segment"; + EBMLId[EBMLId["SeekHead"] = 290298740] = "SeekHead"; + EBMLId[EBMLId["Seek"] = 19899] = "Seek"; + EBMLId[EBMLId["SeekID"] = 21419] = "SeekID"; + EBMLId[EBMLId["SeekPosition"] = 21420] = "SeekPosition"; + EBMLId[EBMLId["Duration"] = 17545] = "Duration"; + EBMLId[EBMLId["Info"] = 357149030] = "Info"; + EBMLId[EBMLId["TimestampScale"] = 2807729] = "TimestampScale"; + EBMLId[EBMLId["MuxingApp"] = 19840] = "MuxingApp"; + EBMLId[EBMLId["WritingApp"] = 22337] = "WritingApp"; + EBMLId[EBMLId["Tracks"] = 374648427] = "Tracks"; + EBMLId[EBMLId["TrackEntry"] = 174] = "TrackEntry"; + EBMLId[EBMLId["TrackNumber"] = 215] = "TrackNumber"; + EBMLId[EBMLId["TrackUID"] = 29637] = "TrackUID"; + EBMLId[EBMLId["TrackType"] = 131] = "TrackType"; + EBMLId[EBMLId["FlagEnabled"] = 185] = "FlagEnabled"; + EBMLId[EBMLId["FlagDefault"] = 136] = "FlagDefault"; + EBMLId[EBMLId["FlagForced"] = 21930] = "FlagForced"; + EBMLId[EBMLId["FlagOriginal"] = 21934] = "FlagOriginal"; + EBMLId[EBMLId["FlagHearingImpaired"] = 21931] = "FlagHearingImpaired"; + EBMLId[EBMLId["FlagVisualImpaired"] = 21932] = "FlagVisualImpaired"; + EBMLId[EBMLId["FlagCommentary"] = 21935] = "FlagCommentary"; + EBMLId[EBMLId["FlagLacing"] = 156] = "FlagLacing"; + EBMLId[EBMLId["Name"] = 21358] = "Name"; + EBMLId[EBMLId["Language"] = 2274716] = "Language"; + EBMLId[EBMLId["LanguageBCP47"] = 2274717] = "LanguageBCP47"; + EBMLId[EBMLId["CodecID"] = 134] = "CodecID"; + EBMLId[EBMLId["CodecPrivate"] = 25506] = "CodecPrivate"; + EBMLId[EBMLId["CodecDelay"] = 22186] = "CodecDelay"; + EBMLId[EBMLId["SeekPreRoll"] = 22203] = "SeekPreRoll"; + EBMLId[EBMLId["DefaultDuration"] = 2352003] = "DefaultDuration"; + EBMLId[EBMLId["Video"] = 224] = "Video"; + EBMLId[EBMLId["PixelWidth"] = 176] = "PixelWidth"; + EBMLId[EBMLId["PixelHeight"] = 186] = "PixelHeight"; + EBMLId[EBMLId["AlphaMode"] = 21440] = "AlphaMode"; + EBMLId[EBMLId["Audio"] = 225] = "Audio"; + EBMLId[EBMLId["SamplingFrequency"] = 181] = "SamplingFrequency"; + EBMLId[EBMLId["Channels"] = 159] = "Channels"; + EBMLId[EBMLId["BitDepth"] = 25188] = "BitDepth"; + EBMLId[EBMLId["SimpleBlock"] = 163] = "SimpleBlock"; + EBMLId[EBMLId["BlockGroup"] = 160] = "BlockGroup"; + EBMLId[EBMLId["Block"] = 161] = "Block"; + EBMLId[EBMLId["BlockAdditions"] = 30113] = "BlockAdditions"; + EBMLId[EBMLId["BlockMore"] = 166] = "BlockMore"; + EBMLId[EBMLId["BlockAdditional"] = 165] = "BlockAdditional"; + EBMLId[EBMLId["BlockAddID"] = 238] = "BlockAddID"; + EBMLId[EBMLId["BlockDuration"] = 155] = "BlockDuration"; + EBMLId[EBMLId["ReferenceBlock"] = 251] = "ReferenceBlock"; + EBMLId[EBMLId["Cluster"] = 524531317] = "Cluster"; + EBMLId[EBMLId["Timestamp"] = 231] = "Timestamp"; + EBMLId[EBMLId["Cues"] = 475249515] = "Cues"; + EBMLId[EBMLId["CuePoint"] = 187] = "CuePoint"; + EBMLId[EBMLId["CueTime"] = 179] = "CueTime"; + EBMLId[EBMLId["CueTrackPositions"] = 183] = "CueTrackPositions"; + EBMLId[EBMLId["CueTrack"] = 247] = "CueTrack"; + EBMLId[EBMLId["CueClusterPosition"] = 241] = "CueClusterPosition"; + EBMLId[EBMLId["Colour"] = 21936] = "Colour"; + EBMLId[EBMLId["MatrixCoefficients"] = 21937] = "MatrixCoefficients"; + EBMLId[EBMLId["TransferCharacteristics"] = 21946] = "TransferCharacteristics"; + EBMLId[EBMLId["Primaries"] = 21947] = "Primaries"; + EBMLId[EBMLId["Range"] = 21945] = "Range"; + EBMLId[EBMLId["Projection"] = 30320] = "Projection"; + EBMLId[EBMLId["ProjectionType"] = 30321] = "ProjectionType"; + EBMLId[EBMLId["ProjectionPoseRoll"] = 30325] = "ProjectionPoseRoll"; + EBMLId[EBMLId["Attachments"] = 423732329] = "Attachments"; + EBMLId[EBMLId["AttachedFile"] = 24999] = "AttachedFile"; + EBMLId[EBMLId["FileDescription"] = 18046] = "FileDescription"; + EBMLId[EBMLId["FileName"] = 18030] = "FileName"; + EBMLId[EBMLId["FileMediaType"] = 18016] = "FileMediaType"; + EBMLId[EBMLId["FileData"] = 18012] = "FileData"; + EBMLId[EBMLId["FileUID"] = 18094] = "FileUID"; + EBMLId[EBMLId["Chapters"] = 272869232] = "Chapters"; + EBMLId[EBMLId["Tags"] = 307544935] = "Tags"; + EBMLId[EBMLId["Tag"] = 29555] = "Tag"; + EBMLId[EBMLId["Targets"] = 25536] = "Targets"; + EBMLId[EBMLId["TargetTypeValue"] = 26826] = "TargetTypeValue"; + EBMLId[EBMLId["TargetType"] = 25546] = "TargetType"; + EBMLId[EBMLId["TagTrackUID"] = 25541] = "TagTrackUID"; + EBMLId[EBMLId["TagEditionUID"] = 25545] = "TagEditionUID"; + EBMLId[EBMLId["TagChapterUID"] = 25540] = "TagChapterUID"; + EBMLId[EBMLId["TagAttachmentUID"] = 25542] = "TagAttachmentUID"; + EBMLId[EBMLId["SimpleTag"] = 26568] = "SimpleTag"; + EBMLId[EBMLId["TagName"] = 17827] = "TagName"; + EBMLId[EBMLId["TagLanguage"] = 17530] = "TagLanguage"; + EBMLId[EBMLId["TagString"] = 17543] = "TagString"; + EBMLId[EBMLId["TagBinary"] = 17541] = "TagBinary"; + EBMLId[EBMLId["ContentEncodings"] = 28032] = "ContentEncodings"; + EBMLId[EBMLId["ContentEncoding"] = 25152] = "ContentEncoding"; + EBMLId[EBMLId["ContentEncodingOrder"] = 20529] = "ContentEncodingOrder"; + EBMLId[EBMLId["ContentEncodingScope"] = 20530] = "ContentEncodingScope"; + EBMLId[EBMLId["ContentCompression"] = 20532] = "ContentCompression"; + EBMLId[EBMLId["ContentCompAlgo"] = 16980] = "ContentCompAlgo"; + EBMLId[EBMLId["ContentCompSettings"] = 16981] = "ContentCompSettings"; + EBMLId[EBMLId["ContentEncryption"] = 20533] = "ContentEncryption"; +})(EBMLId || (EBMLId = {})); +const LEVEL_0_EBML_IDS = [ + EBMLId.EBML, + EBMLId.Segment +]; +const LEVEL_1_EBML_IDS = [ + EBMLId.SeekHead, + EBMLId.Info, + EBMLId.Cluster, + EBMLId.Tracks, + EBMLId.Cues, + EBMLId.Attachments, + EBMLId.Chapters, + EBMLId.Tags +]; +const LEVEL_0_AND_1_EBML_IDS = [ + ...LEVEL_0_EBML_IDS, + ...LEVEL_1_EBML_IDS +]; +const measureUnsignedInt = (value)=>{ + if (value < 256) return 1; + else if (value < 65536) return 2; + else if (value < 16777216) return 3; + else if (value < 2 ** 32) return 4; + else if (value < 2 ** 40) return 5; + else return 6; +}; +const measureUnsignedBigInt = (value)=>{ + if (value < 1n << 8n) return 1; + else if (value < 1n << 16n) return 2; + else if (value < 1n << 24n) return 3; + else if (value < 1n << 32n) return 4; + else if (value < 1n << 40n) return 5; + else if (value < 1n << 48n) return 6; + else if (value < 1n << 56n) return 7; + else return 8; +}; +const measureSignedInt = (value)=>{ + if (value >= -64 && value < 64) return 1; + else if (value >= -8192 && value < 8192) return 2; + else if (value >= -1048576 && value < 1048576) return 3; + else if (value >= -134217728 && value < 134217728) return 4; + else if (value >= -(2 ** 34) && value < 2 ** 34) return 5; + else return 6; +}; +const measureVarInt = (value)=>{ + if (value < 127) /** Top bit is set, leaving 7 bits to hold the integer, but we can't store + * 127 because "all bits set to one" is a reserved value. Same thing for the + * other cases below: + */ return 1; + else if (value < 16383) return 2; + else if (value < 2097151) return 3; + else if (value < 268435455) return 4; + else if (value < 2 ** 35 - 1) return 5; + else if (value < 2 ** 42 - 1) return 6; + else throw new Error('EBML varint size not supported ' + value); +}; +class EBMLWriter { + constructor(writer){ + this.writer = writer; + this.helper = new Uint8Array(8); + this.helperView = new DataView(this.helper.buffer); + /** + * Stores the position from the start of the file to where EBML elements have been written. This is used to + * rewrite/edit elements that were already added before, and to measure sizes of things. + */ this.offsets = new WeakMap(); + /** Same as offsets, but stores position where the element's data starts (after ID and size fields). */ this.dataOffsets = new WeakMap(); + } + writeByte(value) { + this.helperView.setUint8(0, value); + this.writer.write(this.helper.subarray(0, 1)); + } + writeFloat32(value) { + this.helperView.setFloat32(0, value, false); + this.writer.write(this.helper.subarray(0, 4)); + } + writeFloat64(value) { + this.helperView.setFloat64(0, value, false); + this.writer.write(this.helper); + } + writeUnsignedInt(value, width = measureUnsignedInt(value)) { + let pos = 0; + // Each case falls through: + switch(width){ + case 6: + // Need to use division to access >32 bits of floating point var + this.helperView.setUint8(pos++, value / 2 ** 40 | 0); + // eslint-disable-next-line no-fallthrough + case 5: + this.helperView.setUint8(pos++, value / 2 ** 32 | 0); + // eslint-disable-next-line no-fallthrough + case 4: + this.helperView.setUint8(pos++, value >> 24); + // eslint-disable-next-line no-fallthrough + case 3: + this.helperView.setUint8(pos++, value >> 16); + // eslint-disable-next-line no-fallthrough + case 2: + this.helperView.setUint8(pos++, value >> 8); + // eslint-disable-next-line no-fallthrough + case 1: + this.helperView.setUint8(pos++, value); + break; + default: + throw new Error('Bad unsigned int size ' + width); + } + this.writer.write(this.helper.subarray(0, pos)); + } + writeUnsignedBigInt(value, width = measureUnsignedBigInt(value)) { + let pos = 0; + for(let i = width - 1; i >= 0; i--)this.helperView.setUint8(pos++, Number(value >> BigInt(i * 8) & 0xffn)); + this.writer.write(this.helper.subarray(0, pos)); + } + writeSignedInt(value, width = measureSignedInt(value)) { + if (value < 0) // Two's complement stuff + value += 2 ** (width * 8); + this.writeUnsignedInt(value, width); + } + writeVarInt(value, width = measureVarInt(value)) { + let pos = 0; + switch(width){ + case 1: + this.helperView.setUint8(pos++, 128 | value); + break; + case 2: + this.helperView.setUint8(pos++, 64 | value >> 8); + this.helperView.setUint8(pos++, value); + break; + case 3: + this.helperView.setUint8(pos++, 32 | value >> 16); + this.helperView.setUint8(pos++, value >> 8); + this.helperView.setUint8(pos++, value); + break; + case 4: + this.helperView.setUint8(pos++, 16 | value >> 24); + this.helperView.setUint8(pos++, value >> 16); + this.helperView.setUint8(pos++, value >> 8); + this.helperView.setUint8(pos++, value); + break; + case 5: + /** + * JavaScript converts its doubles to 32-bit integers for bitwise + * operations, so we need to do a division by 2^32 instead of a + * right-shift of 32 to retain those top 3 bits + */ this.helperView.setUint8(pos++, 8 | value / 2 ** 32 & 0x7); + this.helperView.setUint8(pos++, value >> 24); + this.helperView.setUint8(pos++, value >> 16); + this.helperView.setUint8(pos++, value >> 8); + this.helperView.setUint8(pos++, value); + break; + case 6: + this.helperView.setUint8(pos++, 4 | value / 2 ** 40 & 0x3); + this.helperView.setUint8(pos++, value / 2 ** 32 | 0); + this.helperView.setUint8(pos++, value >> 24); + this.helperView.setUint8(pos++, value >> 16); + this.helperView.setUint8(pos++, value >> 8); + this.helperView.setUint8(pos++, value); + break; + default: + throw new Error('Bad EBML varint size ' + width); + } + this.writer.write(this.helper.subarray(0, pos)); + } + writeAsciiString(str) { + this.writer.write(new Uint8Array(str.split('').map((x)=>x.charCodeAt(0)))); + } + writeEBML(data) { + if (data === null) return; + if (data instanceof Uint8Array) this.writer.write(data); + else if (Array.isArray(data)) for (const elem of data)this.writeEBML(elem); + else { + this.offsets.set(data, this.writer.getPos()); + this.writeUnsignedInt(data.id); // ID field + if (Array.isArray(data.data)) { + const sizePos = this.writer.getPos(); + const sizeSize = data.size === -1 ? 1 : data.size ?? 4; + if (data.size === -1) // Write the reserved all-one-bits marker for unknown/unbounded size. + this.writeByte(0xff); + else this.writer.seek(this.writer.getPos() + sizeSize); + const startPos = this.writer.getPos(); + this.dataOffsets.set(data, startPos); + this.writeEBML(data.data); + if (data.size !== -1) { + const size = this.writer.getPos() - startPos; + const endPos = this.writer.getPos(); + this.writer.seek(sizePos); + this.writeVarInt(size, sizeSize); + this.writer.seek(endPos); + } + } else if (typeof data.data === 'number') { + const size = data.size ?? measureUnsignedInt(data.data); + this.writeVarInt(size); + this.writeUnsignedInt(data.data, size); + } else if (typeof data.data === 'bigint') { + const size = data.size ?? measureUnsignedBigInt(data.data); + this.writeVarInt(size); + this.writeUnsignedBigInt(data.data, size); + } else if (typeof data.data === 'string') { + this.writeVarInt(data.data.length); + this.writeAsciiString(data.data); + } else if (data.data instanceof Uint8Array) { + this.writeVarInt(data.data.byteLength, data.size); + this.writer.write(data.data); + } else if (data.data instanceof EBMLFloat32) { + this.writeVarInt(4); + this.writeFloat32(data.data.value); + } else if (data.data instanceof EBMLFloat64) { + this.writeVarInt(8); + this.writeFloat64(data.data.value); + } else if (data.data instanceof EBMLSignedInt) { + const size = data.size ?? measureSignedInt(data.data.value); + this.writeVarInt(size); + this.writeSignedInt(data.data.value, size); + } else if (data.data instanceof EBMLUnicodeString) { + const bytes = (0, _miscJs.textEncoder).encode(data.data.value); + this.writeVarInt(bytes.length); + this.writer.write(bytes); + } else (0, _miscJs.assertNever)(data.data); + } + } +} +const MAX_VAR_INT_SIZE = 8; +const MIN_HEADER_SIZE = 2; // 1-byte ID and 1-byte size +const MAX_HEADER_SIZE = 2 * MAX_VAR_INT_SIZE; // 8-byte ID and 8-byte size +const readVarIntSize = (slice)=>{ + const firstByte = (0, _readerJs.readU8)(slice); + slice.skip(-1); + if (firstByte === 0) return null; // Invalid VINT + let width = 1; + let mask = 0x80; + while((firstByte & mask) === 0){ + width++; + mask >>= 1; + } + return width; +}; +const readVarInt = (slice)=>{ + // Read the first byte to determine the width of the variable-length integer + const firstByte = (0, _readerJs.readU8)(slice); + if (firstByte === 0) return null; // Invalid VINT + // Find the position of VINT_MARKER, which determines the width + let width = 1; + let mask = 128; + while((firstByte & mask) === 0){ + width++; + mask >>= 1; + } + // First byte's value needs the marker bit cleared + let value = firstByte & mask - 1; + // Read remaining bytes + for(let i = 1; i < width; i++){ + value *= 256; + value += (0, _readerJs.readU8)(slice); + } + return value; +}; +const readUnsignedInt = (slice, width)=>{ + if (width < 1 || width > 8) throw new Error('Bad unsigned int size ' + width); + let value = 0; + // Read bytes from most significant to least significant + for(let i = 0; i < width; i++){ + value *= 256; + value += (0, _readerJs.readU8)(slice); + } + return value; +}; +const readUnsignedBigInt = (slice, width)=>{ + if (width < 1) throw new Error('Bad unsigned int size ' + width); + let value = 0n; + for(let i = 0; i < width; i++){ + value <<= 8n; + value += BigInt((0, _readerJs.readU8)(slice)); + } + return value; +}; +const readSignedInt = (slice, width)=>{ + let value = readUnsignedInt(slice, width); + // If the highest bit is set, convert from two's complement + if (value & 1 << width * 8 - 1) value -= 2 ** (width * 8); + return value; +}; +const readElementId = (slice)=>{ + const size = readVarIntSize(slice); + if (size === null) return null; + const id = readUnsignedInt(slice, size); + return id; +}; +const readElementSize = (slice)=>{ + let size = (0, _readerJs.readU8)(slice); + if (size === 0xff) size = null; + else { + slice.skip(-1); + size = readVarInt(slice); + // In some (livestreamed) files, this is the value of the size field. While this technically is just a very + // large number, it is intended to behave like the reserved size 0xFF, meaning the size is undefined. We + // catch the number here. Note that it cannot be perfectly represented as a double, but the comparison works + // nonetheless. + // eslint-disable-next-line no-loss-of-precision + if (size === 0x00ffffffffffffff) size = null; + } + return size; +}; +const readElementHeader = (slice)=>{ + const id = readElementId(slice); + if (id === null) return null; + const size = readElementSize(slice); + return { + id, + size + }; +}; +const readAsciiString = (slice, length)=>{ + const bytes = (0, _readerJs.readBytes)(slice, length); + // Actual string length might be shorter due to null terminators + let strLength = 0; + while(strLength < length && bytes[strLength] !== 0)strLength += 1; + return String.fromCharCode(...bytes.subarray(0, strLength)); +}; +const readUnicodeString = (slice, length)=>{ + const bytes = (0, _readerJs.readBytes)(slice, length); + // Actual string length might be shorter due to null terminators + let strLength = 0; + while(strLength < length && bytes[strLength] !== 0)strLength += 1; + return (0, _miscJs.textDecoder).decode(bytes.subarray(0, strLength)); +}; +const readFloat = (slice, width)=>{ + if (width === 0) return 0; + if (width !== 4 && width !== 8) throw new Error('Bad float size ' + width); + return width === 4 ? (0, _readerJs.readF32Be)(slice) : (0, _readerJs.readF64Be)(slice); +}; +const searchForNextElementId = async (reader, startPos, ids, until)=>{ + const idsSet = new Set(ids); + let currentPos = startPos; + while(until === null || currentPos < until){ + let slice = reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const elementHeader = readElementHeader(slice); + if (!elementHeader) break; + if (idsSet.has(elementHeader.id)) return { + pos: currentPos, + found: true + }; + assertDefinedSize(elementHeader.size); + currentPos = slice.filePos + elementHeader.size; + } + return { + pos: until !== null && until > currentPos ? until : currentPos, + found: false + }; +}; +const resync = async (reader, startPos, ids, until)=>{ + const CHUNK_SIZE = 2 ** 16; // So we don't need to grab thousands of slices + const idsSet = new Set(ids); + let currentPos = startPos; + while(currentPos < until){ + let slice = reader.requestSliceRange(currentPos, 0, Math.min(CHUNK_SIZE, until - currentPos)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + if (slice.length < MAX_VAR_INT_SIZE) break; + for(let i = 0; i < slice.length - MAX_VAR_INT_SIZE; i++){ + slice.filePos = currentPos; + const elementId = readElementId(slice); + if (elementId !== null && idsSet.has(elementId)) return currentPos; + currentPos++; + } + } + return null; +}; +const CODEC_STRING_MAP = { + 'avc': 'V_MPEG4/ISO/AVC', + 'hevc': 'V_MPEGH/ISO/HEVC', + 'vp8': 'V_VP8', + 'vp9': 'V_VP9', + 'av1': 'V_AV1', + 'aac': 'A_AAC', + 'mp3': 'A_MPEG/L3', + 'opus': 'A_OPUS', + 'vorbis': 'A_VORBIS', + 'flac': 'A_FLAC', + 'pcm-u8': 'A_PCM/INT/LIT', + 'pcm-s16': 'A_PCM/INT/LIT', + 'pcm-s16be': 'A_PCM/INT/BIG', + 'pcm-s24': 'A_PCM/INT/LIT', + 'pcm-s24be': 'A_PCM/INT/BIG', + 'pcm-s32': 'A_PCM/INT/LIT', + 'pcm-s32be': 'A_PCM/INT/BIG', + 'pcm-f32': 'A_PCM/FLOAT/IEEE', + 'pcm-f64': 'A_PCM/FLOAT/IEEE', + 'webvtt': 'S_TEXT/WEBVTT' +}; +function assertDefinedSize(size) { + if (size === null) throw new Error('Undefined element size is used in a place where it is not supported.'); +} + +},{"../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"lx8cS":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "MatroskaDemuxer", ()=>MatroskaDemuxer); +var _codecDataJs = require("../codec-data.js"); +var _codecJs = require("../codec.js"); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _metadataJs = require("../metadata.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _ebmlJs = require("./ebml.js"); +var _matroskaMiscJs = require("./matroska-misc.js"); +var _readerJs = require("../reader.js"); +var BlockLacing; +(function(BlockLacing) { + BlockLacing[BlockLacing["None"] = 0] = "None"; + BlockLacing[BlockLacing["Xiph"] = 1] = "Xiph"; + BlockLacing[BlockLacing["FixedSize"] = 2] = "FixedSize"; + BlockLacing[BlockLacing["Ebml"] = 3] = "Ebml"; +})(BlockLacing || (BlockLacing = {})); +var ContentEncodingScope; +(function(ContentEncodingScope) { + ContentEncodingScope[ContentEncodingScope["Block"] = 1] = "Block"; + ContentEncodingScope[ContentEncodingScope["Private"] = 2] = "Private"; + ContentEncodingScope[ContentEncodingScope["Next"] = 4] = "Next"; +})(ContentEncodingScope || (ContentEncodingScope = {})); +var ContentCompAlgo; +(function(ContentCompAlgo) { + ContentCompAlgo[ContentCompAlgo["Zlib"] = 0] = "Zlib"; + ContentCompAlgo[ContentCompAlgo["Bzlib"] = 1] = "Bzlib"; + ContentCompAlgo[ContentCompAlgo["lzo1x"] = 2] = "lzo1x"; + ContentCompAlgo[ContentCompAlgo["HeaderStripping"] = 3] = "HeaderStripping"; +})(ContentCompAlgo || (ContentCompAlgo = {})); +const METADATA_ELEMENTS = [ + { + id: (0, _ebmlJs.EBMLId).SeekHead, + flag: 'seekHeadSeen' + }, + { + id: (0, _ebmlJs.EBMLId).Info, + flag: 'infoSeen' + }, + { + id: (0, _ebmlJs.EBMLId).Tracks, + flag: 'tracksSeen' + }, + { + id: (0, _ebmlJs.EBMLId).Cues, + flag: 'cuesSeen' + } +]; +const MAX_RESYNC_LENGTH = 10 * 2 ** 20; // 10 MiB +class MatroskaDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.readMetadataPromise = null; + this.segments = []; + this.currentSegment = null; + this.currentTrack = null; + this.currentCluster = null; + this.currentBlock = null; + this.currentBlockAdditional = null; + this.currentCueTime = null; + this.currentDecodingInstruction = null; + this.currentTagTargetIsMovie = true; + this.currentSimpleTagName = null; + this.currentAttachedFile = null; + this.isWebM = false; + this.reader = input._reader; + } + async computeDuration() { + const tracks = await this.getTracks(); + const trackDurations = await Promise.all(tracks.map((x)=>x.computeDuration())); + return Math.max(0, ...trackDurations); + } + async getTracks() { + await this.readMetadata(); + return this.segments.flatMap((segment)=>segment.tracks.map((track)=>track.inputTrack)); + } + async getMimeType() { + await this.readMetadata(); + const tracks = await this.getTracks(); + const codecStrings = await Promise.all(tracks.map((x)=>x.getCodecParameterString())); + return (0, _matroskaMiscJs.buildMatroskaMimeType)({ + isWebM: this.isWebM, + hasVideo: this.segments.some((segment)=>segment.tracks.some((x)=>x.info?.type === 'video')), + hasAudio: this.segments.some((segment)=>segment.tracks.some((x)=>x.info?.type === 'audio')), + codecStrings: codecStrings.filter(Boolean) + }); + } + async getMetadataTags() { + await this.readMetadata(); + // Load metadata tags from each segment lazily (only once) + for (const segment of this.segments)if (!segment.metadataTagsCollected) { + if (this.reader.fileSize !== null) await this.loadSegmentMetadata(segment); + segment.metadataTagsCollected = true; + } + // This is kinda handwavy, and how we handle multiple segments isn't suuuuper well-defined anyway; so we just + // shallow-merge metadata tags from all (usually just one) segments. + let metadataTags = {}; + for (const segment of this.segments)metadataTags = { + ...metadataTags, + ...segment.metadataTags + }; + return metadataTags; + } + readMetadata() { + return this.readMetadataPromise ??= (async ()=>{ + let currentPos = 0; + // Loop over all top-level elements in the file + while(true){ + let slice = this.reader.requestSliceRange(currentPos, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const header = (0, _ebmlJs.readElementHeader)(slice); + if (!header) break; // Zero padding at the end of the file triggers this, for example + const id = header.id; + let size = header.size; + const dataStartPos = slice.filePos; + if (id === (0, _ebmlJs.EBMLId).EBML) { + (0, _ebmlJs.assertDefinedSize)(size); + let slice = this.reader.requestSlice(dataStartPos, size); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + this.readContiguousElements(slice); + } else if (id === (0, _ebmlJs.EBMLId).Segment) { + await this.readSegment(dataStartPos, size); + if (size === null) break; + if (this.reader.fileSize === null) break; // Stop at the first segment + } else if (id === (0, _ebmlJs.EBMLId).Cluster) { + if (this.reader.fileSize === null) break; // Shouldn't be reached anyway, since we stop at the first segment + // Clusters are not a top-level element in Matroska, but some files contain a Segment whose size + // doesn't contain any of the clusters that follow it. In the case, we apply the following logic: if + // we find a top-level cluster, attribute it to the previous segment. + if (size === null) { + // Just in case this is one of those weird sizeless clusters, let's do our best and still try to + // determine its size. + const nextElementPos = await (0, _ebmlJs.searchForNextElementId)(this.reader, dataStartPos, (0, _ebmlJs.LEVEL_0_AND_1_EBML_IDS), this.reader.fileSize); + size = nextElementPos.pos - dataStartPos; + } + const lastSegment = (0, _miscJs.last)(this.segments); + if (lastSegment) // Extend the previous segment's size + lastSegment.elementEndPos = dataStartPos + size; + } + (0, _ebmlJs.assertDefinedSize)(size); + currentPos = dataStartPos + size; + } + })(); + } + async readSegment(segmentDataStart, dataSize) { + this.currentSegment = { + seekHeadSeen: false, + infoSeen: false, + tracksSeen: false, + cuesSeen: false, + tagsSeen: false, + attachmentsSeen: false, + timestampScale: -1, + timestampFactor: -1, + duration: -1, + seekEntries: [], + tracks: [], + cuePoints: [], + dataStartPos: segmentDataStart, + elementEndPos: dataSize === null ? null // Assume it goes until the end of the file + : segmentDataStart + dataSize, + clusterSeekStartPos: segmentDataStart, + lastReadCluster: null, + metadataTags: {}, + metadataTagsCollected: false + }; + this.segments.push(this.currentSegment); + let currentPos = segmentDataStart; + while(this.currentSegment.elementEndPos === null || currentPos < this.currentSegment.elementEndPos){ + let slice = this.reader.requestSliceRange(currentPos, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const elementStartPos = currentPos; + const header = (0, _ebmlJs.readElementHeader)(slice); + if (!header || !(0, _ebmlJs.LEVEL_1_EBML_IDS).includes(header.id) && header.id !== (0, _ebmlJs.EBMLId).Void) { + // Potential junk. Let's try to resync + const nextPos = await (0, _ebmlJs.resync)(this.reader, elementStartPos, (0, _ebmlJs.LEVEL_1_EBML_IDS), Math.min(this.currentSegment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH)); + if (nextPos) { + currentPos = nextPos; + continue; + } else break; // Resync failed + } + const { id, size } = header; + const dataStartPos = slice.filePos; + const metadataElementIndex = METADATA_ELEMENTS.findIndex((x)=>x.id === id); + if (metadataElementIndex !== -1) { + const field = METADATA_ELEMENTS[metadataElementIndex].flag; + this.currentSegment[field] = true; + (0, _ebmlJs.assertDefinedSize)(size); + let slice = this.reader.requestSlice(dataStartPos, size); + if (slice instanceof Promise) slice = await slice; + if (slice) this.readContiguousElements(slice); + } else if (id === (0, _ebmlJs.EBMLId).Tags || id === (0, _ebmlJs.EBMLId).Attachments) { + // Metadata found at the beginning of the segment, great, let's parse it + if (id === (0, _ebmlJs.EBMLId).Tags) this.currentSegment.tagsSeen = true; + else this.currentSegment.attachmentsSeen = true; + (0, _ebmlJs.assertDefinedSize)(size); + let slice = this.reader.requestSlice(dataStartPos, size); + if (slice instanceof Promise) slice = await slice; + if (slice) this.readContiguousElements(slice); + } else if (id === (0, _ebmlJs.EBMLId).Cluster) { + this.currentSegment.clusterSeekStartPos = elementStartPos; + break; // Stop at the first cluster + } + if (size === null) break; + else currentPos = dataStartPos + size; + } + // Sort the seek entries by file position so reading them exhibits a sequential pattern + this.currentSegment.seekEntries.sort((a, b)=>a.segmentPosition - b.segmentPosition); + if (this.reader.fileSize !== null) // Use the seek head to read missing metadata elements + for (const seekEntry of this.currentSegment.seekEntries){ + const target = METADATA_ELEMENTS.find((x)=>x.id === seekEntry.id); + if (!target) continue; + if (this.currentSegment[target.flag]) continue; + let slice = this.reader.requestSliceRange(segmentDataStart + seekEntry.segmentPosition, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) continue; + const header = (0, _ebmlJs.readElementHeader)(slice); + if (!header) continue; + const { id, size } = header; + if (id !== target.id) continue; + (0, _ebmlJs.assertDefinedSize)(size); + this.currentSegment[target.flag] = true; + let dataSlice = this.reader.requestSlice(slice.filePos, size); + if (dataSlice instanceof Promise) dataSlice = await dataSlice; + if (!dataSlice) continue; + this.readContiguousElements(dataSlice); + } + if (this.currentSegment.timestampScale === -1) { + // TimestampScale element is missing. Technically an invalid file, but let's default to the typical value, + // which is 1e6. + this.currentSegment.timestampScale = 1e6; + this.currentSegment.timestampFactor = 1000; + } + // Put default tracks first + this.currentSegment.tracks.sort((a, b)=>Number(b.disposition.default) - Number(a.disposition.default)); + // Now, let's distribute the cue points to the tracks + const idToTrack = new Map(this.currentSegment.tracks.map((x)=>[ + x.id, + x + ])); + // Assign cue points to their respective tracks + for (const cuePoint of this.currentSegment.cuePoints){ + const track = idToTrack.get(cuePoint.trackId); + if (track) track.cuePoints.push(cuePoint); + } + for (const track of this.currentSegment.tracks){ + // Sort cue points by time + track.cuePoints.sort((a, b)=>a.time - b.time); + // Remove multiple cue points for the same time + for(let i = 0; i < track.cuePoints.length - 1; i++){ + const cuePoint1 = track.cuePoints[i]; + const cuePoint2 = track.cuePoints[i + 1]; + if (cuePoint1.time === cuePoint2.time) { + track.cuePoints.splice(i + 1, 1); + i--; + } + } + } + let trackWithMostCuePoints = null; + let maxCuePointCount = -Infinity; + for (const track of this.currentSegment.tracks)if (track.cuePoints.length > maxCuePointCount) { + maxCuePointCount = track.cuePoints.length; + trackWithMostCuePoints = track; + } + // For every track that has received 0 cue points (can happen, often only the video track receives cue points), + // we still want to have better seeking. Therefore, let's give it the cue points of the track with the most cue + // points, which should provide us with the most fine-grained seeking. + for (const track of this.currentSegment.tracks)if (track.cuePoints.length === 0) track.cuePoints = trackWithMostCuePoints.cuePoints; + this.currentSegment = null; + } + async readCluster(startPos, segment) { + if (segment.lastReadCluster?.elementStartPos === startPos) return segment.lastReadCluster; + let headerSlice = this.reader.requestSliceRange(startPos, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + (0, _miscJs.assert)(headerSlice); + const elementStartPos = startPos; + const elementHeader = (0, _ebmlJs.readElementHeader)(headerSlice); + (0, _miscJs.assert)(elementHeader); + const id = elementHeader.id; + (0, _miscJs.assert)(id === (0, _ebmlJs.EBMLId).Cluster); + let size = elementHeader.size; + const dataStartPos = headerSlice.filePos; + if (size === null) { + // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of + // it, so we have no other choice but to iterate over the EBML structure until we find an element at level + // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2). + const nextElementPos = await (0, _ebmlJs.searchForNextElementId)(this.reader, dataStartPos, (0, _ebmlJs.LEVEL_0_AND_1_EBML_IDS), segment.elementEndPos); + size = nextElementPos.pos - dataStartPos; + } + // Load the entire cluster + let dataSlice = this.reader.requestSlice(dataStartPos, size); + if (dataSlice instanceof Promise) dataSlice = await dataSlice; + const cluster = { + segment, + elementStartPos, + elementEndPos: dataStartPos + size, + dataStartPos, + timestamp: -1, + trackData: new Map() + }; + this.currentCluster = cluster; + if (dataSlice) { + // Read the children of the cluster, stopping early at level 0 or 1 EBML elements. We do this because some + // clusters have incorrect sizes that are too large + const endPos = this.readContiguousElements(dataSlice, (0, _ebmlJs.LEVEL_0_AND_1_EBML_IDS)); + cluster.elementEndPos = endPos; + } + for (const [, trackData] of cluster.trackData){ + const track = trackData.track; + // This must hold, as track datas only get created if a block for that track is encountered + (0, _miscJs.assert)(trackData.blocks.length > 0); + let hasLacedBlocks = false; + for(let i = 0; i < trackData.blocks.length; i++){ + const block = trackData.blocks[i]; + block.timestamp += cluster.timestamp; + hasLacedBlocks ||= block.lacing !== BlockLacing.None; + } + trackData.presentationTimestamps = trackData.blocks.map((block, i)=>({ + timestamp: block.timestamp, + blockIndex: i + })).sort((a, b)=>a.timestamp - b.timestamp); + for(let i = 0; i < trackData.presentationTimestamps.length; i++){ + const currentEntry = trackData.presentationTimestamps[i]; + const currentBlock = trackData.blocks[currentEntry.blockIndex]; + if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) trackData.firstKeyFrameTimestamp = currentBlock.timestamp; + if (i < trackData.presentationTimestamps.length - 1) { + // Update block durations based on presentation order + const nextEntry = trackData.presentationTimestamps[i + 1]; + currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp; + } else if (currentBlock.duration === 0) { + if (track.defaultDuration != null) { + if (currentBlock.lacing === BlockLacing.None) currentBlock.duration = track.defaultDuration; + // Handled by the lace resolution code + } + } + } + if (hasLacedBlocks) { + // Perform lace resolution. Here, we expand each laced block into multiple blocks where each contains + // one frame of the lace. We do this after determining block timestamps so we can properly distribute + // the block's duration across the laced frames. + this.expandLacedBlocks(trackData.blocks, track); + // Recompute since blocks have changed + trackData.presentationTimestamps = trackData.blocks.map((block, i)=>({ + timestamp: block.timestamp, + blockIndex: i + })).sort((a, b)=>a.timestamp - b.timestamp); + } + const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex]; + const lastBlock = trackData.blocks[(0, _miscJs.last)(trackData.presentationTimestamps).blockIndex]; + trackData.startTimestamp = firstBlock.timestamp; + trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration; + // Let's remember that a cluster with a given timestamp is here, speeding up future lookups if no cues exist + const insertionIndex = (0, _miscJs.binarySearchLessOrEqual)(track.clusterPositionCache, trackData.startTimestamp, (x)=>x.startTimestamp); + if (insertionIndex === -1 || track.clusterPositionCache[insertionIndex].elementStartPos !== elementStartPos) track.clusterPositionCache.splice(insertionIndex + 1, 0, { + elementStartPos: cluster.elementStartPos, + startTimestamp: trackData.startTimestamp + }); + } + segment.lastReadCluster = cluster; + return cluster; + } + getTrackDataInCluster(cluster, trackNumber) { + let trackData = cluster.trackData.get(trackNumber); + if (!trackData) { + const track = cluster.segment.tracks.find((x)=>x.id === trackNumber); + if (!track) return null; + trackData = { + track, + startTimestamp: 0, + endTimestamp: 0, + firstKeyFrameTimestamp: null, + blocks: [], + presentationTimestamps: [] + }; + cluster.trackData.set(trackNumber, trackData); + } + return trackData; + } + expandLacedBlocks(blocks, track) { + // https://www.matroska.org/technical/notes.html#block-lacing + for(let blockIndex = 0; blockIndex < blocks.length; blockIndex++){ + const originalBlock = blocks[blockIndex]; + if (originalBlock.lacing === BlockLacing.None) continue; + // Decode the block data if it hasn't been decoded yet (needed for lacing expansion) + if (!originalBlock.decoded) { + originalBlock.data = this.decodeBlockData(track, originalBlock.data); + originalBlock.decoded = true; + } + const slice = (0, _readerJs.FileSlice).tempFromBytes(originalBlock.data); + const frameSizes = []; + const frameCount = (0, _readerJs.readU8)(slice) + 1; + switch(originalBlock.lacing){ + case BlockLacing.Xiph: + { + let totalUsedSize = 0; + // Xiph lacing, just like in Ogg + for(let i = 0; i < frameCount - 1; i++){ + let frameSize = 0; + while(slice.bufferPos < slice.length){ + const value = (0, _readerJs.readU8)(slice); + frameSize += value; + if (value < 255) { + frameSizes.push(frameSize); + totalUsedSize += frameSize; + break; + } + } + } + // Compute the last frame's size from whatever's left + frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize)); + } + break; + case BlockLacing.FixedSize: + { + // Fixed size lacing: all frames have same size + const totalDataSize = slice.length - 1; // Minus the frame count byte + const frameSize = Math.floor(totalDataSize / frameCount); + for(let i = 0; i < frameCount; i++)frameSizes.push(frameSize); + } + break; + case BlockLacing.Ebml: + { + // EBML lacing: first size absolute, subsequent ones are coded as signed differences from the last + const firstResult = (0, _ebmlJs.readVarInt)(slice); + (0, _miscJs.assert)(firstResult !== null); // Assume it's not an invalid VINT + let currentSize = firstResult; + frameSizes.push(currentSize); + let totalUsedSize = currentSize; + for(let i = 1; i < frameCount - 1; i++){ + const startPos = slice.bufferPos; + const diffResult = (0, _ebmlJs.readVarInt)(slice); + (0, _miscJs.assert)(diffResult !== null); + const unsignedDiff = diffResult; + const width = slice.bufferPos - startPos; + const bias = (1 << width * 7 - 1) - 1; // Typo-corrected version of 2^((7*n)-1)^-1 + const diff = unsignedDiff - bias; + currentSize += diff; + frameSizes.push(currentSize); + totalUsedSize += currentSize; + } + // Compute the last frame's size from whatever's left + frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize)); + } + break; + default: + (0, _miscJs.assert)(false); + } + (0, _miscJs.assert)(frameSizes.length === frameCount); + blocks.splice(blockIndex, 1); // Remove the original block + const blockDuration = originalBlock.duration || frameCount * (track.defaultDuration ?? 0); + // Now, let's insert each frame as its own block + for(let i = 0; i < frameCount; i++){ + const frameSize = frameSizes[i]; + const frameData = (0, _readerJs.readBytes)(slice, frameSize); + // Distribute timestamps evenly across the block duration + const frameTimestamp = originalBlock.timestamp + blockDuration * i / frameCount; + const frameDuration = blockDuration / frameCount; + blocks.splice(blockIndex + i, 0, { + timestamp: frameTimestamp, + duration: frameDuration, + isKeyFrame: originalBlock.isKeyFrame, + data: frameData, + lacing: BlockLacing.None, + decoded: true, + mainAdditional: originalBlock.mainAdditional + }); + } + blockIndex += frameCount; // Skip the blocks we just added + blockIndex--; + } + } + async loadSegmentMetadata(segment) { + for (const seekEntry of segment.seekEntries){ + if (seekEntry.id === (0, _ebmlJs.EBMLId).Tags && !segment.tagsSeen) ; + else if (seekEntry.id === (0, _ebmlJs.EBMLId).Attachments && !segment.attachmentsSeen) ; + else continue; + let slice = this.reader.requestSliceRange(segment.dataStartPos + seekEntry.segmentPosition, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) continue; + const header = (0, _ebmlJs.readElementHeader)(slice); + if (!header || header.id !== seekEntry.id) continue; + const { size } = header; + (0, _ebmlJs.assertDefinedSize)(size); + (0, _miscJs.assert)(!this.currentSegment); + this.currentSegment = segment; + let dataSlice = this.reader.requestSlice(slice.filePos, size); + if (dataSlice instanceof Promise) dataSlice = await dataSlice; + if (dataSlice) this.readContiguousElements(dataSlice); + this.currentSegment = null; + // Mark as seen + if (seekEntry.id === (0, _ebmlJs.EBMLId).Tags) segment.tagsSeen = true; + else if (seekEntry.id === (0, _ebmlJs.EBMLId).Attachments) segment.attachmentsSeen = true; + } + } + readContiguousElements(slice, stopIds) { + const startIndex = slice.filePos; + while(slice.filePos - startIndex <= slice.length - (0, _ebmlJs.MIN_HEADER_SIZE)){ + const startPos = slice.filePos; + const foundElement = this.traverseElement(slice, stopIds); + if (!foundElement) return startPos; + } + return slice.filePos; + } + traverseElement(slice, stopIds) { + const header = (0, _ebmlJs.readElementHeader)(slice); + if (!header) return false; + if (stopIds && stopIds.includes(header.id)) return false; + const { id, size } = header; + const dataStartPos = slice.filePos; + (0, _ebmlJs.assertDefinedSize)(size); + switch(id){ + case (0, _ebmlJs.EBMLId).DocType: + this.isWebM = (0, _ebmlJs.readAsciiString)(slice, size) === 'webm'; + break; + case (0, _ebmlJs.EBMLId).Seek: + { + if (!this.currentSegment) break; + const seekEntry = { + id: -1, + segmentPosition: -1 + }; + this.currentSegment.seekEntries.push(seekEntry); + this.readContiguousElements(slice.slice(dataStartPos, size)); + if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) this.currentSegment.seekEntries.pop(); + } + break; + case (0, _ebmlJs.EBMLId).SeekID: + { + const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1]; + if (!lastSeekEntry) break; + lastSeekEntry.id = (0, _ebmlJs.readUnsignedInt)(slice, size); + } + break; + case (0, _ebmlJs.EBMLId).SeekPosition: + { + const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1]; + if (!lastSeekEntry) break; + lastSeekEntry.segmentPosition = (0, _ebmlJs.readUnsignedInt)(slice, size); + } + break; + case (0, _ebmlJs.EBMLId).TimestampScale: + if (!this.currentSegment) break; + this.currentSegment.timestampScale = (0, _ebmlJs.readUnsignedInt)(slice, size); + this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale; + break; + case (0, _ebmlJs.EBMLId).Duration: + if (!this.currentSegment) break; + this.currentSegment.duration = (0, _ebmlJs.readFloat)(slice, size); + break; + case (0, _ebmlJs.EBMLId).TrackEntry: + if (!this.currentSegment) break; + this.currentTrack = { + id: -1, + segment: this.currentSegment, + demuxer: this, + clusterPositionCache: [], + cuePoints: [], + disposition: { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }, + inputTrack: null, + codecId: null, + codecPrivate: null, + defaultDuration: null, + name: null, + languageCode: (0, _miscJs.UNDETERMINED_LANGUAGE), + decodingInstructions: [], + info: null + }; + this.readContiguousElements(slice.slice(dataStartPos, size)); + if (this.currentTrack.decodingInstructions.some((instruction)=>{ + return instruction.data?.type !== 'decompress' || instruction.scope !== ContentEncodingScope.Block || instruction.data.algorithm !== ContentCompAlgo.HeaderStripping; + })) { + console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`); + this.currentTrack = null; + } + if (this.currentTrack && this.currentTrack.id !== -1 && this.currentTrack.codecId && this.currentTrack.info) { + const slashIndex = this.currentTrack.codecId.indexOf('/'); + const codecIdWithoutSuffix = slashIndex === -1 ? this.currentTrack.codecId : this.currentTrack.codecId.slice(0, slashIndex); + if (this.currentTrack.info.type === 'video' && this.currentTrack.info.width !== -1 && this.currentTrack.info.height !== -1) { + if (this.currentTrack.codecId === (0, _ebmlJs.CODEC_STRING_MAP).avc) { + this.currentTrack.info.codec = 'avc'; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + } else if (this.currentTrack.codecId === (0, _ebmlJs.CODEC_STRING_MAP).hevc) { + this.currentTrack.info.codec = 'hevc'; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + } else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).vp8) this.currentTrack.info.codec = 'vp8'; + else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).vp9) this.currentTrack.info.codec = 'vp9'; + else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).av1) this.currentTrack.info.codec = 'av1'; + const videoTrack = this.currentTrack; + const inputTrack = new (0, _inputTrackJs.InputVideoTrack)(this.input, new MatroskaVideoTrackBacking(videoTrack)); + this.currentTrack.inputTrack = inputTrack; + this.currentSegment.tracks.push(this.currentTrack); + } else if (this.currentTrack.info.type === 'audio' && this.currentTrack.info.numberOfChannels !== -1 && this.currentTrack.info.sampleRate !== -1) { + if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).aac) { + this.currentTrack.info.codec = 'aac'; + this.currentTrack.info.aacCodecInfo = { + isMpeg2: this.currentTrack.codecId.includes('MPEG2') + }; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + } else if (this.currentTrack.codecId === (0, _ebmlJs.CODEC_STRING_MAP).mp3) this.currentTrack.info.codec = 'mp3'; + else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).opus) { + this.currentTrack.info.codec = 'opus'; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + this.currentTrack.info.sampleRate = (0, _codecJs.OPUS_SAMPLE_RATE); // Always the same + } else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).vorbis) { + this.currentTrack.info.codec = 'vorbis'; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + } else if (codecIdWithoutSuffix === (0, _ebmlJs.CODEC_STRING_MAP).flac) { + this.currentTrack.info.codec = 'flac'; + this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate; + } else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') { + if (this.currentTrack.info.bitDepth === 8) this.currentTrack.info.codec = 'pcm-u8'; + else if (this.currentTrack.info.bitDepth === 16) this.currentTrack.info.codec = 'pcm-s16'; + else if (this.currentTrack.info.bitDepth === 24) this.currentTrack.info.codec = 'pcm-s24'; + else if (this.currentTrack.info.bitDepth === 32) this.currentTrack.info.codec = 'pcm-s32'; + } else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') { + if (this.currentTrack.info.bitDepth === 8) this.currentTrack.info.codec = 'pcm-u8'; + else if (this.currentTrack.info.bitDepth === 16) this.currentTrack.info.codec = 'pcm-s16be'; + else if (this.currentTrack.info.bitDepth === 24) this.currentTrack.info.codec = 'pcm-s24be'; + else if (this.currentTrack.info.bitDepth === 32) this.currentTrack.info.codec = 'pcm-s32be'; + } else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') { + if (this.currentTrack.info.bitDepth === 32) this.currentTrack.info.codec = 'pcm-f32'; + else if (this.currentTrack.info.bitDepth === 64) this.currentTrack.info.codec = 'pcm-f64'; + } + const audioTrack = this.currentTrack; + const inputTrack = new (0, _inputTrackJs.InputAudioTrack)(this.input, new MatroskaAudioTrackBacking(audioTrack)); + this.currentTrack.inputTrack = inputTrack; + this.currentSegment.tracks.push(this.currentTrack); + } + } + this.currentTrack = null; + break; + case (0, _ebmlJs.EBMLId).TrackNumber: + if (!this.currentTrack) break; + this.currentTrack.id = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).TrackType: + { + if (!this.currentTrack) break; + const type = (0, _ebmlJs.readUnsignedInt)(slice, size); + if (type === 1) this.currentTrack.info = { + type: 'video', + width: -1, + height: -1, + rotation: 0, + codec: null, + codecDescription: null, + colorSpace: null, + alphaMode: false + }; + else if (type === 2) this.currentTrack.info = { + type: 'audio', + numberOfChannels: -1, + sampleRate: -1, + bitDepth: -1, + codec: null, + codecDescription: null, + aacCodecInfo: null + }; + } + break; + case (0, _ebmlJs.EBMLId).FlagEnabled: + { + if (!this.currentTrack) break; + const enabled = (0, _ebmlJs.readUnsignedInt)(slice, size); + if (!enabled) { + this.currentSegment.tracks.pop(); + this.currentTrack = null; + } + } + break; + case (0, _ebmlJs.EBMLId).FlagDefault: + if (!this.currentTrack) break; + this.currentTrack.disposition.default = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FlagForced: + if (!this.currentTrack) break; + this.currentTrack.disposition.forced = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FlagOriginal: + if (!this.currentTrack) break; + this.currentTrack.disposition.original = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FlagHearingImpaired: + if (!this.currentTrack) break; + this.currentTrack.disposition.hearingImpaired = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FlagVisualImpaired: + if (!this.currentTrack) break; + this.currentTrack.disposition.visuallyImpaired = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FlagCommentary: + if (!this.currentTrack) break; + this.currentTrack.disposition.commentary = !!(0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).CodecID: + if (!this.currentTrack) break; + this.currentTrack.codecId = (0, _ebmlJs.readAsciiString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).CodecPrivate: + if (!this.currentTrack) break; + this.currentTrack.codecPrivate = (0, _readerJs.readBytes)(slice, size); + break; + case (0, _ebmlJs.EBMLId).DefaultDuration: + if (!this.currentTrack) break; + this.currentTrack.defaultDuration = this.currentTrack.segment.timestampFactor * (0, _ebmlJs.readUnsignedInt)(slice, size) / 1e9; + break; + case (0, _ebmlJs.EBMLId).Name: + if (!this.currentTrack) break; + this.currentTrack.name = (0, _ebmlJs.readUnicodeString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).Language: + if (!this.currentTrack) break; + if (this.currentTrack.languageCode !== (0, _miscJs.UNDETERMINED_LANGUAGE)) break; + this.currentTrack.languageCode = (0, _ebmlJs.readAsciiString)(slice, size); + if (!(0, _miscJs.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)) this.currentTrack.languageCode = (0, _miscJs.UNDETERMINED_LANGUAGE); + break; + case (0, _ebmlJs.EBMLId).LanguageBCP47: + { + if (!this.currentTrack) break; + const bcp47 = (0, _ebmlJs.readAsciiString)(slice, size); + const languageSubtag = bcp47.split('-')[0]; + if (languageSubtag) // Technically invalid, for now: The language subtag might be a language code from ISO 639-1, + // ISO 639-2, ISO 639-3, ISO 639-5 or some other thing (source: Wikipedia). But, `languageCode` is + // documented as ISO 639-2. Changing the definition would be a breaking change. This will get + // cleaned up in the future by defining languageCode to be BCP 47 instead. + this.currentTrack.languageCode = languageSubtag; + else this.currentTrack.languageCode = (0, _miscJs.UNDETERMINED_LANGUAGE); + } + break; + case (0, _ebmlJs.EBMLId).Video: + if (this.currentTrack?.info?.type !== 'video') break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).PixelWidth: + if (this.currentTrack?.info?.type !== 'video') break; + this.currentTrack.info.width = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).PixelHeight: + if (this.currentTrack?.info?.type !== 'video') break; + this.currentTrack.info.height = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).AlphaMode: + if (this.currentTrack?.info?.type !== 'video') break; + this.currentTrack.info.alphaMode = (0, _ebmlJs.readUnsignedInt)(slice, size) === 1; + break; + case (0, _ebmlJs.EBMLId).Colour: + if (this.currentTrack?.info?.type !== 'video') break; + this.currentTrack.info.colorSpace = {}; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).MatrixCoefficients: + { + if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace) break; + const matrixCoefficients = (0, _ebmlJs.readUnsignedInt)(slice, size); + const mapped = (0, _miscJs.MATRIX_COEFFICIENTS_MAP_INVERSE)[matrixCoefficients] ?? null; + this.currentTrack.info.colorSpace.matrix = mapped; + } + break; + case (0, _ebmlJs.EBMLId).Range: + if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace) break; + this.currentTrack.info.colorSpace.fullRange = (0, _ebmlJs.readUnsignedInt)(slice, size) === 2; + break; + case (0, _ebmlJs.EBMLId).TransferCharacteristics: + { + if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace) break; + const transferCharacteristics = (0, _ebmlJs.readUnsignedInt)(slice, size); + const mapped = (0, _miscJs.TRANSFER_CHARACTERISTICS_MAP_INVERSE)[transferCharacteristics] ?? null; + this.currentTrack.info.colorSpace.transfer = mapped; + } + break; + case (0, _ebmlJs.EBMLId).Primaries: + { + if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace) break; + const primaries = (0, _ebmlJs.readUnsignedInt)(slice, size); + const mapped = (0, _miscJs.COLOR_PRIMARIES_MAP_INVERSE)[primaries] ?? null; + this.currentTrack.info.colorSpace.primaries = mapped; + } + break; + case (0, _ebmlJs.EBMLId).Projection: + if (this.currentTrack?.info?.type !== 'video') break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).ProjectionPoseRoll: + { + if (this.currentTrack?.info?.type !== 'video') break; + const rotation = (0, _ebmlJs.readFloat)(slice, size); + const flippedRotation = -rotation; // Convert counter-clockwise to clockwise + try { + this.currentTrack.info.rotation = (0, _miscJs.normalizeRotation)(flippedRotation); + } catch { + // It wasn't a valid rotation + } + } + break; + case (0, _ebmlJs.EBMLId).Audio: + if (this.currentTrack?.info?.type !== 'audio') break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).SamplingFrequency: + if (this.currentTrack?.info?.type !== 'audio') break; + this.currentTrack.info.sampleRate = (0, _ebmlJs.readFloat)(slice, size); + break; + case (0, _ebmlJs.EBMLId).Channels: + if (this.currentTrack?.info?.type !== 'audio') break; + this.currentTrack.info.numberOfChannels = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).BitDepth: + if (this.currentTrack?.info?.type !== 'audio') break; + this.currentTrack.info.bitDepth = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).CuePoint: + if (!this.currentSegment) break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + this.currentCueTime = null; + break; + case (0, _ebmlJs.EBMLId).CueTime: + this.currentCueTime = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).CueTrackPositions: + { + if (this.currentCueTime === null) break; + (0, _miscJs.assert)(this.currentSegment); + const cuePoint = { + time: this.currentCueTime, + trackId: -1, + clusterPosition: -1 + }; + this.currentSegment.cuePoints.push(cuePoint); + this.readContiguousElements(slice.slice(dataStartPos, size)); + if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) this.currentSegment.cuePoints.pop(); + } + break; + case (0, _ebmlJs.EBMLId).CueTrack: + { + const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1]; + if (!lastCuePoint) break; + lastCuePoint.trackId = (0, _ebmlJs.readUnsignedInt)(slice, size); + } + break; + case (0, _ebmlJs.EBMLId).CueClusterPosition: + { + const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1]; + if (!lastCuePoint) break; + (0, _miscJs.assert)(this.currentSegment); + lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + (0, _ebmlJs.readUnsignedInt)(slice, size); + } + break; + case (0, _ebmlJs.EBMLId).Timestamp: + if (!this.currentCluster) break; + this.currentCluster.timestamp = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).SimpleBlock: + { + if (!this.currentCluster) break; + const trackNumber = (0, _ebmlJs.readVarInt)(slice); + if (trackNumber === null) break; + const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber); + if (!trackData) break; // Not a track we care about + const relativeTimestamp = (0, _readerJs.readI16Be)(slice); + const flags = (0, _readerJs.readU8)(slice); + const lacing = flags >> 1 & 0x3; // If the block is laced, we'll expand it later + let isKeyFrame = !!(flags & 0x80); + if (trackData.track.info?.type === 'audio' && trackData.track.info.codec) // Some files don't mark their audio packets as key packets (I'm looking at you, Firefox). But, we + // can fix this in most cases: if we recognize the codec of the track, then we know every packet is + // necessarily a key packet, no matter what the container says. + // https://github.com/Vanilagy/mediabunny/issues/192 + isKeyFrame = true; + const blockData = (0, _readerJs.readBytes)(slice, size - (slice.filePos - dataStartPos)); + const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0; + trackData.blocks.push({ + timestamp: relativeTimestamp, + duration: 0, + isKeyFrame, + data: blockData, + lacing, + decoded: !hasDecodingInstructions, + mainAdditional: null + }); + } + break; + case (0, _ebmlJs.EBMLId).BlockGroup: + if (!this.currentCluster) break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + this.currentBlock = null; + break; + case (0, _ebmlJs.EBMLId).Block: + { + if (!this.currentCluster) break; + const trackNumber = (0, _ebmlJs.readVarInt)(slice); + if (trackNumber === null) break; + const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber); + if (!trackData) break; + const relativeTimestamp = (0, _readerJs.readI16Be)(slice); + const flags = (0, _readerJs.readU8)(slice); + const lacing = flags >> 1 & 0x3; // If the block is laced, we'll expand it later + const blockData = (0, _readerJs.readBytes)(slice, size - (slice.filePos - dataStartPos)); + const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0; + this.currentBlock = { + timestamp: relativeTimestamp, + duration: 0, + isKeyFrame: true, + data: blockData, + lacing, + decoded: !hasDecodingInstructions, + mainAdditional: null + }; + trackData.blocks.push(this.currentBlock); + } + break; + case (0, _ebmlJs.EBMLId).BlockAdditions: + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).BlockMore: + if (!this.currentBlock) break; + this.currentBlockAdditional = { + addId: 1, + data: null + }; + this.readContiguousElements(slice.slice(dataStartPos, size)); + if (this.currentBlockAdditional.data && this.currentBlockAdditional.addId === 1) this.currentBlock.mainAdditional = this.currentBlockAdditional.data; + this.currentBlockAdditional = null; + break; + case (0, _ebmlJs.EBMLId).BlockAdditional: + if (!this.currentBlockAdditional) break; + this.currentBlockAdditional.data = (0, _readerJs.readBytes)(slice, size); + break; + case (0, _ebmlJs.EBMLId).BlockAddID: + if (!this.currentBlockAdditional) break; + this.currentBlockAdditional.addId = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).BlockDuration: + if (!this.currentBlock) break; + this.currentBlock.duration = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ReferenceBlock: + if (!this.currentBlock) break; + this.currentBlock.isKeyFrame = false; + break; + case (0, _ebmlJs.EBMLId).Tag: + this.currentTagTargetIsMovie = true; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).Targets: + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).TargetTypeValue: + { + const targetTypeValue = (0, _ebmlJs.readUnsignedInt)(slice, size); + if (targetTypeValue !== 50) this.currentTagTargetIsMovie = false; + } + break; + case (0, _ebmlJs.EBMLId).TagTrackUID: + case (0, _ebmlJs.EBMLId).TagEditionUID: + case (0, _ebmlJs.EBMLId).TagChapterUID: + case (0, _ebmlJs.EBMLId).TagAttachmentUID: + this.currentTagTargetIsMovie = false; + break; + case (0, _ebmlJs.EBMLId).SimpleTag: + if (!this.currentTagTargetIsMovie) break; + this.currentSimpleTagName = null; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).TagName: + this.currentSimpleTagName = (0, _ebmlJs.readUnicodeString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).TagString: + { + if (!this.currentSimpleTagName) break; + const value = (0, _ebmlJs.readUnicodeString)(slice, size); + this.processTagValue(this.currentSimpleTagName, value); + } + break; + case (0, _ebmlJs.EBMLId).TagBinary: + { + if (!this.currentSimpleTagName) break; + const value = (0, _readerJs.readBytes)(slice, size); + this.processTagValue(this.currentSimpleTagName, value); + } + break; + case (0, _ebmlJs.EBMLId).AttachedFile: + { + if (!this.currentSegment) break; + this.currentAttachedFile = { + fileUid: null, + fileName: null, + fileMediaType: null, + fileData: null, + fileDescription: null + }; + this.readContiguousElements(slice.slice(dataStartPos, size)); + const tags = this.currentSegment.metadataTags; + if (this.currentAttachedFile.fileUid && this.currentAttachedFile.fileData) { + // All attached files get surfaced in the `raw` metadata tags + tags.raw ??= {}; + tags.raw[this.currentAttachedFile.fileUid.toString()] = new (0, _metadataJs.AttachedFile)(this.currentAttachedFile.fileData, this.currentAttachedFile.fileMediaType ?? undefined, this.currentAttachedFile.fileName ?? undefined, this.currentAttachedFile.fileDescription ?? undefined); + } + // Only process image attachments + if (this.currentAttachedFile.fileMediaType?.startsWith('image/') && this.currentAttachedFile.fileData) { + const fileName = this.currentAttachedFile.fileName; + let kind = 'unknown'; + if (fileName) { + const lowerName = fileName.toLowerCase(); + if (lowerName.startsWith('cover.')) kind = 'coverFront'; + else if (lowerName.startsWith('back.')) kind = 'coverBack'; + } + tags.images ??= []; + tags.images.push({ + data: this.currentAttachedFile.fileData, + mimeType: this.currentAttachedFile.fileMediaType, + kind, + name: this.currentAttachedFile.fileName ?? undefined, + description: this.currentAttachedFile.fileDescription ?? undefined + }); + } + this.currentAttachedFile = null; + } + break; + case (0, _ebmlJs.EBMLId).FileUID: + if (!this.currentAttachedFile) break; + this.currentAttachedFile.fileUid = (0, _ebmlJs.readUnsignedBigInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FileName: + if (!this.currentAttachedFile) break; + this.currentAttachedFile.fileName = (0, _ebmlJs.readUnicodeString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FileMediaType: + if (!this.currentAttachedFile) break; + this.currentAttachedFile.fileMediaType = (0, _ebmlJs.readAsciiString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FileData: + if (!this.currentAttachedFile) break; + this.currentAttachedFile.fileData = (0, _readerJs.readBytes)(slice, size); + break; + case (0, _ebmlJs.EBMLId).FileDescription: + if (!this.currentAttachedFile) break; + this.currentAttachedFile.fileDescription = (0, _ebmlJs.readUnicodeString)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ContentEncodings: + if (!this.currentTrack) break; + this.readContiguousElements(slice.slice(dataStartPos, size)); + // "**MUST** start with the `ContentEncoding` with the highest `ContentEncodingOrder`" + this.currentTrack.decodingInstructions.sort((a, b)=>b.order - a.order); + break; + case (0, _ebmlJs.EBMLId).ContentEncoding: + this.currentDecodingInstruction = { + order: 0, + scope: ContentEncodingScope.Block, + data: null + }; + this.readContiguousElements(slice.slice(dataStartPos, size)); + if (this.currentDecodingInstruction.data) this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction); + this.currentDecodingInstruction = null; + break; + case (0, _ebmlJs.EBMLId).ContentEncodingOrder: + if (!this.currentDecodingInstruction) break; + this.currentDecodingInstruction.order = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ContentEncodingScope: + if (!this.currentDecodingInstruction) break; + this.currentDecodingInstruction.scope = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ContentCompression: + if (!this.currentDecodingInstruction) break; + this.currentDecodingInstruction.data = { + type: 'decompress', + algorithm: ContentCompAlgo.Zlib, + settings: null + }; + this.readContiguousElements(slice.slice(dataStartPos, size)); + break; + case (0, _ebmlJs.EBMLId).ContentCompAlgo: + if (this.currentDecodingInstruction?.data?.type !== 'decompress') break; + this.currentDecodingInstruction.data.algorithm = (0, _ebmlJs.readUnsignedInt)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ContentCompSettings: + if (this.currentDecodingInstruction?.data?.type !== 'decompress') break; + this.currentDecodingInstruction.data.settings = (0, _readerJs.readBytes)(slice, size); + break; + case (0, _ebmlJs.EBMLId).ContentEncryption: + if (!this.currentDecodingInstruction) break; + this.currentDecodingInstruction.data = { + type: 'decrypt' + }; + break; + } + slice.filePos = dataStartPos + size; + return true; + } + decodeBlockData(track, rawData) { + (0, _miscJs.assert)(track.decodingInstructions.length > 0); // This method shouldn't be called otherwise + let currentData = rawData; + for (const instruction of track.decodingInstructions){ + (0, _miscJs.assert)(instruction.data); + switch(instruction.data.type){ + case 'decompress': + switch(instruction.data.algorithm){ + case ContentCompAlgo.HeaderStripping: + if (instruction.data.settings && instruction.data.settings.length > 0) { + const prefix = instruction.data.settings; + const newData = new Uint8Array(prefix.length + currentData.length); + newData.set(prefix, 0); + newData.set(currentData, prefix.length); + currentData = newData; + } + break; + default: + } + break; + default: + } + } + return currentData; + } + processTagValue(name, value) { + if (!this.currentSegment?.metadataTags) return; + const metadataTags = this.currentSegment.metadataTags; + metadataTags.raw ??= {}; + metadataTags.raw[name] ??= value; + if (typeof value === 'string') switch(name.toLowerCase()){ + case 'title': + metadataTags.title ??= value; + break; + case 'description': + metadataTags.description ??= value; + break; + case 'artist': + metadataTags.artist ??= value; + break; + case 'album': + metadataTags.album ??= value; + break; + case 'album_artist': + metadataTags.albumArtist ??= value; + break; + case 'genre': + metadataTags.genre ??= value; + break; + case 'comment': + metadataTags.comment ??= value; + break; + case 'lyrics': + metadataTags.lyrics ??= value; + break; + case 'date': + { + const date = new Date(value); + if (!Number.isNaN(date.getTime())) metadataTags.date ??= date; + } + break; + case 'track_number': + case 'part_number': + { + const parts = value.split('/'); + const trackNum = Number.parseInt(parts[0], 10); + const tracksTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(trackNum) && trackNum > 0) metadataTags.trackNumber ??= trackNum; + if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'disc_number': + case 'disc': + { + const discParts = value.split('/'); + const discNum = Number.parseInt(discParts[0], 10); + const discsTotal = discParts[1] && Number.parseInt(discParts[1], 10); + if (Number.isInteger(discNum) && discNum > 0) metadataTags.discNumber ??= discNum; + if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) metadataTags.discsTotal ??= discsTotal; + } + break; + } + } +} +class MatroskaTrackBacking { + constructor(internalTrack){ + this.internalTrack = internalTrack; + this.packetToClusterLocation = new WeakMap(); + } + getId() { + return this.internalTrack.id; + } + getCodec() { + throw new Error('Not implemented on base class.'); + } + getInternalCodecId() { + return this.internalTrack.codecId; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + getName() { + return this.internalTrack.name; + } + getLanguageCode() { + return this.internalTrack.languageCode; + } + async getFirstTimestamp() { + const firstPacket = await this.getFirstPacket({ + metadataOnly: true + }); + return firstPacket?.timestamp ?? 0; + } + getTimeResolution() { + return this.internalTrack.segment.timestampFactor; + } + getDisposition() { + return this.internalTrack.disposition; + } + async getFirstPacket(options) { + return this.performClusterLookup(null, (cluster)=>{ + const trackData = cluster.trackData.get(this.internalTrack.id); + if (trackData) return { + blockIndex: 0, + correctBlockFound: true + }; + return { + blockIndex: -1, + correctBlockFound: false + }; + }, -Infinity, Infinity, options); + } + intoTimescale(timestamp) { + // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely + // that the number was originally an integer divided by the timescale. For stability, it's best + // to return the integer in this case. + return (0, _miscJs.roundIfAlmostInteger)(timestamp * this.internalTrack.segment.timestampFactor); + } + async getPacket(timestamp, options) { + const timestampInTimescale = this.intoTimescale(timestamp); + return this.performClusterLookup(null, (cluster)=>{ + const trackData = cluster.trackData.get(this.internalTrack.id); + if (!trackData) return { + blockIndex: -1, + correctBlockFound: false + }; + const index = (0, _miscJs.binarySearchLessOrEqual)(trackData.presentationTimestamps, timestampInTimescale, (x)=>x.timestamp); + const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1; + const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp; + return { + blockIndex, + correctBlockFound + }; + }, timestampInTimescale, timestampInTimescale, options); + } + async getNextPacket(packet, options) { + const locationInCluster = this.packetToClusterLocation.get(packet); + if (locationInCluster === undefined) throw new Error('Packet was not created from this track.'); + return this.performClusterLookup(locationInCluster.cluster, (cluster)=>{ + if (cluster === locationInCluster.cluster) { + const trackData = cluster.trackData.get(this.internalTrack.id); + if (locationInCluster.blockIndex + 1 < trackData.blocks.length) // We can simply take the next block in the cluster + return { + blockIndex: locationInCluster.blockIndex + 1, + correctBlockFound: true + }; + } else { + const trackData = cluster.trackData.get(this.internalTrack.id); + if (trackData) return { + blockIndex: 0, + correctBlockFound: true + }; + } + return { + blockIndex: -1, + correctBlockFound: false + }; + }, -Infinity, Infinity, options); + } + async getKeyPacket(timestamp, options) { + const timestampInTimescale = this.intoTimescale(timestamp); + return this.performClusterLookup(null, (cluster)=>{ + const trackData = cluster.trackData.get(this.internalTrack.id); + if (!trackData) return { + blockIndex: -1, + correctBlockFound: false + }; + const index = (0, _miscJs.findLastIndex)(trackData.presentationTimestamps, (x)=>{ + const block = trackData.blocks[x.blockIndex]; + return block.isKeyFrame && x.timestamp <= timestampInTimescale; + }); + const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1; + const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp; + return { + blockIndex, + correctBlockFound + }; + }, timestampInTimescale, timestampInTimescale, options); + } + async getNextKeyPacket(packet, options) { + const locationInCluster = this.packetToClusterLocation.get(packet); + if (locationInCluster === undefined) throw new Error('Packet was not created from this track.'); + return this.performClusterLookup(locationInCluster.cluster, (cluster)=>{ + if (cluster === locationInCluster.cluster) { + const trackData = cluster.trackData.get(this.internalTrack.id); + const nextKeyFrameIndex = trackData.blocks.findIndex((x, i)=>x.isKeyFrame && i > locationInCluster.blockIndex); + if (nextKeyFrameIndex !== -1) // We can simply take the next key frame in the cluster + return { + blockIndex: nextKeyFrameIndex, + correctBlockFound: true + }; + } else { + const trackData = cluster.trackData.get(this.internalTrack.id); + if (trackData && trackData.firstKeyFrameTimestamp !== null) { + const keyFrameIndex = trackData.blocks.findIndex((x)=>x.isKeyFrame); + (0, _miscJs.assert)(keyFrameIndex !== -1); // There must be one + return { + blockIndex: keyFrameIndex, + correctBlockFound: true + }; + } + } + return { + blockIndex: -1, + correctBlockFound: false + }; + }, -Infinity, Infinity, options); + } + async fetchPacketInCluster(cluster, blockIndex, options) { + if (blockIndex === -1) return null; + const trackData = cluster.trackData.get(this.internalTrack.id); + const block = trackData.blocks[blockIndex]; + (0, _miscJs.assert)(block); + // Perform lazy decoding if needed + if (!block.decoded) { + block.data = this.internalTrack.demuxer.decodeBlockData(this.internalTrack, block.data); + block.decoded = true; + } + const data = options.metadataOnly ? (0, _packetJs.PLACEHOLDER_DATA) : block.data; + const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor; + const duration = block.duration / this.internalTrack.segment.timestampFactor; + const sideData = {}; + if (block.mainAdditional && this.internalTrack.info?.type === 'video' && this.internalTrack.info.alphaMode) { + sideData.alpha = options.metadataOnly ? (0, _packetJs.PLACEHOLDER_DATA) : block.mainAdditional; + sideData.alphaByteLength = block.mainAdditional.byteLength; + } + const packet = new (0, _packetJs.EncodedPacket)(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength, sideData); + this.packetToClusterLocation.set(packet, { + cluster, + blockIndex + }); + return packet; + } + /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */ async performClusterLookup(// The cluster where we start looking + startCluster, // This function returns the best-matching block in a given cluster + getMatchInCluster, // The timestamp with which we can search the lookup table + searchTimestamp, // The timestamp for which we know the correct block will not come after it + latestTimestamp, options) { + const { demuxer, segment } = this.internalTrack; + let currentCluster = null; + let bestCluster = null; + let bestBlockIndex = -1; + if (startCluster) { + const { blockIndex, correctBlockFound } = getMatchInCluster(startCluster); + if (correctBlockFound) return this.fetchPacketInCluster(startCluster, blockIndex, options); + if (blockIndex !== -1) { + bestCluster = startCluster; + bestBlockIndex = blockIndex; + } + } + // Search for a cue point; this way, we won't need to start searching from the start of the file + // but can jump right into the correct cluster (or at least nearby). + const cuePointIndex = (0, _miscJs.binarySearchLessOrEqual)(this.internalTrack.cuePoints, searchTimestamp, (x)=>x.time); + const cuePoint = cuePointIndex !== -1 ? this.internalTrack.cuePoints[cuePointIndex] : null; + // Also check the position cache + const positionCacheIndex = (0, _miscJs.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache, searchTimestamp, (x)=>x.startTimestamp); + const positionCacheEntry = positionCacheIndex !== -1 ? this.internalTrack.clusterPositionCache[positionCacheIndex] : null; + const lookupEntryPosition = Math.max(cuePoint?.clusterPosition ?? 0, positionCacheEntry?.elementStartPos ?? 0) || null; + let currentPos; + if (!startCluster) currentPos = lookupEntryPosition ?? segment.clusterSeekStartPos; + else if (lookupEntryPosition === null || startCluster.elementStartPos >= lookupEntryPosition) { + currentPos = startCluster.elementEndPos; + currentCluster = startCluster; + } else // Use the lookup entry + currentPos = lookupEntryPosition; + while(segment.elementEndPos === null || currentPos <= segment.elementEndPos - (0, _ebmlJs.MIN_HEADER_SIZE)){ + if (currentCluster) { + const trackData = currentCluster.trackData.get(this.internalTrack.id); + if (trackData && trackData.startTimestamp > latestTimestamp) break; + } + // Load the header + let slice = demuxer.reader.requestSliceRange(currentPos, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const elementStartPos = currentPos; + const elementHeader = (0, _ebmlJs.readElementHeader)(slice); + if (!elementHeader || !(0, _ebmlJs.LEVEL_1_EBML_IDS).includes(elementHeader.id) && elementHeader.id !== (0, _ebmlJs.EBMLId).Void) { + // There's an element here that shouldn't be here. Might be garbage. In this case, let's + // try and resync to the next valid element. + const nextPos = await (0, _ebmlJs.resync)(demuxer.reader, elementStartPos, (0, _ebmlJs.LEVEL_1_EBML_IDS), Math.min(segment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH)); + if (nextPos) { + currentPos = nextPos; + continue; + } else break; // Resync failed + } + const id = elementHeader.id; + let size = elementHeader.size; + const dataStartPos = slice.filePos; + if (id === (0, _ebmlJs.EBMLId).Cluster) { + currentCluster = await demuxer.readCluster(elementStartPos, segment); + // readCluster computes the proper size even if it's undefined in the header, so let's use that instead + size = currentCluster.elementEndPos - dataStartPos; + const { blockIndex, correctBlockFound } = getMatchInCluster(currentCluster); + if (correctBlockFound) return this.fetchPacketInCluster(currentCluster, blockIndex, options); + if (blockIndex !== -1) { + bestCluster = currentCluster; + bestBlockIndex = blockIndex; + } + } + if (size === null) { + // Undefined element size (can happen in livestreamed files). In this case, we need to do some + // searching to determine the actual size of the element. + (0, _miscJs.assert)(id !== (0, _ebmlJs.EBMLId).Cluster); // Undefined cluster sizes are fixed further up + // Search for the next element at level 0 or 1 + const nextElementPos = await (0, _ebmlJs.searchForNextElementId)(demuxer.reader, dataStartPos, (0, _ebmlJs.LEVEL_0_AND_1_EBML_IDS), segment.elementEndPos); + size = nextElementPos.pos - dataStartPos; + } + const endPos = dataStartPos + size; + if (segment.elementEndPos === null) { + // Check the next element. If it's a new segment, we know this segment ends here. The new + // segment is just ignored, since we're likely in a livestreamed file and thus only care about + // the first segment. + let slice = demuxer.reader.requestSliceRange(endPos, (0, _ebmlJs.MIN_HEADER_SIZE), (0, _ebmlJs.MAX_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const elementId = (0, _ebmlJs.readElementId)(slice); + if (elementId === (0, _ebmlJs.EBMLId).Segment) { + segment.elementEndPos = endPos; // We now know the segment's size + break; + } + } + currentPos = endPos; + } + // Catch faulty cue points + if (cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) { + // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this + // case, let's search again but using the cue point before that. + const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1]; + (0, _miscJs.assert)(!previousCuePoint || previousCuePoint.time < cuePoint.time); + const newSearchTimestamp = previousCuePoint?.time ?? -Infinity; + return this.performClusterLookup(null, getMatchInCluster, newSearchTimestamp, latestTimestamp, options); + } + if (bestCluster) // If we finished looping but didn't find a perfect match, still return the best match we found + return this.fetchPacketInCluster(bestCluster, bestBlockIndex, options); + return null; + } +} +class MatroskaVideoTrackBacking extends MatroskaTrackBacking { + constructor(internalTrack){ + super(internalTrack); + this.decoderConfigPromise = null; + this.internalTrack = internalTrack; + } + getCodec() { + return this.internalTrack.info.codec; + } + getCodedWidth() { + return this.internalTrack.info.width; + } + getCodedHeight() { + return this.internalTrack.info.height; + } + getRotation() { + return this.internalTrack.info.rotation; + } + async getColorSpace() { + return { + primaries: this.internalTrack.info.colorSpace?.primaries, + transfer: this.internalTrack.info.colorSpace?.transfer, + matrix: this.internalTrack.info.colorSpace?.matrix, + fullRange: this.internalTrack.info.colorSpace?.fullRange + }; + } + async canBeTransparent() { + return this.internalTrack.info.alphaMode; + } + async getDecoderConfig() { + if (!this.internalTrack.info.codec) return null; + return this.decoderConfigPromise ??= (async ()=>{ + let firstPacket = null; + const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9' || this.internalTrack.info.codec === 'av1' || this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription || this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription; + if (needsPacketForAdditionalInfo) firstPacket = await this.getFirstPacket({}); + return { + codec: (0, _codecJs.extractVideoCodecString)({ + width: this.internalTrack.info.width, + height: this.internalTrack.info.height, + codec: this.internalTrack.info.codec, + codecDescription: this.internalTrack.info.codecDescription, + colorSpace: this.internalTrack.info.colorSpace, + avcType: 1, + avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket ? (0, _codecDataJs.extractAvcDecoderConfigurationRecord)(firstPacket.data) : null, + hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket ? (0, _codecDataJs.extractHevcDecoderConfigurationRecord)(firstPacket.data) : null, + vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket ? (0, _codecDataJs.extractVp9CodecInfoFromPacket)(firstPacket.data) : null, + av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket ? (0, _codecDataJs.extractAv1CodecInfoFromPacket)(firstPacket.data) : null + }), + codedWidth: this.internalTrack.info.width, + codedHeight: this.internalTrack.info.height, + description: this.internalTrack.info.codecDescription ?? undefined, + colorSpace: this.internalTrack.info.colorSpace ?? undefined + }; + })(); + } +} +class MatroskaAudioTrackBacking extends MatroskaTrackBacking { + constructor(internalTrack){ + super(internalTrack); + this.decoderConfig = null; + this.internalTrack = internalTrack; + } + getCodec() { + return this.internalTrack.info.codec; + } + getNumberOfChannels() { + return this.internalTrack.info.numberOfChannels; + } + getSampleRate() { + return this.internalTrack.info.sampleRate; + } + async getDecoderConfig() { + if (!this.internalTrack.info.codec) return null; + return this.decoderConfig ??= { + codec: (0, _codecJs.extractAudioCodecString)({ + codec: this.internalTrack.info.codec, + codecDescription: this.internalTrack.info.codecDescription, + aacCodecInfo: this.internalTrack.info.aacCodecInfo + }), + numberOfChannels: this.internalTrack.info.numberOfChannels, + sampleRate: this.internalTrack.info.sampleRate, + description: this.internalTrack.info.codecDescription ?? undefined + }; + } +} + +},{"../codec-data.js":"bzpVB","../codec.js":"4oSIO","../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../metadata.js":"3j8h1","../misc.js":"kkhLS","../packet.js":"esYjd","./ebml.js":"b6nkD","./matroska-misc.js":"hb3cl","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"hb3cl":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "buildMatroskaMimeType", ()=>buildMatroskaMimeType); +const buildMatroskaMimeType = (info)=>{ + const base = info.hasVideo ? 'video/' : info.hasAudio ? 'audio/' : 'application/'; + let string = base + (info.isWebM ? 'webm' : 'x-matroska'); + if (info.codecStrings.length > 0) { + const uniqueCodecMimeTypes = [ + ...new Set(info.codecStrings.filter(Boolean)) + ]; + string += `; codecs="${uniqueCodecMimeTypes.join(', ')}"`; + } + return string; +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"aMGxe":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Mp3Demuxer", ()=>Mp3Demuxer); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _metadataJs = require("../metadata.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _mp3MiscJs = require("../../shared/mp3-misc.js"); +var _id3Js = require("../id3.js"); +var _mp3ReaderJs = require("./mp3-reader.js"); +var _readerJs = require("../reader.js"); +class Mp3Demuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.metadataPromise = null; + this.firstFrameHeader = null; + this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos + this.metadataTags = null; + this.tracks = []; + this.readingMutex = new (0, _miscJs.AsyncMutex)(); + this.lastSampleLoaded = false; + this.lastLoadedPos = 0; + this.nextTimestampInSamples = 0; + this.reader = input._reader; + } + async readMetadata() { + return this.metadataPromise ??= (async ()=>{ + // Keep loading until we find the first frame header + while(!this.firstFrameHeader && !this.lastSampleLoaded)await this.advanceReader(); + if (!this.firstFrameHeader) throw new Error('No valid MP3 frame found.'); + this.tracks = [ + new (0, _inputTrackJs.InputAudioTrack)(this.input, new Mp3AudioTrackBacking(this)) + ]; + })(); + } + async advanceReader() { + if (this.lastLoadedPos === 0) // Let's skip all ID3v2 tags at the start of the file + while(true){ + let slice = this.reader.requestSlice(this.lastLoadedPos, (0, _id3Js.ID3_V2_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) { + this.lastSampleLoaded = true; + return; + } + const id3V2Header = (0, _id3Js.readId3V2Header)(slice); + if (!id3V2Header) break; + this.lastLoadedPos = slice.filePos + id3V2Header.size; + } + const result = await (0, _mp3ReaderJs.readNextFrameHeader)(this.reader, this.lastLoadedPos, this.reader.fileSize); + if (!result) { + this.lastSampleLoaded = true; + return; + } + const header = result.header; + this.lastLoadedPos = result.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short + const xingOffset = (0, _mp3MiscJs.getXingOffset)(header.mpegVersionId, header.channel); + let slice = this.reader.requestSlice(result.startPos + xingOffset, 4); + if (slice instanceof Promise) slice = await slice; + if (slice) { + const word = (0, _readerJs.readU32Be)(slice); + const isXing = word === (0, _mp3MiscJs.XING) || word === (0, _mp3MiscJs.INFO); + if (isXing) // There's no actual audio data in this frame, so let's skip it + return; + } + if (!this.firstFrameHeader) this.firstFrameHeader = header; + if (header.sampleRate !== this.firstFrameHeader.sampleRate) console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${header.sampleRate} Hz.` + ` Might be a bug, so please report this file.`); + const sampleDuration = header.audioSamplesInFrame / this.firstFrameHeader.sampleRate; + const sample = { + timestamp: this.nextTimestampInSamples / this.firstFrameHeader.sampleRate, + duration: sampleDuration, + dataStart: result.startPos, + dataSize: header.totalSize + }; + this.loadedSamples.push(sample); + this.nextTimestampInSamples += header.audioSamplesInFrame; + return; + } + async getMimeType() { + return 'audio/mpeg'; + } + async getTracks() { + await this.readMetadata(); + return this.tracks; + } + async computeDuration() { + await this.readMetadata(); + const track = this.tracks[0]; + (0, _miscJs.assert)(track); + return track.computeDuration(); + } + async getMetadataTags() { + const release = await this.readingMutex.acquire(); + try { + await this.readMetadata(); + if (this.metadataTags) return this.metadataTags; + this.metadataTags = {}; + let currentPos = 0; + let id3V2HeaderFound = false; + while(true){ + let headerSlice = this.reader.requestSlice(currentPos, (0, _id3Js.ID3_V2_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + if (!headerSlice) break; + const id3V2Header = (0, _id3Js.readId3V2Header)(headerSlice); + if (!id3V2Header) break; + id3V2HeaderFound = true; + let contentSlice = this.reader.requestSlice(headerSlice.filePos, id3V2Header.size); + if (contentSlice instanceof Promise) contentSlice = await contentSlice; + if (!contentSlice) break; + (0, _id3Js.parseId3V2Tag)(contentSlice, id3V2Header, this.metadataTags); + currentPos = headerSlice.filePos + id3V2Header.size; + } + if (!id3V2HeaderFound && this.reader.fileSize !== null && this.reader.fileSize >= (0, _id3Js.ID3_V1_TAG_SIZE)) { + // Try reading an ID3v1 tag at the end of the file + let slice = this.reader.requestSlice(this.reader.fileSize - (0, _id3Js.ID3_V1_TAG_SIZE), (0, _id3Js.ID3_V1_TAG_SIZE)); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + const tag = (0, _readerJs.readAscii)(slice, 3); + if (tag === 'TAG') (0, _id3Js.parseId3V1Tag)(slice, this.metadataTags); + } + return this.metadataTags; + } finally{ + release(); + } + } +} +class Mp3AudioTrackBacking { + constructor(demuxer){ + this.demuxer = demuxer; + } + getId() { + return 1; + } + async getFirstTimestamp() { + return 0; + } + getTimeResolution() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + getName() { + return null; + } + getLanguageCode() { + return 0, _miscJs.UNDETERMINED_LANGUAGE; + } + getCodec() { + return 'mp3'; + } + getInternalCodecId() { + return null; + } + getNumberOfChannels() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2; + } + getSampleRate() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + return this.demuxer.firstFrameHeader.sampleRate; + } + getDisposition() { + return { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }; + } + async getDecoderConfig() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + return { + codec: 'mp3', + numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2, + sampleRate: this.demuxer.firstFrameHeader.sampleRate + }; + } + async getPacketAtIndex(sampleIndex, options) { + if (sampleIndex === -1) return null; + const rawSample = this.demuxer.loadedSamples[sampleIndex]; + if (!rawSample) return null; + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; // Data didn't fit into the rest of the file + data = (0, _readerJs.readBytes)(slice, rawSample.dataSize); + } + return new (0, _packetJs.EncodedPacket)(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize); + } + getFirstPacket(options) { + return this.getPacketAtIndex(0, options); + } + async getNextPacket(packet, options) { + const release = await this.demuxer.readingMutex.acquire(); + try { + const sampleIndex = (0, _miscJs.binarySearchExact)(this.demuxer.loadedSamples, packet.timestamp, (x)=>x.timestamp); + if (sampleIndex === -1) throw new Error('Packet was not created from this track.'); + const nextIndex = sampleIndex + 1; + // Ensure the next sample exists + while(nextIndex >= this.demuxer.loadedSamples.length && !this.demuxer.lastSampleLoaded)await this.demuxer.advanceReader(); + return this.getPacketAtIndex(nextIndex, options); + } finally{ + release(); + } + } + async getPacket(timestamp, options) { + const release = await this.demuxer.readingMutex.acquire(); + try { + while(true){ + const index = (0, _miscJs.binarySearchLessOrEqual)(this.demuxer.loadedSamples, timestamp, (x)=>x.timestamp); + if (index === -1 && this.demuxer.loadedSamples.length > 0) // We're before the first sample + return null; + if (this.demuxer.lastSampleLoaded) // All data is loaded, return what we found + return this.getPacketAtIndex(index, options); + if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) // The next packet also exists, we're done + return this.getPacketAtIndex(index, options); + // Otherwise, keep loading data + await this.demuxer.advanceReader(); + } + } finally{ + release(); + } + } + getKeyPacket(timestamp, options) { + return this.getPacket(timestamp, options); + } + getNextKeyPacket(packet, options) { + return this.getNextPacket(packet, options); + } +} + +},{"../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../metadata.js":"3j8h1","../misc.js":"kkhLS","../packet.js":"esYjd","../../shared/mp3-misc.js":"k3lpY","../id3.js":"5tvk3","./mp3-reader.js":"kFP95","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"k3lpY":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "FRAME_HEADER_SIZE", ()=>FRAME_HEADER_SIZE); +parcelHelpers.export(exports, "SAMPLING_RATES", ()=>SAMPLING_RATES); +parcelHelpers.export(exports, "KILOBIT_RATES", ()=>KILOBIT_RATES); +parcelHelpers.export(exports, "XING", ()=>XING); +parcelHelpers.export(exports, "INFO", ()=>INFO); +parcelHelpers.export(exports, "computeMp3FrameSize", ()=>computeMp3FrameSize); +parcelHelpers.export(exports, "getXingOffset", ()=>getXingOffset); +parcelHelpers.export(exports, "readFrameHeader", ()=>readFrameHeader); +parcelHelpers.export(exports, "encodeSynchsafe", ()=>encodeSynchsafe); +parcelHelpers.export(exports, "decodeSynchsafe", ()=>decodeSynchsafe); +const FRAME_HEADER_SIZE = 4; +const SAMPLING_RATES = [ + 44100, + 48000, + 32000 +]; +const KILOBIT_RATES = [ + // lowSamplingFrequency === 0 + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 32, + 40, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 160, + 192, + 224, + 256, + 320, + -1, + -1, + 32, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 160, + 192, + 224, + 256, + 320, + 384, + -1, + -1, + 32, + 64, + 96, + 128, + 160, + 192, + 224, + 256, + 288, + 320, + 352, + 384, + 416, + 448, + -1, + // lowSamplingFrequency === 1 + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 8, + 16, + 24, + 32, + 40, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 144, + 160, + -1, + -1, + 8, + 16, + 24, + 32, + 40, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 144, + 160, + -1, + -1, + 32, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 144, + 160, + 176, + 192, + 224, + 256, + -1 +]; +const XING = 0x58696e67; +const INFO = 0x496e666f; +const computeMp3FrameSize = (lowSamplingFrequency, layer, bitrate, sampleRate, padding)=>{ + if (layer === 0) return 0; // Not expected that this is hit + else if (layer === 1) return Math.floor(144 * bitrate / (sampleRate << lowSamplingFrequency)) + padding; + else if (layer === 2) return Math.floor(144 * bitrate / sampleRate) + padding; + else return (Math.floor(12 * bitrate / sampleRate) + padding) * 4; +}; +const getXingOffset = (mpegVersionId, channel)=>{ + return mpegVersionId === 3 ? channel === 3 ? 21 : 36 : channel === 3 ? 13 : 21; +}; +const readFrameHeader = (word, remainingBytes)=>{ + const firstByte = word >>> 24; + const secondByte = word >>> 16 & 0xff; + const thirdByte = word >>> 8 & 0xff; + const fourthByte = word & 0xff; + if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) return { + header: null, + bytesAdvanced: 4 + }; + if (firstByte !== 0xff) return { + header: null, + bytesAdvanced: 1 + }; + if ((secondByte & 0xe0) !== 0xe0) return { + header: null, + bytesAdvanced: 1 + }; + let lowSamplingFrequency = 0; + let mpeg25 = 0; + if (secondByte & 16) lowSamplingFrequency = secondByte & 8 ? 0 : 1; + else { + lowSamplingFrequency = 1; + mpeg25 = 1; + } + const mpegVersionId = secondByte >> 3 & 0x3; + const layer = secondByte >> 1 & 0x3; + const bitrateIndex = thirdByte >> 4 & 0xf; + const frequencyIndex = (thirdByte >> 2 & 0x3) % 3; + const padding = thirdByte >> 1 & 0x1; + const channel = fourthByte >> 6 & 0x3; + const modeExtension = fourthByte >> 4 & 0x3; + const copyright = fourthByte >> 3 & 0x1; + const original = fourthByte >> 2 & 0x1; + const emphasis = fourthByte & 0x3; + const kilobitRate = KILOBIT_RATES[lowSamplingFrequency * 64 + layer * 16 + bitrateIndex]; + if (kilobitRate === -1) return { + header: null, + bytesAdvanced: 1 + }; + const bitrate = kilobitRate * 1000; + const sampleRate = SAMPLING_RATES[frequencyIndex] >> lowSamplingFrequency + mpeg25; + const frameLength = computeMp3FrameSize(lowSamplingFrequency, layer, bitrate, sampleRate, padding); + if (remainingBytes !== null && remainingBytes < frameLength) // The frame doesn't fit into the rest of the file + return { + header: null, + bytesAdvanced: 1 + }; + let audioSamplesInFrame; + if (mpegVersionId === 3) audioSamplesInFrame = layer === 3 ? 384 : 1152; + else { + if (layer === 3) audioSamplesInFrame = 384; + else if (layer === 2) audioSamplesInFrame = 1152; + else audioSamplesInFrame = 576; + } + return { + header: { + totalSize: frameLength, + mpegVersionId, + layer, + bitrate, + frequencyIndex, + sampleRate, + channel, + modeExtension, + copyright, + original, + emphasis, + audioSamplesInFrame + }, + bytesAdvanced: 1 + }; +}; +const encodeSynchsafe = (unsynchsafed)=>{ + let mask = 0x7f; + let synchsafed = 0; + let unsynchsafedRest = unsynchsafed; + while((mask ^ 0x7fffffff) !== 0){ + synchsafed = unsynchsafedRest & ~mask; + synchsafed <<= 1; + synchsafed |= unsynchsafedRest & mask; + mask = (mask + 1 << 8) - 1; + unsynchsafedRest = synchsafed; + } + return synchsafed; +}; +const decodeSynchsafe = (synchsafed)=>{ + let mask = 0x7f000000; + let unsynchsafed = 0; + while(mask !== 0){ + unsynchsafed >>= 1; + unsynchsafed |= synchsafed & mask; + mask >>= 8; + } + return unsynchsafed; +}; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"5tvk3":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Id3V2HeaderFlags", ()=>Id3V2HeaderFlags); +parcelHelpers.export(exports, "Id3V2TextEncoding", ()=>Id3V2TextEncoding); +parcelHelpers.export(exports, "ID3_V1_TAG_SIZE", ()=>ID3_V1_TAG_SIZE); +parcelHelpers.export(exports, "ID3_V2_HEADER_SIZE", ()=>ID3_V2_HEADER_SIZE); +parcelHelpers.export(exports, "ID3_V1_GENRES", ()=>ID3_V1_GENRES); +parcelHelpers.export(exports, "parseId3V1Tag", ()=>parseId3V1Tag); +parcelHelpers.export(exports, "readId3V1String", ()=>readId3V1String); +parcelHelpers.export(exports, "readId3V2Header", ()=>readId3V2Header); +parcelHelpers.export(exports, "parseId3V2Tag", ()=>parseId3V2Tag); +// https://id3.org/id3v2.3.0 +parcelHelpers.export(exports, "Id3V2Reader", ()=>Id3V2Reader); +parcelHelpers.export(exports, "Id3V2Writer", ()=>Id3V2Writer); +var _mp3MiscJs = require("../shared/mp3-misc.js"); +var _miscJs = require("./misc.js"); +var _readerJs = require("./reader.js"); +var Id3V2HeaderFlags; +(function(Id3V2HeaderFlags) { + Id3V2HeaderFlags[Id3V2HeaderFlags["Unsynchronisation"] = 128] = "Unsynchronisation"; + Id3V2HeaderFlags[Id3V2HeaderFlags["ExtendedHeader"] = 64] = "ExtendedHeader"; + Id3V2HeaderFlags[Id3V2HeaderFlags["ExperimentalIndicator"] = 32] = "ExperimentalIndicator"; + Id3V2HeaderFlags[Id3V2HeaderFlags["Footer"] = 16] = "Footer"; +})(Id3V2HeaderFlags || (Id3V2HeaderFlags = {})); +var Id3V2TextEncoding; +(function(Id3V2TextEncoding) { + Id3V2TextEncoding[Id3V2TextEncoding["ISO_8859_1"] = 0] = "ISO_8859_1"; + Id3V2TextEncoding[Id3V2TextEncoding["UTF_16_WITH_BOM"] = 1] = "UTF_16_WITH_BOM"; + Id3V2TextEncoding[Id3V2TextEncoding["UTF_16_BE_NO_BOM"] = 2] = "UTF_16_BE_NO_BOM"; + Id3V2TextEncoding[Id3V2TextEncoding["UTF_8"] = 3] = "UTF_8"; +})(Id3V2TextEncoding || (Id3V2TextEncoding = {})); +const ID3_V1_TAG_SIZE = 128; +const ID3_V2_HEADER_SIZE = 10; +const ID3_V1_GENRES = [ + 'Blues', + 'Classic rock', + 'Country', + 'Dance', + 'Disco', + 'Funk', + 'Grunge', + 'Hip-hop', + 'Jazz', + 'Metal', + 'New age', + 'Oldies', + 'Other', + 'Pop', + 'Rhythm and blues', + 'Rap', + 'Reggae', + 'Rock', + 'Techno', + 'Industrial', + 'Alternative', + 'Ska', + 'Death metal', + 'Pranks', + 'Soundtrack', + 'Euro-techno', + 'Ambient', + 'Trip-hop', + 'Vocal', + 'Jazz & funk', + 'Fusion', + 'Trance', + 'Classical', + 'Instrumental', + 'Acid', + 'House', + 'Game', + 'Sound clip', + 'Gospel', + 'Noise', + 'Alternative rock', + 'Bass', + 'Soul', + 'Punk', + 'Space', + 'Meditative', + 'Instrumental pop', + 'Instrumental rock', + 'Ethnic', + 'Gothic', + 'Darkwave', + 'Techno-industrial', + 'Electronic', + 'Pop-folk', + 'Eurodance', + 'Dream', + 'Southern rock', + 'Comedy', + 'Cult', + 'Gangsta', + 'Top 40', + 'Christian rap', + 'Pop/funk', + 'Jungle music', + 'Native US', + 'Cabaret', + 'New wave', + 'Psychedelic', + 'Rave', + 'Showtunes', + 'Trailer', + 'Lo-fi', + 'Tribal', + 'Acid punk', + 'Acid jazz', + 'Polka', + 'Retro', + 'Musical', + 'Rock \'n\' roll', + 'Hard rock', + 'Folk', + 'Folk rock', + 'National folk', + 'Swing', + 'Fast fusion', + 'Bebop', + 'Latin', + 'Revival', + 'Celtic', + 'Bluegrass', + 'Avantgarde', + 'Gothic rock', + 'Progressive rock', + 'Psychedelic rock', + 'Symphonic rock', + 'Slow rock', + 'Big band', + 'Chorus', + 'Easy listening', + 'Acoustic', + 'Humour', + 'Speech', + 'Chanson', + 'Opera', + 'Chamber music', + 'Sonata', + 'Symphony', + 'Booty bass', + 'Primus', + 'Porn groove', + 'Satire', + 'Slow jam', + 'Club', + 'Tango', + 'Samba', + 'Folklore', + 'Ballad', + 'Power ballad', + 'Rhythmic Soul', + 'Freestyle', + 'Duet', + 'Punk rock', + 'Drum solo', + 'A cappella', + 'Euro-house', + 'Dance hall', + 'Goa music', + 'Drum & bass', + 'Club-house', + 'Hardcore techno', + 'Terror', + 'Indie', + 'Britpop', + 'Negerpunk', + 'Polsk punk', + 'Beat', + 'Christian gangsta rap', + 'Heavy metal', + 'Black metal', + 'Crossover', + 'Contemporary Christian', + 'Christian rock', + 'Merengue', + 'Salsa', + 'Thrash metal', + 'Anime', + 'Jpop', + 'Synthpop', + 'Christmas', + 'Art rock', + 'Baroque', + 'Bhangra', + 'Big beat', + 'Breakbeat', + 'Chillout', + 'Downtempo', + 'Dub', + 'EBM', + 'Eclectic', + 'Electro', + 'Electroclash', + 'Emo', + 'Experimental', + 'Garage', + 'Global', + 'IDM', + 'Illbient', + 'Industro-Goth', + 'Jam Band', + 'Krautrock', + 'Leftfield', + 'Lounge', + 'Math rock', + 'New romantic', + 'Nu-breakz', + 'Post-punk', + 'Post-rock', + 'Psytrance', + 'Shoegaze', + 'Space rock', + 'Trop rock', + 'World music', + 'Neoclassical', + 'Audiobook', + 'Audio theatre', + 'Neue Deutsche Welle', + 'Podcast', + 'Indie rock', + 'G-Funk', + 'Dubstep', + 'Garage rock', + 'Psybient' +]; +const parseId3V1Tag = (slice, tags)=>{ + const startPos = slice.filePos; + tags.raw ??= {}; + tags.raw['TAG'] ??= (0, _readerJs.readBytes)(slice, ID3_V1_TAG_SIZE - 3); // Dump the whole tag into the raw metadata + slice.filePos = startPos; + const title = readId3V1String(slice, 30); + if (title) tags.title ??= title; + const artist = readId3V1String(slice, 30); + if (artist) tags.artist ??= artist; + const album = readId3V1String(slice, 30); + if (album) tags.album ??= album; + const yearText = readId3V1String(slice, 4); + const year = Number.parseInt(yearText, 10); + if (Number.isInteger(year) && year > 0) tags.date ??= new Date(year, 0, 1); + const commentBytes = (0, _readerJs.readBytes)(slice, 30); + let comment; + // Check for the ID3v1.1 track number format: + // The 29th byte (index 28) is a null terminator, and the 30th byte is the track number. + if (commentBytes[28] === 0 && commentBytes[29] !== 0) { + const trackNum = commentBytes[29]; + if (trackNum > 0) tags.trackNumber ??= trackNum; + slice.skip(-30); + comment = readId3V1String(slice, 28); + slice.skip(2); + } else { + slice.skip(-30); + comment = readId3V1String(slice, 30); + } + if (comment) tags.comment ??= comment; + const genreIndex = (0, _readerJs.readU8)(slice); + if (genreIndex < ID3_V1_GENRES.length) tags.genre ??= ID3_V1_GENRES[genreIndex]; +}; +const readId3V1String = (slice, length)=>{ + const bytes = (0, _readerJs.readBytes)(slice, length); + const endIndex = (0, _miscJs.coalesceIndex)(bytes.indexOf(0), bytes.length); + const relevantBytes = bytes.subarray(0, endIndex); + // Decode as ISO-8859-1 + let str = ''; + for(let i = 0; i < relevantBytes.length; i++)str += String.fromCharCode(relevantBytes[i]); + return str.trimEnd(); // String also may be padded with spaces +}; +const readId3V2Header = (slice)=>{ + const startPos = slice.filePos; + const tag = (0, _readerJs.readAscii)(slice, 3); + const majorVersion = (0, _readerJs.readU8)(slice); + const revision = (0, _readerJs.readU8)(slice); + const flags = (0, _readerJs.readU8)(slice); + const sizeRaw = (0, _readerJs.readU32Be)(slice); + if (tag !== 'ID3' || majorVersion === 0xff || revision === 0xff || (sizeRaw & 0x80808080) !== 0) { + slice.filePos = startPos; + return null; + } + const size = (0, _mp3MiscJs.decodeSynchsafe)(sizeRaw); + return { + majorVersion, + revision, + flags, + size + }; +}; +const parseId3V2Tag = (slice, header, tags)=>{ + // https://id3.org/id3v2.3.0 + if (![ + 2, + 3, + 4 + ].includes(header.majorVersion)) { + console.warn(`Unsupported ID3v2 major version: ${header.majorVersion}`); + return; + } + const bytes = (0, _readerJs.readBytes)(slice, header.size); + const reader = new Id3V2Reader(header, bytes); + if (header.flags & Id3V2HeaderFlags.Footer) reader.removeFooter(); + if (header.flags & Id3V2HeaderFlags.Unsynchronisation && header.majorVersion === 3) reader.ununsynchronizeAll(); + if (header.flags & Id3V2HeaderFlags.ExtendedHeader) { + const extendedHeaderSize = reader.readU32(); + if (header.majorVersion === 3) reader.pos += extendedHeaderSize; // The extended header size excludes itself + else reader.pos += extendedHeaderSize - 4; // The extended header size includes itself + } + while(reader.pos <= reader.bytes.length - reader.frameHeaderSize()){ + const frame = reader.readId3V2Frame(); + if (!frame) break; + const frameStartPos = reader.pos; + const frameEndPos = reader.pos + frame.size; + let frameEncrypted = false; + let frameCompressed = false; + let frameUnsynchronized = false; + if (header.majorVersion === 3) { + frameEncrypted = !!(frame.flags & 64); + frameCompressed = !!(frame.flags & 128); + } else if (header.majorVersion === 4) { + frameEncrypted = !!(frame.flags & 4); + frameCompressed = !!(frame.flags & 8); + frameUnsynchronized = !!(frame.flags & 2) || !!(header.flags & Id3V2HeaderFlags.Unsynchronisation); + } + if (frameEncrypted) { + console.warn(`Skipping encrypted ID3v2 frame ${frame.id}`); + reader.pos = frameEndPos; + continue; + } + if (frameCompressed) { + console.warn(`Skipping compressed ID3v2 frame ${frame.id}`); // Maybe someday? Idk + reader.pos = frameEndPos; + continue; + } + if (frameUnsynchronized) reader.ununsynchronizeRegion(reader.pos, frameEndPos); + tags.raw ??= {}; + if (frame.id[0] === 'T') // It's a text frame, let's decode as text + tags.raw[frame.id] ??= reader.readId3V2EncodingAndText(frameEndPos); + else // For the others, let's just get the bytes + tags.raw[frame.id] ??= reader.readBytes(frame.size); + reader.pos = frameStartPos; + switch(frame.id){ + case 'TIT2': + case 'TT2': + tags.title ??= reader.readId3V2EncodingAndText(frameEndPos); + break; + case 'TIT3': + case 'TT3': + tags.description ??= reader.readId3V2EncodingAndText(frameEndPos); + break; + case 'TPE1': + case 'TP1': + tags.artist ??= reader.readId3V2EncodingAndText(frameEndPos); + break; + case 'TALB': + case 'TAL': + tags.album ??= reader.readId3V2EncodingAndText(frameEndPos); + break; + case 'TPE2': + case 'TP2': + tags.albumArtist ??= reader.readId3V2EncodingAndText(frameEndPos); + break; + case 'TRCK': + case 'TRK': + { + const trackText = reader.readId3V2EncodingAndText(frameEndPos); + const parts = trackText.split('/'); + const trackNum = Number.parseInt(parts[0], 10); + const tracksTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(trackNum) && trackNum > 0) tags.trackNumber ??= trackNum; + if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) tags.tracksTotal ??= tracksTotal; + } + break; + case 'TPOS': + case 'TPA': + { + const discText = reader.readId3V2EncodingAndText(frameEndPos); + const parts = discText.split('/'); + const discNum = Number.parseInt(parts[0], 10); + const discsTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(discNum) && discNum > 0) tags.discNumber ??= discNum; + if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) tags.discsTotal ??= discsTotal; + } + break; + case 'TCON': + case 'TCO': + { + const genreText = reader.readId3V2EncodingAndText(frameEndPos); + let match = /^\((\d+)\)/.exec(genreText); + if (match) { + const genreNumber = Number.parseInt(match[1]); + if (ID3_V1_GENRES[genreNumber] !== undefined) { + tags.genre ??= ID3_V1_GENRES[genreNumber]; + break; + } + } + match = /^\d+$/.exec(genreText); + if (match) { + const genreNumber = Number.parseInt(match[0]); + if (ID3_V1_GENRES[genreNumber] !== undefined) { + tags.genre ??= ID3_V1_GENRES[genreNumber]; + break; + } + } + tags.genre ??= genreText; + } + break; + case 'TDRC': + case 'TDAT': + { + const dateText = reader.readId3V2EncodingAndText(frameEndPos); + const date = new Date(dateText); + if (!Number.isNaN(date.getTime())) tags.date ??= date; + } + break; + case 'TYER': + case 'TYE': + { + const yearText = reader.readId3V2EncodingAndText(frameEndPos); + const year = Number.parseInt(yearText, 10); + if (Number.isInteger(year)) tags.date ??= new Date(year, 0, 1); + } + break; + case 'USLT': + case 'ULT': + { + const encoding = reader.readU8(); + reader.pos += 3; // Skip language + reader.readId3V2Text(encoding, frameEndPos); // Short content description + tags.lyrics ??= reader.readId3V2Text(encoding, frameEndPos); + } + break; + case 'COMM': + case 'COM': + { + const encoding = reader.readU8(); + reader.pos += 3; // Skip language + reader.readId3V2Text(encoding, frameEndPos); // Short content description + tags.comment ??= reader.readId3V2Text(encoding, frameEndPos); + } + break; + case 'APIC': + case 'PIC': + { + const encoding = reader.readId3V2TextEncoding(); + let mimeType; + if (header.majorVersion === 2) { + const imageFormat = reader.readAscii(3); + mimeType = imageFormat === 'PNG' ? 'image/png' : imageFormat === 'JPG' ? 'image/jpeg' : 'image/*'; + } else mimeType = reader.readId3V2Text(encoding, frameEndPos); + const pictureType = reader.readU8(); + const description = reader.readId3V2Text(encoding, frameEndPos).trimEnd(); // Trim ending spaces + const imageDataSize = frameEndPos - reader.pos; + if (imageDataSize >= 0) { + const imageData = reader.readBytes(imageDataSize); + if (!tags.images) tags.images = []; + tags.images.push({ + data: imageData, + mimeType, + kind: pictureType === 3 ? 'coverFront' : pictureType === 4 ? 'coverBack' : 'unknown', + description + }); + } + } + break; + default: + reader.pos += frame.size; + break; + } + reader.pos = frameEndPos; + } +}; +class Id3V2Reader { + constructor(header, bytes){ + this.header = header; + this.bytes = bytes; + this.pos = 0; + this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + } + frameHeaderSize() { + return this.header.majorVersion === 2 ? 6 : 10; + } + ununsynchronizeAll() { + const newBytes = []; + for(let i = 0; i < this.bytes.length; i++){ + const value1 = this.bytes[i]; + newBytes.push(value1); + if (value1 === 0xff && i !== this.bytes.length - 1) { + const value2 = this.bytes[i]; + if (value2 === 0x00) i++; + } + } + this.bytes = new Uint8Array(newBytes); + this.view = new DataView(this.bytes.buffer); + } + ununsynchronizeRegion(start, end) { + const newBytes = []; + for(let i = start; i < end; i++){ + const value1 = this.bytes[i]; + newBytes.push(value1); + if (value1 === 0xff && i !== end - 1) { + const value2 = this.bytes[i + 1]; + if (value2 === 0x00) i++; + } + } + const before = this.bytes.subarray(0, start); + const after = this.bytes.subarray(end); + this.bytes = new Uint8Array(before.length + newBytes.length + after.length); + this.bytes.set(before, 0); + this.bytes.set(newBytes, before.length); + this.bytes.set(after, before.length + newBytes.length); + this.view = new DataView(this.bytes.buffer); + } + removeFooter() { + this.bytes = this.bytes.subarray(0, this.bytes.length - ID3_V2_HEADER_SIZE); + this.view = new DataView(this.bytes.buffer); + } + readBytes(length) { + const slice = this.bytes.subarray(this.pos, this.pos + length); + this.pos += length; + return slice; + } + readU8() { + const value = this.view.getUint8(this.pos); + this.pos += 1; + return value; + } + readU16() { + const value = this.view.getUint16(this.pos, false); + this.pos += 2; + return value; + } + readU24() { + const high = this.view.getUint16(this.pos, false); + const low = this.view.getUint8(this.pos + 1); + this.pos += 3; + return high * 0x100 + low; + } + readU32() { + const value = this.view.getUint32(this.pos, false); + this.pos += 4; + return value; + } + readAscii(length) { + let str = ''; + for(let i = 0; i < length; i++)str += String.fromCharCode(this.view.getUint8(this.pos + i)); + this.pos += length; + return str; + } + readId3V2Frame() { + if (this.header.majorVersion === 2) { + const id = this.readAscii(3); + if (id === '\x00\x00\x00') return null; + const size = this.readU24(); + return { + id, + size, + flags: 0 + }; + } else { + const id = this.readAscii(4); + if (id === '\x00\x00\x00\x00') // We've landed in the padding section + return null; + const sizeRaw = this.readU32(); + let size = this.header.majorVersion === 4 ? (0, _mp3MiscJs.decodeSynchsafe)(sizeRaw) : sizeRaw; + const flags = this.readU16(); + const headerEndPos = this.pos; + // Some files may have incorrectly synchsafed/unsynchsafed sizes. To validate which interpretation is valid, + // we validate a size by skipping ahead and seeing if we land at a valid frame header (or at the end of the + // tag. + const isSizeValid = (size)=>{ + const nextPos = this.pos + size; + if (nextPos > this.bytes.length) return false; + if (nextPos <= this.bytes.length - this.frameHeaderSize()) { + this.pos += size; + const nextId = this.readAscii(4); + if (nextId !== '\x00\x00\x00\x00' && !/[0-9A-Z]{4}/.test(nextId)) return false; + } + return true; + }; + if (!isSizeValid(size)) { + // Flip the synchsafing, and try if this one makes more sense + const otherSize = this.header.majorVersion === 4 ? sizeRaw : (0, _mp3MiscJs.decodeSynchsafe)(sizeRaw); + if (isSizeValid(otherSize)) size = otherSize; + } + this.pos = headerEndPos; + return { + id, + size, + flags + }; + } + } + readId3V2TextEncoding() { + const number = this.readU8(); + if (number > 3) throw new Error(`Unsupported text encoding: ${number}`); + return number; + } + readId3V2Text(encoding, until) { + const startPos = this.pos; + const data = this.readBytes(until - this.pos); + switch(encoding){ + case Id3V2TextEncoding.ISO_8859_1: + { + let str = ''; + for(let i = 0; i < data.length; i++){ + const value = data[i]; + if (value === 0) { + this.pos = startPos + i + 1; + break; + } + str += String.fromCharCode(value); + } + return str; + } + case Id3V2TextEncoding.UTF_16_WITH_BOM: + if (data[0] === 0xff && data[1] === 0xfe) { + const decoder = new TextDecoder('utf-16le'); + const endIndex = (0, _miscJs.coalesceIndex)(data.findIndex((x, i)=>x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length); + this.pos = startPos + Math.min(endIndex + 2, data.length); + return decoder.decode(data.subarray(2, endIndex)); + } else if (data[0] === 0xfe && data[1] === 0xff) { + const decoder = new TextDecoder('utf-16be'); + const endIndex = (0, _miscJs.coalesceIndex)(data.findIndex((x, i)=>x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length); + this.pos = startPos + Math.min(endIndex + 2, data.length); + return decoder.decode(data.subarray(2, endIndex)); + } else { + // Treat it like UTF-8, some files do this + const endIndex = (0, _miscJs.coalesceIndex)(data.findIndex((x)=>x === 0), data.length); + this.pos = startPos + Math.min(endIndex + 1, data.length); + return (0, _miscJs.textDecoder).decode(data.subarray(0, endIndex)); + } + case Id3V2TextEncoding.UTF_16_BE_NO_BOM: + { + const decoder = new TextDecoder('utf-16be'); + const endIndex = (0, _miscJs.coalesceIndex)(data.findIndex((x, i)=>x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length); + this.pos = startPos + Math.min(endIndex + 2, data.length); + return decoder.decode(data.subarray(0, endIndex)); + } + case Id3V2TextEncoding.UTF_8: + { + const endIndex = (0, _miscJs.coalesceIndex)(data.findIndex((x)=>x === 0), data.length); + this.pos = startPos + Math.min(endIndex + 1, data.length); + return (0, _miscJs.textDecoder).decode(data.subarray(0, endIndex)); + } + } + } + readId3V2EncodingAndText(until) { + if (this.pos >= until) return ''; + const encoding = this.readId3V2TextEncoding(); + return this.readId3V2Text(encoding, until); + } +} +class Id3V2Writer { + constructor(writer){ + this.helper = new Uint8Array(8); + this.helperView = (0, _miscJs.toDataView)(this.helper); + this.writer = writer; + } + writeId3V2Tag(metadata) { + const tagStartPos = this.writer.getPos(); + // Write ID3v2.4 header + this.writeAscii('ID3'); + this.writeU8(0x04); // Version 2.4 + this.writeU8(0x00); // Revision 0 + this.writeU8(0x00); // Flags + this.writeSynchsafeU32(0); // Size placeholder + const framesStartPos = this.writer.getPos(); + const writtenTags = new Set(); + // Write all metadata frames + for (const { key, value } of (0, _miscJs.keyValueIterator)(metadata))switch(key){ + case 'title': + this.writeId3V2TextFrame('TIT2', value); + writtenTags.add('TIT2'); + break; + case 'description': + this.writeId3V2TextFrame('TIT3', value); + writtenTags.add('TIT3'); + break; + case 'artist': + this.writeId3V2TextFrame('TPE1', value); + writtenTags.add('TPE1'); + break; + case 'album': + this.writeId3V2TextFrame('TALB', value); + writtenTags.add('TALB'); + break; + case 'albumArtist': + this.writeId3V2TextFrame('TPE2', value); + writtenTags.add('TPE2'); + break; + case 'trackNumber': + { + const string = metadata.tracksTotal !== undefined ? `${value}/${metadata.tracksTotal}` : value.toString(); + this.writeId3V2TextFrame('TRCK', string); + writtenTags.add('TRCK'); + } + break; + case 'discNumber': + { + const string = metadata.discsTotal !== undefined ? `${value}/${metadata.discsTotal}` : value.toString(); + this.writeId3V2TextFrame('TPOS', string); + writtenTags.add('TPOS'); + } + break; + case 'genre': + this.writeId3V2TextFrame('TCON', value); + writtenTags.add('TCON'); + break; + case 'date': + this.writeId3V2TextFrame('TDRC', value.toISOString().slice(0, 10)); + writtenTags.add('TDRC'); + break; + case 'lyrics': + this.writeId3V2LyricsFrame(value); + writtenTags.add('USLT'); + break; + case 'comment': + this.writeId3V2CommentFrame(value); + writtenTags.add('COMM'); + break; + case 'images': + { + const pictureTypeMap = { + coverFront: 0x03, + coverBack: 0x04, + unknown: 0x00 + }; + for (const image of value){ + const pictureType = pictureTypeMap[image.kind] ?? 0x00; + const description = image.description ?? ''; + this.writeId3V2ApicFrame(image.mimeType, pictureType, description, image.data); + } + } + break; + case 'tracksTotal': + case 'discsTotal': + break; + case 'raw': + break; + default: + (0, _miscJs.assertNever)(key); + } + if (metadata.raw) for(const key in metadata.raw){ + const value = metadata.raw[key]; + if (value == null || key.length !== 4 || writtenTags.has(key)) continue; + let bytes; + if (typeof value === 'string') { + const encoded = (0, _miscJs.textEncoder).encode(value); + bytes = new Uint8Array(encoded.byteLength + 2); + bytes[0] = Id3V2TextEncoding.UTF_8; + bytes.set(encoded, 1); + // Last byte is the null terminator + } else if (value instanceof Uint8Array) bytes = value; + else continue; + this.writeAscii(key); + this.writeSynchsafeU32(bytes.byteLength); + this.writeU16(0x0000); + this.writer.write(bytes); + } + const framesEndPos = this.writer.getPos(); + const framesSize = framesEndPos - framesStartPos; + // Update the size field in the header (synchsafe) + this.writer.seek(tagStartPos + 6); // Skip 'ID3' + version + revision + flags + this.writeSynchsafeU32(framesSize); + this.writer.seek(framesEndPos); + return framesSize + 10; // +10 for the header size + } + writeU8(value) { + this.helper[0] = value; + this.writer.write(this.helper.subarray(0, 1)); + } + writeU16(value) { + this.helperView.setUint16(0, value, false); + this.writer.write(this.helper.subarray(0, 2)); + } + writeU32(value) { + this.helperView.setUint32(0, value, false); + this.writer.write(this.helper.subarray(0, 4)); + } + writeAscii(text) { + for(let i = 0; i < text.length; i++)this.helper[i] = text.charCodeAt(i); + this.writer.write(this.helper.subarray(0, text.length)); + } + writeSynchsafeU32(value) { + this.writeU32((0, _mp3MiscJs.encodeSynchsafe)(value)); + } + writeIsoString(text) { + const bytes = new Uint8Array(text.length + 1); + for(let i = 0; i < text.length; i++)bytes[i] = text.charCodeAt(i); + bytes[text.length] = 0x00; + this.writer.write(bytes); + } + writeUtf8String(text) { + const utf8Data = (0, _miscJs.textEncoder).encode(text); + this.writer.write(utf8Data); + this.writeU8(0x00); + } + writeId3V2TextFrame(frameId, text) { + const useIso88591 = (0, _miscJs.isIso88591Compatible)(text); + const textDataLength = useIso88591 ? text.length : (0, _miscJs.textEncoder).encode(text).byteLength; + const frameSize = 1 + textDataLength + 1; + this.writeAscii(frameId); + this.writeSynchsafeU32(frameSize); + this.writeU16(0x0000); + this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8); + if (useIso88591) this.writeIsoString(text); + else this.writeUtf8String(text); + } + writeId3V2LyricsFrame(lyrics) { + const useIso88591 = (0, _miscJs.isIso88591Compatible)(lyrics); + const shortDescription = ''; + const frameSize = 4 + shortDescription.length + 1 + lyrics.length + 1; + this.writeAscii('USLT'); + this.writeSynchsafeU32(frameSize); + this.writeU16(0x0000); + this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8); + this.writeAscii('und'); + if (useIso88591) { + this.writeIsoString(shortDescription); + this.writeIsoString(lyrics); + } else { + this.writeUtf8String(shortDescription); + this.writeUtf8String(lyrics); + } + } + writeId3V2CommentFrame(comment) { + const useIso88591 = (0, _miscJs.isIso88591Compatible)(comment); + const textDataLength = useIso88591 ? comment.length : (0, _miscJs.textEncoder).encode(comment).byteLength; + const shortDescription = ''; + const frameSize = 4 + shortDescription.length + 1 + textDataLength + 1; + this.writeAscii('COMM'); + this.writeSynchsafeU32(frameSize); + this.writeU16(0x0000); + this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8); + this.writeU8(0x75); // 'u' + this.writeU8(0x6E); // 'n' + this.writeU8(0x64); // 'd' + if (useIso88591) { + this.writeIsoString(shortDescription); + this.writeIsoString(comment); + } else { + this.writeUtf8String(shortDescription); + this.writeUtf8String(comment); + } + } + writeId3V2ApicFrame(mimeType, pictureType, description, imageData) { + const useIso88591 = (0, _miscJs.isIso88591Compatible)(mimeType) && (0, _miscJs.isIso88591Compatible)(description); + const descriptionDataLength = useIso88591 ? description.length : (0, _miscJs.textEncoder).encode(description).byteLength; + const frameSize = 1 + mimeType.length + 1 + 1 + descriptionDataLength + 1 + imageData.byteLength; + this.writeAscii('APIC'); + this.writeSynchsafeU32(frameSize); + this.writeU16(0x0000); + this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8); + if (useIso88591) this.writeIsoString(mimeType); + else this.writeUtf8String(mimeType); + this.writeU8(pictureType); + if (useIso88591) this.writeIsoString(description); + else this.writeUtf8String(description); + this.writer.write(imageData); + } +} + +},{"../shared/mp3-misc.js":"k3lpY","./misc.js":"kkhLS","./reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"kFP95":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "readNextFrameHeader", ()=>readNextFrameHeader); +var _mp3MiscJs = require("../../shared/mp3-misc.js"); +var _readerJs = require("../reader.js"); +const readNextFrameHeader = async (reader, startPos, until)=>{ + let currentPos = startPos; + while(until === null || currentPos < until){ + let slice = reader.requestSlice(currentPos, (0, _mp3MiscJs.FRAME_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const word = (0, _readerJs.readU32Be)(slice); + const result = (0, _mp3MiscJs.readFrameHeader)(word, reader.fileSize !== null ? reader.fileSize - currentPos : null); + if (result.header) return { + header: result.header, + startPos: currentPos + }; + currentPos += result.bytesAdvanced; + } + return null; +}; + +},{"../../shared/mp3-misc.js":"k3lpY","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"2yNaV":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "OggDemuxer", ()=>OggDemuxer); +var _codecJs = require("../codec.js"); +var _codecDataJs = require("../codec-data.js"); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _metadataJs = require("../metadata.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _readerJs = require("../reader.js"); +var _oggMiscJs = require("./ogg-misc.js"); +var _oggReaderJs = require("./ogg-reader.js"); +class OggDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.metadataPromise = null; + this.bitstreams = []; + this.tracks = []; + this.metadataTags = {}; + this.reader = input._reader; + } + async readMetadata() { + return this.metadataPromise ??= (async ()=>{ + let currentPos = 0; + while(true){ + let slice = this.reader.requestSliceRange(currentPos, (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE), (0, _oggReaderJs.MAX_PAGE_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const page = (0, _oggReaderJs.readPageHeader)(slice); + if (!page) break; + const isBos = !!(page.headerType & 0x02); + if (!isBos) break; + this.bitstreams.push({ + serialNumber: page.serialNumber, + bosPage: page, + description: null, + numberOfChannels: -1, + sampleRate: -1, + codecInfo: { + codec: null, + vorbisInfo: null, + opusInfo: null + }, + lastMetadataPacket: null + }); + currentPos = page.headerStartPos + page.totalSize; + } + for (const bitstream of this.bitstreams){ + const firstPacket = await this.readPacket(bitstream.bosPage, 0); + if (!firstPacket) continue; + if (// Check for Vorbis + firstPacket.data.byteLength >= 7 && firstPacket.data[0] === 0x01 // Packet type 1 = identification header + && firstPacket.data[1] === 0x76 // 'v' + && firstPacket.data[2] === 0x6f // 'o' + && firstPacket.data[3] === 0x72 // 'r' + && firstPacket.data[4] === 0x62 // 'b' + && firstPacket.data[5] === 0x69 // 'i' + && firstPacket.data[6] === 0x73 // 's' + ) await this.readVorbisMetadata(firstPacket, bitstream); + else if (// Check for Opus + firstPacket.data.byteLength >= 8 && firstPacket.data[0] === 0x4f // 'O' + && firstPacket.data[1] === 0x70 // 'p' + && firstPacket.data[2] === 0x75 // 'u' + && firstPacket.data[3] === 0x73 // 's' + && firstPacket.data[4] === 0x48 // 'H' + && firstPacket.data[5] === 0x65 // 'e' + && firstPacket.data[6] === 0x61 // 'a' + && firstPacket.data[7] === 0x64 // 'd' + ) await this.readOpusMetadata(firstPacket, bitstream); + if (bitstream.codecInfo.codec !== null) this.tracks.push(new (0, _inputTrackJs.InputAudioTrack)(this.input, new OggAudioTrackBacking(bitstream, this))); + } + })(); + } + async readVorbisMetadata(firstPacket, bitstream) { + let nextPacketPosition = await this.findNextPacketStart(firstPacket); + if (!nextPacketPosition) return; + const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex); + if (!secondPacket) return; + nextPacketPosition = await this.findNextPacketStart(secondPacket); + if (!nextPacketPosition) return; + const thirdPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex); + if (!thirdPacket) return; + if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) return; + const lacingValues = []; + const addBytesToSegmentTable = (bytes)=>{ + while(true){ + lacingValues.push(Math.min(255, bytes)); + if (bytes < 255) break; + bytes -= 255; + } + }; + addBytesToSegmentTable(firstPacket.data.length); + addBytesToSegmentTable(secondPacket.data.length); + // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain + const description = new Uint8Array(1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length); + description[0] = 2; // Num entries in the segment table + description.set(lacingValues, 1); + description.set(firstPacket.data, 1 + lacingValues.length); + description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length); + description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length); + bitstream.codecInfo.codec = 'vorbis'; + bitstream.description = description; + bitstream.lastMetadataPacket = thirdPacket; + const view = (0, _miscJs.toDataView)(firstPacket.data); + bitstream.numberOfChannels = view.getUint8(11); + bitstream.sampleRate = view.getUint32(12, true); + const blockSizeByte = view.getUint8(28); + bitstream.codecInfo.vorbisInfo = { + blocksizes: [ + 1 << (blockSizeByte & 0xf), + 1 << (blockSizeByte >> 4) + ], + modeBlockflags: (0, _codecDataJs.parseModesFromVorbisSetupPacket)(thirdPacket.data).modeBlockflags + }; + (0, _codecDataJs.readVorbisComments)(secondPacket.data.subarray(7), this.metadataTags); // Skip header type and 'vorbis' + } + async readOpusMetadata(firstPacket, bitstream) { + // From https://datatracker.ietf.org/doc/html/rfc7845#section-5: + // "An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a + // comment header." + const nextPacketPosition = await this.findNextPacketStart(firstPacket); + if (!nextPacketPosition) return; + const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex); + if (!secondPacket) return; + bitstream.codecInfo.codec = 'opus'; + bitstream.description = firstPacket.data; + bitstream.lastMetadataPacket = secondPacket; + const header = (0, _codecDataJs.parseOpusIdentificationHeader)(firstPacket.data); + bitstream.numberOfChannels = header.outputChannelCount; + bitstream.sampleRate = (0, _codecJs.OPUS_SAMPLE_RATE); // Always the same + bitstream.codecInfo.opusInfo = { + preSkip: header.preSkip + }; + (0, _codecDataJs.readVorbisComments)(secondPacket.data.subarray(8), this.metadataTags); // Skip 'OpusTags' + } + async readPacket(startPage, startSegmentIndex) { + (0, _miscJs.assert)(startSegmentIndex < startPage.lacingValues.length); + let startDataOffset = 0; + for(let i = 0; i < startSegmentIndex; i++)startDataOffset += startPage.lacingValues[i]; + let currentPage = startPage; + let currentDataOffset = startDataOffset; + let currentSegmentIndex = startSegmentIndex; + const chunks = []; + outer: while(true){ + // Load the entire page data + let pageSlice = this.reader.requestSlice(currentPage.dataStartPos, currentPage.dataSize); + if (pageSlice instanceof Promise) pageSlice = await pageSlice; + (0, _miscJs.assert)(pageSlice); + const pageData = (0, _readerJs.readBytes)(pageSlice, currentPage.dataSize); + while(true){ + if (currentSegmentIndex === currentPage.lacingValues.length) { + chunks.push(pageData.subarray(startDataOffset, currentDataOffset)); + break; + } + const lacingValue = currentPage.lacingValues[currentSegmentIndex]; + currentDataOffset += lacingValue; + if (lacingValue < 255) { + chunks.push(pageData.subarray(startDataOffset, currentDataOffset)); + break outer; + } + currentSegmentIndex++; + } + // The packet extends to the next page; let's find it + let currentPos = currentPage.headerStartPos + currentPage.totalSize; + while(true){ + let headerSlice = this.reader.requestSliceRange(currentPos, (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE), (0, _oggReaderJs.MAX_PAGE_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + if (!headerSlice) return null; + const nextPage = (0, _oggReaderJs.readPageHeader)(headerSlice); + if (!nextPage) return null; + currentPage = nextPage; + if (currentPage.serialNumber === startPage.serialNumber) break; + currentPos = currentPage.headerStartPos + currentPage.totalSize; + } + startDataOffset = 0; + currentDataOffset = 0; + currentSegmentIndex = 0; + } + const totalPacketSize = chunks.reduce((sum, chunk)=>sum + chunk.length, 0); + const packetData = new Uint8Array(totalPacketSize); + let offset = 0; + for(let i = 0; i < chunks.length; i++){ + const chunk = chunks[i]; + packetData.set(chunk, offset); + offset += chunk.length; + } + return { + data: packetData, + endPage: currentPage, + endSegmentIndex: currentSegmentIndex + }; + } + async findNextPacketStart(lastPacket) { + // If there's another segment in the same page, return it + if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) return { + startPage: lastPacket.endPage, + startSegmentIndex: lastPacket.endSegmentIndex + 1 + }; + const isEos = !!(lastPacket.endPage.headerType & 0x04); + if (isEos) // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it + return null; + // Otherwise, search for the next page belonging to the same bitstream + let currentPos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize; + while(true){ + let slice = this.reader.requestSliceRange(currentPos, (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE), (0, _oggReaderJs.MAX_PAGE_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; + const nextPage = (0, _oggReaderJs.readPageHeader)(slice); + if (!nextPage) return null; + if (nextPage.serialNumber === lastPacket.endPage.serialNumber) return { + startPage: nextPage, + startSegmentIndex: 0 + }; + currentPos = nextPage.headerStartPos + nextPage.totalSize; + } + } + async getMimeType() { + await this.readMetadata(); + const codecStrings = await Promise.all(this.tracks.map((x)=>x.getCodecParameterString())); + return (0, _oggMiscJs.buildOggMimeType)({ + codecStrings: codecStrings.filter(Boolean) + }); + } + async getTracks() { + await this.readMetadata(); + return this.tracks; + } + async computeDuration() { + const tracks = await this.getTracks(); + const trackDurations = await Promise.all(tracks.map((x)=>x.computeDuration())); + return Math.max(0, ...trackDurations); + } + async getMetadataTags() { + await this.readMetadata(); + return this.metadataTags; + } +} +class OggAudioTrackBacking { + constructor(bitstream, demuxer){ + this.bitstream = bitstream; + this.demuxer = demuxer; + this.encodedPacketToMetadata = new WeakMap(); + this.sequentialScanCache = []; + this.sequentialScanMutex = new (0, _miscJs.AsyncMutex)(); + // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different + this.internalSampleRate = bitstream.codecInfo.codec === 'opus' ? (0, _codecJs.OPUS_SAMPLE_RATE) : bitstream.sampleRate; + } + getId() { + return this.bitstream.serialNumber; + } + getNumberOfChannels() { + return this.bitstream.numberOfChannels; + } + getSampleRate() { + return this.bitstream.sampleRate; + } + getTimeResolution() { + return this.bitstream.sampleRate; + } + getCodec() { + return this.bitstream.codecInfo.codec; + } + getInternalCodecId() { + return null; + } + async getDecoderConfig() { + (0, _miscJs.assert)(this.bitstream.codecInfo.codec); + return { + codec: this.bitstream.codecInfo.codec, + numberOfChannels: this.bitstream.numberOfChannels, + sampleRate: this.bitstream.sampleRate, + description: this.bitstream.description ?? undefined + }; + } + getName() { + return null; + } + getLanguageCode() { + return 0, _miscJs.UNDETERMINED_LANGUAGE; + } + getDisposition() { + return { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }; + } + async getFirstTimestamp() { + return 0; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + granulePositionToTimestampInSamples(granulePosition) { + if (this.bitstream.codecInfo.codec === 'opus') { + (0, _miscJs.assert)(this.bitstream.codecInfo.opusInfo); + return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip; + } + return granulePosition; + } + createEncodedPacketFromOggPacket(packet, additional, options) { + if (!packet) return null; + const { durationInSamples, vorbisBlockSize } = (0, _oggMiscJs.extractSampleMetadata)(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize); + const encodedPacket = new (0, _packetJs.EncodedPacket)(options.metadataOnly ? (0, _packetJs.PLACEHOLDER_DATA) : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength); + this.encodedPacketToMetadata.set(encodedPacket, { + packet, + timestampInSamples: additional.timestampInSamples, + durationInSamples, + vorbisLastBlockSize: additional.vorbisLastBlocksize, + vorbisBlockSize + }); + return encodedPacket; + } + async getFirstPacket(options) { + (0, _miscJs.assert)(this.bitstream.lastMetadataPacket); + const packetPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket); + if (!packetPosition) return null; + let timestampInSamples = 0; + if (this.bitstream.codecInfo.codec === 'opus') { + (0, _miscJs.assert)(this.bitstream.codecInfo.opusInfo); + timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip; + } + const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex); + return this.createEncodedPacketFromOggPacket(packet, { + timestampInSamples, + vorbisLastBlocksize: null + }, options); + } + async getNextPacket(prevPacket, options) { + const prevMetadata = this.encodedPacketToMetadata.get(prevPacket); + if (!prevMetadata) throw new Error('Packet was not created from this track.'); + const packetPosition = await this.demuxer.findNextPacketStart(prevMetadata.packet); + if (!packetPosition) return null; + const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples; + const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex); + return this.createEncodedPacketFromOggPacket(packet, { + timestampInSamples, + vorbisLastBlocksize: prevMetadata.vorbisBlockSize + }, options); + } + async getPacket(timestamp, options) { + if (this.demuxer.reader.fileSize === null) // No file size known, can't do binary search, but fall back to sequential algo instead + return this.getPacketSequential(timestamp, options); + const timestampInSamples = (0, _miscJs.roundIfAlmostInteger)(timestamp * this.internalSampleRate); + if (timestampInSamples === 0) // Fast path for timestamp 0 - avoids binary search when playing back from the start + return this.getFirstPacket(options); + if (timestampInSamples < 0) // There's nothing here + return null; + (0, _miscJs.assert)(this.bitstream.lastMetadataPacket); + const startPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket); + if (!startPosition) return null; + let lowPage = startPosition.startPage; + let high = this.demuxer.reader.fileSize; + const lowPages = [ + lowPage + ]; + // First, let's perform a binary serach (bisection search) on the file to find the approximate page where + // we'll find the packet. We want to find a page whose end packet position is less than or equal to the + // packet position we're searching for. + // Outer loop: Does the binary serach + outer: while(lowPage.headerStartPos + lowPage.totalSize < high){ + const low = lowPage.headerStartPos; + const mid = Math.floor((low + high) / 2); + let searchStartPos = mid; + // Inner loop: Does a linear forward scan if the page cannot be found immediately + while(true){ + const until = Math.min(searchStartPos + (0, _oggReaderJs.MAX_PAGE_SIZE), high - (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE)); + let searchSlice = this.demuxer.reader.requestSlice(searchStartPos, until - searchStartPos); + if (searchSlice instanceof Promise) searchSlice = await searchSlice; + (0, _miscJs.assert)(searchSlice); + const found = (0, _oggReaderJs.findNextPageHeader)(searchSlice, until); + if (!found) { + high = mid + (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE); + continue outer; + } + let headerSlice = this.demuxer.reader.requestSliceRange(searchSlice.filePos, (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE), (0, _oggReaderJs.MAX_PAGE_HEADER_SIZE)); + if (headerSlice instanceof Promise) headerSlice = await headerSlice; + (0, _miscJs.assert)(headerSlice); + const page = (0, _oggReaderJs.readPageHeader)(headerSlice); + (0, _miscJs.assert)(page); + let pageValid = false; + if (page.serialNumber === this.bitstream.serialNumber) // Serial numbers are basically random numbers, and the chance of finding a fake page with + // matching serial number is astronomically low, so we can be pretty sure this page is legit. + pageValid = true; + else { + let pageSlice = this.demuxer.reader.requestSlice(page.headerStartPos, page.totalSize); + if (pageSlice instanceof Promise) pageSlice = await pageSlice; + (0, _miscJs.assert)(pageSlice); + // Validate the page by checking checksum + const bytes = (0, _readerJs.readBytes)(pageSlice, page.totalSize); + const crc = (0, _oggMiscJs.computeOggPageCrc)(bytes); + pageValid = crc === page.checksum; + } + if (!pageValid) { + // Keep searching for a valid page + searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes + continue; + } + if (pageValid && page.serialNumber !== this.bitstream.serialNumber) { + // Page is valid but from a different bitstream, so keep searching forward until we find one + // belonging to the our bitstream + searchStartPos = page.headerStartPos + page.totalSize; + continue; + } + const isContinuationPage = page.granulePosition === -1; + if (isContinuationPage) { + // No packet ends on this page - keep looking + searchStartPos = page.headerStartPos + page.totalSize; + continue; + } + // The page is valid and belongs to our bitstream; let's check its granule position to see where we + // need to take the bisection search. + if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) high = page.headerStartPos; + else { + lowPage = page; + lowPages.push(page); + } + continue outer; + } + } + // Now we have the last page with a packet position <= the packet position we're looking for, but there + // might be multiple pages with the packet position, in which case we actually need to find the first of + // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet + // position, and then linear scan ourselves forward until we find the correct page. + let lowerPage = startPosition.startPage; + for (const otherLowPage of lowPages){ + if (otherLowPage.granulePosition === lowPage.granulePosition) break; + if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) lowerPage = otherLowPage; + } + let currentPage = lowerPage; + // Keep track of the pages we traversed, we need these later for backwards seeking + const previousPages = [ + currentPage + ]; + while(true){ + // This loop must terminate as we'll eventually reach lowPage + if (currentPage.serialNumber === this.bitstream.serialNumber && currentPage.granulePosition === lowPage.granulePosition) break; + const nextPos = currentPage.headerStartPos + currentPage.totalSize; + let slice = this.demuxer.reader.requestSliceRange(nextPos, (0, _oggReaderJs.MIN_PAGE_HEADER_SIZE), (0, _oggReaderJs.MAX_PAGE_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + const nextPage = (0, _oggReaderJs.readPageHeader)(slice); + (0, _miscJs.assert)(nextPage); + currentPage = nextPage; + if (currentPage.serialNumber === this.bitstream.serialNumber) previousPages.push(currentPage); + } + (0, _miscJs.assert)(currentPage.granulePosition !== -1); + let currentSegmentIndex = null; + let currentTimestampInSamples; + let currentTimestampIsCorrect; + // These indicate the end position of the packet that the granule position belongs to + let endPage = currentPage; + let endSegmentIndex = 0; + if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) { + currentTimestampInSamples = this.granulePositionToTimestampInSamples(0); + currentTimestampIsCorrect = true; + currentSegmentIndex = 0; + } else { + currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can + currentTimestampIsCorrect = false; + // Find the segment index of the next packet + for(let i = currentPage.lacingValues.length - 1; i >= 0; i--){ + const value = currentPage.lacingValues[i]; + if (value < 255) { + // We know the last packet ended at i, so the next one starts at i + 1 + currentSegmentIndex = i + 1; + break; + } + } + // This must hold: Since this page has a granule position set, that means there must be a packet that + // ends in this page. + if (currentSegmentIndex === null) throw new Error('Invalid page with granule position: no packets end on this page.'); + endSegmentIndex = currentSegmentIndex - 1; + const pseudopacket = { + data: (0, _packetJs.PLACEHOLDER_DATA), + endPage, + endSegmentIndex + }; + const nextPosition = await this.demuxer.findNextPacketStart(pseudopacket); + if (nextPosition) { + // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute + // the duration for the packet we're looking for. + const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex); + (0, _miscJs.assert)(endPosition); + const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex); + if (startPosition) { + currentPage = startPosition.page; + currentSegmentIndex = startPosition.segmentIndex; + } + } else // There is no next position, which means we're looking for the last packet in the bitstream. The + // granule position on the last page tends to be fucky, so let's instead start the search on the + // page before that. So let's loop until we find a packet that ends in a previous page. + while(true){ + const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex); + if (!endPosition) break; + const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex); + if (!startPosition) break; + currentPage = startPosition.page; + currentSegmentIndex = startPosition.segmentIndex; + if (endPosition.page.headerStartPos !== endPage.headerStartPos) { + endPage = endPosition.page; + endSegmentIndex = endPosition.segmentIndex; + break; + } + } + } + let lastEncodedPacket = null; + let lastEncodedPacketMetadata = null; + // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the + // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for. + while(currentPage !== null){ + (0, _miscJs.assert)(currentSegmentIndex !== null); + const packet = await this.demuxer.readPacket(currentPage, currentSegmentIndex); + if (!packet) break; + // We might need to skip the packet if it's a metadata one + const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos && currentSegmentIndex < startPosition.startSegmentIndex; + if (!skipPacket) { + let encodedPacket = this.createEncodedPacketFromOggPacket(packet, { + timestampInSamples: currentTimestampInSamples, + vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null + }, options); + (0, _miscJs.assert)(encodedPacket); + let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket); + (0, _miscJs.assert)(encodedPacketMetadata); + if (!currentTimestampIsCorrect && packet.endPage.headerStartPos === endPage.headerStartPos && packet.endSegmentIndex === endSegmentIndex) { + // We know this packet end timestamp can be derived from the page's granule position + currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition); + currentTimestampIsCorrect = true; + // Let's backpatch the packet we just created with the correct timestamp + encodedPacket = this.createEncodedPacketFromOggPacket(packet, { + timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples, + vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null + }, options); + (0, _miscJs.assert)(encodedPacket); + encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket); + (0, _miscJs.assert)(encodedPacketMetadata); + } else currentTimestampInSamples += encodedPacketMetadata.durationInSamples; + lastEncodedPacket = encodedPacket; + lastEncodedPacketMetadata = encodedPacketMetadata; + if (currentTimestampIsCorrect && // Next timestamp will be too late + (Math.max(currentTimestampInSamples, 0) > timestampInSamples || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) break; + } + const nextPosition = await this.demuxer.findNextPacketStart(packet); + if (!nextPosition) break; + currentPage = nextPosition.startPage; + currentSegmentIndex = nextPosition.startSegmentIndex; + } + return lastEncodedPacket; + } + // A slower but simpler and sequential algorithm for finding a packet in a file + async getPacketSequential(timestamp, options) { + const release = await this.sequentialScanMutex.acquire(); // Requires exclusivity because we write to a cache + try { + const timestampInSamples = (0, _miscJs.roundIfAlmostInteger)(timestamp * this.internalSampleRate); + timestamp = timestampInSamples / this.internalSampleRate; + const index = (0, _miscJs.binarySearchLessOrEqual)(this.sequentialScanCache, timestampInSamples, (x)=>x.timestampInSamples); + let currentPacket; + if (index !== -1) { + // We don't need to start from the beginning, we can start at a previous scan point + const cacheEntry = this.sequentialScanCache[index]; + currentPacket = this.createEncodedPacketFromOggPacket(cacheEntry.packet, { + timestampInSamples: cacheEntry.timestampInSamples, + vorbisLastBlocksize: cacheEntry.vorbisLastBlockSize + }, options); + } else currentPacket = await this.getFirstPacket(options); + let i = 0; + while(currentPacket && currentPacket.timestamp < timestamp){ + const nextPacket = await this.getNextPacket(currentPacket, options); + if (!nextPacket || nextPacket.timestamp > timestamp) break; + currentPacket = nextPacket; + i++; + if (i === 100) { + // Add "checkpoints" every once in a while to speed up subsequent random accesses + i = 0; + const metadata = this.encodedPacketToMetadata.get(currentPacket); + (0, _miscJs.assert)(metadata); + if (this.sequentialScanCache.length > 0) // If we reach this case, we must be at the end of the cache + (0, _miscJs.assert)((0, _miscJs.last)(this.sequentialScanCache).timestampInSamples <= metadata.timestampInSamples); + this.sequentialScanCache.push(metadata); + } + } + return currentPacket; + } finally{ + release(); + } + } + getKeyPacket(timestamp, options) { + return this.getPacket(timestamp, options); + } + getNextKeyPacket(packet, options) { + return this.getNextPacket(packet, options); + } +} +/** Finds the start position of a packet given its end position. */ const findPacketStartPosition = (pageList, endPage, endSegmentIndex)=>{ + let page = endPage; + let segmentIndex = endSegmentIndex; + outer: while(true){ + segmentIndex--; + for(segmentIndex; segmentIndex >= 0; segmentIndex--){ + const lacingValue = page.lacingValues[segmentIndex]; + if (lacingValue < 255) { + segmentIndex++; // We know the last packet starts here + break outer; + } + } + (0, _miscJs.assert)(segmentIndex === -1); + const pageStartsWithFreshPacket = !(page.headerType & 0x01); + if (pageStartsWithFreshPacket) { + // Fast exit: We know we don't need to look in the previous page + segmentIndex = 0; + break; + } + const previousPage = (0, _miscJs.findLast)(pageList, (x)=>x.headerStartPos < page.headerStartPos); + if (!previousPage) return null; + page = previousPage; + segmentIndex = page.lacingValues.length; + } + (0, _miscJs.assert)(segmentIndex !== -1); + if (segmentIndex === page.lacingValues.length) { + // Wrap back around to the first segment of the next page + const nextPage = pageList[pageList.indexOf(page) + 1]; + (0, _miscJs.assert)(nextPage); + page = nextPage; + segmentIndex = 0; + } + return { + page, + segmentIndex + }; +}; +/** Finds the end position of a packet given the start position of the following packet. */ const findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex)=>{ + if (startSegmentIndex > 0) // Easy + return { + page: startPage, + segmentIndex: startSegmentIndex - 1 + }; + const previousPage = (0, _miscJs.findLast)(pageList, (x)=>x.headerStartPos < startPage.headerStartPos); + if (!previousPage) return null; + return { + page: previousPage, + segmentIndex: previousPage.lacingValues.length - 1 + }; +}; + +},{"../codec.js":"4oSIO","../codec-data.js":"bzpVB","../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../metadata.js":"3j8h1","../misc.js":"kkhLS","../packet.js":"esYjd","../reader.js":"fr2Ka","./ogg-misc.js":"dss71","./ogg-reader.js":"6KPbV","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"dss71":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "OGGS", ()=>OGGS); +parcelHelpers.export(exports, "computeOggPageCrc", ()=>computeOggPageCrc); +parcelHelpers.export(exports, "extractSampleMetadata", ()=>extractSampleMetadata); +parcelHelpers.export(exports, "buildOggMimeType", ()=>buildOggMimeType); +var _codecDataJs = require("../codec-data.js"); +var _miscJs = require("../misc.js"); +const OGGS = 0x5367674f; // 'OggS' +const OGG_CRC_POLYNOMIAL = 0x04c11db7; +const OGG_CRC_TABLE = new Uint32Array(256); +for(let n = 0; n < 256; n++){ + let crc = n << 24; + for(let k = 0; k < 8; k++)crc = crc & 0x80000000 ? crc << 1 ^ OGG_CRC_POLYNOMIAL : crc << 1; + OGG_CRC_TABLE[n] = crc >>> 0 & 0xffffffff; +} +const computeOggPageCrc = (bytes)=>{ + const view = (0, _miscJs.toDataView)(bytes); + const originalChecksum = view.getUint32(22, true); + view.setUint32(22, 0, true); // Zero out checksum field + let crc = 0; + for(let i = 0; i < bytes.length; i++){ + const byte = bytes[i]; + crc = (crc << 8 ^ OGG_CRC_TABLE[crc >>> 24 ^ byte]) >>> 0; + } + view.setUint32(22, originalChecksum, true); // Restore checksum field + return crc; +}; +const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize)=>{ + let durationInSamples = 0; + let currentBlocksize = null; + if (data.length > 0) { + // To know sample duration, we'll need to peak inside the packet + if (codecInfo.codec === 'vorbis') { + (0, _miscJs.assert)(codecInfo.vorbisInfo); + const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length; + const bitCount = (0, _miscJs.ilog)(vorbisModeCount - 1); + const modeMask = (1 << bitCount) - 1 << 1; + const modeNumber = (data[0] & modeMask) >> 1; + if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) throw new Error('Invalid mode number.'); + // In Vorbis, packet duration also depends on the blocksize of the previous packet + let prevBlocksize = vorbisLastBlocksize; + const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber]; + currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag]; + if (blockflag === 1) { + const prevMask = (modeMask | 0x1) + 1; + const flag = data[0] & prevMask ? 1 : 0; + prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag]; + } + durationInSamples = prevBlocksize !== null ? prevBlocksize + currentBlocksize >> 2 : 0; // The first sample outputs no audio data and therefore has a duration of 0 + } else if (codecInfo.codec === 'opus') { + const toc = (0, _codecDataJs.parseOpusTocByte)(data); + durationInSamples = toc.durationInSamples; + } + } + return { + durationInSamples, + vorbisBlockSize: currentBlocksize + }; +}; +const buildOggMimeType = (info)=>{ + let string = 'audio/ogg'; + if (info.codecStrings) { + const uniqueCodecMimeTypes = [ + ...new Set(info.codecStrings) + ]; + string += `; codecs="${uniqueCodecMimeTypes.join(', ')}"`; + } + return string; +}; + +},{"../codec-data.js":"bzpVB","../misc.js":"kkhLS","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"6KPbV":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "MIN_PAGE_HEADER_SIZE", ()=>MIN_PAGE_HEADER_SIZE); +parcelHelpers.export(exports, "MAX_PAGE_HEADER_SIZE", ()=>MAX_PAGE_HEADER_SIZE); +parcelHelpers.export(exports, "MAX_PAGE_SIZE", ()=>MAX_PAGE_SIZE); +parcelHelpers.export(exports, "readPageHeader", ()=>readPageHeader); +parcelHelpers.export(exports, "findNextPageHeader", ()=>findNextPageHeader); +var _readerJs = require("../reader.js"); +var _oggMiscJs = require("./ogg-misc.js"); +const MIN_PAGE_HEADER_SIZE = 27; +const MAX_PAGE_HEADER_SIZE = 282; +const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 65025; +const readPageHeader = (slice)=>{ + const startPos = slice.filePos; + const capturePattern = (0, _readerJs.readU32Le)(slice); + if (capturePattern !== (0, _oggMiscJs.OGGS)) return null; + slice.skip(1); // Version + const headerType = (0, _readerJs.readU8)(slice); + const granulePosition = (0, _readerJs.readI64Le)(slice); + const serialNumber = (0, _readerJs.readU32Le)(slice); + const sequenceNumber = (0, _readerJs.readU32Le)(slice); + const checksum = (0, _readerJs.readU32Le)(slice); + const numberPageSegments = (0, _readerJs.readU8)(slice); + const lacingValues = new Uint8Array(numberPageSegments); + for(let i = 0; i < numberPageSegments; i++)lacingValues[i] = (0, _readerJs.readU8)(slice); + const headerSize = 27 + numberPageSegments; + const dataSize = lacingValues.reduce((a, b)=>a + b, 0); + const totalSize = headerSize + dataSize; + return { + headerStartPos: startPos, + totalSize, + dataStartPos: startPos + headerSize, + dataSize, + headerType, + granulePosition, + serialNumber, + sequenceNumber, + checksum, + lacingValues + }; +}; +const findNextPageHeader = (slice, until)=>{ + while(slice.filePos < until - 3){ + const word = (0, _readerJs.readU32Le)(slice); + const firstByte = word & 0xff; + const secondByte = word >>> 8 & 0xff; + const thirdByte = word >>> 16 & 0xff; + const fourthByte = word >>> 24 & 0xff; + const O = 0x4f; // 'O' + if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) continue; + slice.skip(-4); + if (word === (0, _oggMiscJs.OGGS)) // We have found the capture pattern + return true; + slice.skip(1); + } + return false; +}; + +},{"../reader.js":"fr2Ka","./ogg-misc.js":"dss71","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"aafYY":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "WaveFormat", ()=>WaveFormat); +parcelHelpers.export(exports, "WaveDemuxer", ()=>WaveDemuxer); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _metadataJs = require("../metadata.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _readerJs = require("../reader.js"); +var _id3Js = require("../id3.js"); +var WaveFormat; +(function(WaveFormat) { + WaveFormat[WaveFormat["PCM"] = 1] = "PCM"; + WaveFormat[WaveFormat["IEEE_FLOAT"] = 3] = "IEEE_FLOAT"; + WaveFormat[WaveFormat["ALAW"] = 6] = "ALAW"; + WaveFormat[WaveFormat["MULAW"] = 7] = "MULAW"; + WaveFormat[WaveFormat["EXTENSIBLE"] = 65534] = "EXTENSIBLE"; +})(WaveFormat || (WaveFormat = {})); +class WaveDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.metadataPromise = null; + this.dataStart = -1; + this.dataSize = -1; + this.audioInfo = null; + this.tracks = []; + this.lastKnownPacketIndex = 0; + this.metadataTags = {}; + this.reader = input._reader; + } + async readMetadata() { + return this.metadataPromise ??= (async ()=>{ + let slice = this.reader.requestSlice(0, 12); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + const riffType = (0, _readerJs.readAscii)(slice, 4); + const littleEndian = riffType !== 'RIFX'; + const isRf64 = riffType === 'RF64'; + const outerChunkSize = (0, _readerJs.readU32)(slice, littleEndian); + let totalFileSize = isRf64 ? this.reader.fileSize : Math.min(outerChunkSize + 8, this.reader.fileSize ?? Infinity); + const format = (0, _readerJs.readAscii)(slice, 4); + if (format !== 'WAVE') throw new Error('Invalid WAVE file - wrong format'); + let chunksRead = 0; + let dataChunkSize = null; + let currentPos = slice.filePos; + while(totalFileSize === null || currentPos < totalFileSize){ + let slice = this.reader.requestSlice(currentPos, 8); + if (slice instanceof Promise) slice = await slice; + if (!slice) break; + const chunkId = (0, _readerJs.readAscii)(slice, 4); + const chunkSize = (0, _readerJs.readU32)(slice, littleEndian); + const startPos = slice.filePos; + if (isRf64 && chunksRead === 0 && chunkId !== 'ds64') throw new Error('Invalid RF64 file: First chunk must be "ds64".'); + if (chunkId === 'fmt ') await this.parseFmtChunk(startPos, chunkSize, littleEndian); + else if (chunkId === 'data') { + dataChunkSize ??= chunkSize; + this.dataStart = slice.filePos; + this.dataSize = Math.min(dataChunkSize, (totalFileSize ?? Infinity) - this.dataStart); + if (this.reader.fileSize === null) break; // Stop once we hit the data chunk + } else if (chunkId === 'ds64') { + // File and data chunk sizes are defined in here instead + let ds64Slice = this.reader.requestSlice(startPos, chunkSize); + if (ds64Slice instanceof Promise) ds64Slice = await ds64Slice; + if (!ds64Slice) break; + const riffChunkSize = (0, _readerJs.readU64)(ds64Slice, littleEndian); + dataChunkSize = (0, _readerJs.readU64)(ds64Slice, littleEndian); + totalFileSize = Math.min(riffChunkSize + 8, this.reader.fileSize ?? Infinity); + } else if (chunkId === 'LIST') await this.parseListChunk(startPos, chunkSize, littleEndian); + else if (chunkId === 'ID3 ' || chunkId === 'id3 ') await this.parseId3Chunk(startPos, chunkSize); + currentPos = startPos + chunkSize + (chunkSize & 1); // Handle padding + chunksRead++; + } + if (!this.audioInfo) throw new Error('Invalid WAVE file - missing "fmt " chunk'); + if (this.dataStart === -1) throw new Error('Invalid WAVE file - missing "data" chunk'); + const blockSize = this.audioInfo.blockSizeInBytes; + this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize; + this.tracks.push(new (0, _inputTrackJs.InputAudioTrack)(this.input, new WaveAudioTrackBacking(this))); + })(); + } + async parseFmtChunk(startPos, size, littleEndian) { + let slice = this.reader.requestSlice(startPos, size); + if (slice instanceof Promise) slice = await slice; + if (!slice) return; // File too short + let formatTag = (0, _readerJs.readU16)(slice, littleEndian); + const numChannels = (0, _readerJs.readU16)(slice, littleEndian); + const sampleRate = (0, _readerJs.readU32)(slice, littleEndian); + slice.skip(4); // Bytes per second + const blockAlign = (0, _readerJs.readU16)(slice, littleEndian); + let bitsPerSample; + if (size === 14) bitsPerSample = 8; + else bitsPerSample = (0, _readerJs.readU16)(slice, littleEndian); + // Handle WAVEFORMATEXTENSIBLE + if (size >= 18 && formatTag !== 0x0165) { + const cbSize = (0, _readerJs.readU16)(slice, littleEndian); + const remainingSize = size - 18; + const extensionSize = Math.min(remainingSize, cbSize); + if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) { + // Parse WAVEFORMATEXTENSIBLE + slice.skip(6); + const subFormat = (0, _readerJs.readBytes)(slice, 16); + // Get actual format from subFormat GUID + formatTag = subFormat[0] | subFormat[1] << 8; + } + } + if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) bitsPerSample = 8; + this.audioInfo = { + format: formatTag, + numberOfChannels: numChannels, + sampleRate, + sampleSizeInBytes: Math.ceil(bitsPerSample / 8), + blockSizeInBytes: blockAlign + }; + } + async parseListChunk(startPos, size, littleEndian) { + let slice = this.reader.requestSlice(startPos, size); + if (slice instanceof Promise) slice = await slice; + if (!slice) return; // File too short + const infoType = (0, _readerJs.readAscii)(slice, 4); + if (infoType !== 'INFO' && infoType !== 'INF0') return; // Not an INFO chunk + let currentPos = slice.filePos; + while(currentPos <= startPos + size - 8){ + slice.filePos = currentPos; + const chunkName = (0, _readerJs.readAscii)(slice, 4); + const chunkSize = (0, _readerJs.readU32)(slice, littleEndian); + const bytes = (0, _readerJs.readBytes)(slice, chunkSize); + let stringLength = 0; + for(let i = 0; i < bytes.length; i++){ + if (bytes[i] === 0) break; + stringLength++; + } + const value = String.fromCharCode(...bytes.subarray(0, stringLength)); + this.metadataTags.raw ??= {}; + this.metadataTags.raw[chunkName] = value; + switch(chunkName){ + case 'INAM': + case 'TITL': + this.metadataTags.title ??= value; + break; + case 'TIT3': + this.metadataTags.description ??= value; + break; + case 'IART': + this.metadataTags.artist ??= value; + break; + case 'IPRD': + this.metadataTags.album ??= value; + break; + case 'IPRT': + case 'ITRK': + case 'TRCK': + { + const parts = value.split('/'); + const trackNum = Number.parseInt(parts[0], 10); + const tracksTotal = parts[1] && Number.parseInt(parts[1], 10); + if (Number.isInteger(trackNum) && trackNum > 0) this.metadataTags.trackNumber ??= trackNum; + if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) this.metadataTags.tracksTotal ??= tracksTotal; + } + break; + case 'ICRD': + case 'IDIT': + { + const date = new Date(value); + if (!Number.isNaN(date.getTime())) this.metadataTags.date ??= date; + } + break; + case 'YEAR': + { + const year = Number.parseInt(value, 10); + if (Number.isInteger(year) && year > 0) this.metadataTags.date ??= new Date(year, 0, 1); + } + break; + case 'IGNR': + case 'GENR': + this.metadataTags.genre ??= value; + break; + case 'ICMT': + case 'CMNT': + case 'COMM': + this.metadataTags.comment ??= value; + break; + } + currentPos += 8 + chunkSize + (chunkSize & 1); // Handle padding + } + } + async parseId3Chunk(startPos, size) { + // Parse ID3 tag embedded in WAV file (non-default, but used a lot in practice anyway) + let slice = this.reader.requestSlice(startPos, size); + if (slice instanceof Promise) slice = await slice; + if (!slice) return; // File too short + const id3V2Header = (0, _id3Js.readId3V2Header)(slice); + if (id3V2Header) { + // Extract the content portion (skip the 10-byte header) + const contentSlice = slice.slice(startPos + 10, id3V2Header.size); + (0, _id3Js.parseId3V2Tag)(contentSlice, id3V2Header, this.metadataTags); + } + } + getCodec() { + (0, _miscJs.assert)(this.audioInfo); + if (this.audioInfo.format === WaveFormat.MULAW) return 'ulaw'; + if (this.audioInfo.format === WaveFormat.ALAW) return 'alaw'; + if (this.audioInfo.format === WaveFormat.PCM) { + // All formats are little-endian + if (this.audioInfo.sampleSizeInBytes === 1) return 'pcm-u8'; + else if (this.audioInfo.sampleSizeInBytes === 2) return 'pcm-s16'; + else if (this.audioInfo.sampleSizeInBytes === 3) return 'pcm-s24'; + else if (this.audioInfo.sampleSizeInBytes === 4) return 'pcm-s32'; + } + if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) { + if (this.audioInfo.sampleSizeInBytes === 4) return 'pcm-f32'; + } + return null; + } + async getMimeType() { + return 'audio/wav'; + } + async computeDuration() { + await this.readMetadata(); + const track = this.tracks[0]; + (0, _miscJs.assert)(track); + return track.computeDuration(); + } + async getTracks() { + await this.readMetadata(); + return this.tracks; + } + async getMetadataTags() { + await this.readMetadata(); + return this.metadataTags; + } +} +const PACKET_SIZE_IN_FRAMES = 2048; +class WaveAudioTrackBacking { + constructor(demuxer){ + this.demuxer = demuxer; + } + getId() { + return 1; + } + getCodec() { + return this.demuxer.getCodec(); + } + getInternalCodecId() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.format; + } + async getDecoderConfig() { + const codec = this.demuxer.getCodec(); + if (!codec) return null; + (0, _miscJs.assert)(this.demuxer.audioInfo); + return { + codec, + numberOfChannels: this.demuxer.audioInfo.numberOfChannels, + sampleRate: this.demuxer.audioInfo.sampleRate + }; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + getNumberOfChannels() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.numberOfChannels; + } + getSampleRate() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.sampleRate; + } + getTimeResolution() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.sampleRate; + } + getName() { + return null; + } + getLanguageCode() { + return 0, _miscJs.UNDETERMINED_LANGUAGE; + } + getDisposition() { + return { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }; + } + async getFirstTimestamp() { + return 0; + } + async getPacketAtIndex(packetIndex, options) { + (0, _miscJs.assert)(this.demuxer.audioInfo); + const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes; + if (startOffset >= this.demuxer.dataSize) return null; + const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset); + if (this.demuxer.reader.fileSize === null) { + // If the file size is unknown, we weren't able to cap the dataSize in the init logic and we instead have to + // rely on the headers telling us how large the file is. But, these might be wrong, so let's check if the + // requested slice actually exists. + let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; + } + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes); + if (slice instanceof Promise) slice = await slice; + (0, _miscJs.assert)(slice); + data = (0, _readerJs.readBytes)(slice, sizeInBytes); + } + const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate; + const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate; + this.demuxer.lastKnownPacketIndex = Math.max(packetIndex, timestamp); + return new (0, _packetJs.EncodedPacket)(data, 'key', timestamp, duration, packetIndex, sizeInBytes); + } + getFirstPacket(options) { + return this.getPacketAtIndex(0, options); + } + async getPacket(timestamp, options) { + (0, _miscJs.assert)(this.demuxer.audioInfo); + const packetIndex = Math.floor(Math.min(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES, (this.demuxer.dataSize - 1) / (PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes))); + const packet = await this.getPacketAtIndex(packetIndex, options); + if (packet) return packet; + if (packetIndex === 0) return null; // Empty data chunk + (0, _miscJs.assert)(this.demuxer.reader.fileSize === null); + // The file is shorter than we thought, meaning the packet we were looking for doesn't exist. So, let's find + // the last packet by doing a sequential scan, instead. + let currentPacket = await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex, options); + while(currentPacket){ + const nextPacket = await this.getNextPacket(currentPacket, options); + if (!nextPacket) break; + currentPacket = nextPacket; + } + return currentPacket; + } + getNextPacket(packet, options) { + (0, _miscJs.assert)(this.demuxer.audioInfo); + const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES); + return this.getPacketAtIndex(packetIndex + 1, options); + } + getKeyPacket(timestamp, options) { + return this.getPacket(timestamp, options); + } + getNextKeyPacket(packet, options) { + return this.getNextPacket(packet, options); + } +} + +},{"../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../metadata.js":"3j8h1","../misc.js":"kkhLS","../packet.js":"esYjd","../reader.js":"fr2Ka","../id3.js":"5tvk3","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"jOxJW":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "MIN_FRAME_HEADER_SIZE", ()=>MIN_FRAME_HEADER_SIZE); +parcelHelpers.export(exports, "MAX_FRAME_HEADER_SIZE", ()=>MAX_FRAME_HEADER_SIZE); +parcelHelpers.export(exports, "readFrameHeader", ()=>readFrameHeader); +var _miscJs = require("../misc.js"); +var _readerJs = require("../reader.js"); +const MIN_FRAME_HEADER_SIZE = 7; +const MAX_FRAME_HEADER_SIZE = 9; +const readFrameHeader = (slice)=>{ + // https://wiki.multimedia.cx/index.php/ADTS (last visited: 2025/08/17) + const startPos = slice.filePos; + const bytes = (0, _readerJs.readBytes)(slice, 9); // 9 with CRC, 7 without CRC + const bitstream = new (0, _miscJs.Bitstream)(bytes); + const syncword = bitstream.readBits(12); + if (syncword !== 4095) return null; + bitstream.skipBits(1); // MPEG version + const layer = bitstream.readBits(2); + if (layer !== 0) return null; + const protectionAbsence = bitstream.readBits(1); + const objectType = bitstream.readBits(2) + 1; + const samplingFrequencyIndex = bitstream.readBits(4); + if (samplingFrequencyIndex === 15) return null; + bitstream.skipBits(1); // Private bit + const channelConfiguration = bitstream.readBits(3); + if (channelConfiguration === 0) throw new Error('ADTS frames with channel configuration 0 are not supported.'); + bitstream.skipBits(1); // Originality + bitstream.skipBits(1); // Home + bitstream.skipBits(1); // Copyright ID bit + bitstream.skipBits(1); // Copyright ID start + const frameLength = bitstream.readBits(13); + bitstream.skipBits(11); // Buffer fullness + const numberOfAacFrames = bitstream.readBits(2) + 1; + if (numberOfAacFrames !== 1) throw new Error('ADTS frames with more than one AAC frame are not supported.'); + let crcCheck = null; + if (protectionAbsence === 1) slice.filePos -= 2; + else crcCheck = bitstream.readBits(16); + return { + objectType, + samplingFrequencyIndex, + channelConfiguration, + frameLength, + numberOfAacFrames, + crcCheck, + startPos + }; +}; + +},{"../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"fMkVV":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "AdtsDemuxer", ()=>AdtsDemuxer); +var _codecJs = require("../codec.js"); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _readerJs = require("../reader.js"); +var _metadataJs = require("../metadata.js"); +var _adtsReaderJs = require("./adts-reader.js"); +const SAMPLES_PER_AAC_FRAME = 1024; +class AdtsDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.metadataPromise = null; + this.firstFrameHeader = null; + this.loadedSamples = []; + this.tracks = []; + this.readingMutex = new (0, _miscJs.AsyncMutex)(); + this.lastSampleLoaded = false; + this.lastLoadedPos = 0; + this.nextTimestampInSamples = 0; + this.reader = input._reader; + } + async readMetadata() { + return this.metadataPromise ??= (async ()=>{ + // Keep loading until we find the first frame header + while(!this.firstFrameHeader && !this.lastSampleLoaded)await this.advanceReader(); + // There has to be a frame if this demuxer got selected + (0, _miscJs.assert)(this.firstFrameHeader); + // Create the single audio track + this.tracks = [ + new (0, _inputTrackJs.InputAudioTrack)(this.input, new AdtsAudioTrackBacking(this)) + ]; + })(); + } + async advanceReader() { + let slice = this.reader.requestSliceRange(this.lastLoadedPos, (0, _adtsReaderJs.MIN_FRAME_HEADER_SIZE), (0, _adtsReaderJs.MAX_FRAME_HEADER_SIZE)); + if (slice instanceof Promise) slice = await slice; + if (!slice) { + this.lastSampleLoaded = true; + return; + } + const header = (0, _adtsReaderJs.readFrameHeader)(slice); + if (!header) { + this.lastSampleLoaded = true; + return; + } + if (this.reader.fileSize !== null && header.startPos + header.frameLength > this.reader.fileSize) { + // Frame doesn't fit in the rest of the file + this.lastSampleLoaded = true; + return; + } + if (!this.firstFrameHeader) this.firstFrameHeader = header; + const sampleRate = (0, _codecJs.aacFrequencyTable)[header.samplingFrequencyIndex]; + (0, _miscJs.assert)(sampleRate !== undefined); + const sampleDuration = SAMPLES_PER_AAC_FRAME / sampleRate; + const headerSize = header.crcCheck ? (0, _adtsReaderJs.MAX_FRAME_HEADER_SIZE) : (0, _adtsReaderJs.MIN_FRAME_HEADER_SIZE); + const sample = { + timestamp: this.nextTimestampInSamples / sampleRate, + duration: sampleDuration, + dataStart: header.startPos + headerSize, + dataSize: header.frameLength - headerSize + }; + this.loadedSamples.push(sample); + this.nextTimestampInSamples += SAMPLES_PER_AAC_FRAME; + this.lastLoadedPos = header.startPos + header.frameLength; + } + async getMimeType() { + return 'audio/aac'; + } + async getTracks() { + await this.readMetadata(); + return this.tracks; + } + async computeDuration() { + await this.readMetadata(); + const track = this.tracks[0]; + (0, _miscJs.assert)(track); + return track.computeDuration(); + } + async getMetadataTags() { + return {}; // No tags in this one + } +} +class AdtsAudioTrackBacking { + constructor(demuxer){ + this.demuxer = demuxer; + } + getId() { + return 1; + } + async getFirstTimestamp() { + return 0; + } + getTimeResolution() { + const sampleRate = this.getSampleRate(); + return sampleRate / SAMPLES_PER_AAC_FRAME; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + getName() { + return null; + } + getLanguageCode() { + return 0, _miscJs.UNDETERMINED_LANGUAGE; + } + getCodec() { + return 'aac'; + } + getInternalCodecId() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + return this.demuxer.firstFrameHeader.objectType; + } + getNumberOfChannels() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + const numberOfChannels = (0, _codecJs.aacChannelMap)[this.demuxer.firstFrameHeader.channelConfiguration]; + (0, _miscJs.assert)(numberOfChannels !== undefined); + return numberOfChannels; + } + getSampleRate() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + const sampleRate = (0, _codecJs.aacFrequencyTable)[this.demuxer.firstFrameHeader.samplingFrequencyIndex]; + (0, _miscJs.assert)(sampleRate !== undefined); + return sampleRate; + } + getDisposition() { + return { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }; + } + async getDecoderConfig() { + (0, _miscJs.assert)(this.demuxer.firstFrameHeader); + const bytes = new Uint8Array(3); // 19 bits max + const bitstream = new (0, _miscJs.Bitstream)(bytes); + const { objectType, samplingFrequencyIndex, channelConfiguration } = this.demuxer.firstFrameHeader; + if (objectType > 31) { + bitstream.writeBits(5, 31); + bitstream.writeBits(6, objectType - 32); + } else bitstream.writeBits(5, objectType); + bitstream.writeBits(4, samplingFrequencyIndex); // samplingFrequencyIndex === 15 is forbidden + bitstream.writeBits(4, channelConfiguration); + return { + codec: `mp4a.40.${this.demuxer.firstFrameHeader.objectType}`, + numberOfChannels: this.getNumberOfChannels(), + sampleRate: this.getSampleRate(), + description: bytes.subarray(0, Math.ceil((bitstream.pos - 1) / 8)) + }; + } + async getPacketAtIndex(sampleIndex, options) { + if (sampleIndex === -1) return null; + const rawSample = this.demuxer.loadedSamples[sampleIndex]; + if (!rawSample) return null; + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; // Data didn't fit into the rest of the file + data = (0, _readerJs.readBytes)(slice, rawSample.dataSize); + } + return new (0, _packetJs.EncodedPacket)(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize); + } + getFirstPacket(options) { + return this.getPacketAtIndex(0, options); + } + async getNextPacket(packet, options) { + const release = await this.demuxer.readingMutex.acquire(); + try { + const sampleIndex = (0, _miscJs.binarySearchExact)(this.demuxer.loadedSamples, packet.timestamp, (x)=>x.timestamp); + if (sampleIndex === -1) throw new Error('Packet was not created from this track.'); + const nextIndex = sampleIndex + 1; + // Ensure the next sample exists + while(nextIndex >= this.demuxer.loadedSamples.length && !this.demuxer.lastSampleLoaded)await this.demuxer.advanceReader(); + return this.getPacketAtIndex(nextIndex, options); + } finally{ + release(); + } + } + async getPacket(timestamp, options) { + const release = await this.demuxer.readingMutex.acquire(); + try { + while(true){ + const index = (0, _miscJs.binarySearchLessOrEqual)(this.demuxer.loadedSamples, timestamp, (x)=>x.timestamp); + if (index === -1 && this.demuxer.loadedSamples.length > 0) // We're before the first sample + return null; + if (this.demuxer.lastSampleLoaded) // All data is loaded, return what we found + return this.getPacketAtIndex(index, options); + if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) // The next packet also exists, we're done + return this.getPacketAtIndex(index, options); + // Otherwise, keep loading data + await this.demuxer.advanceReader(); + } + } finally{ + release(); + } + } + getKeyPacket(timestamp, options) { + return this.getPacket(timestamp, options); + } + getNextKeyPacket(packet, options) { + return this.getNextPacket(packet, options); + } +} + +},{"../codec.js":"4oSIO","../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../misc.js":"kkhLS","../packet.js":"esYjd","../reader.js":"fr2Ka","../metadata.js":"3j8h1","./adts-reader.js":"jOxJW","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"kBazS":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "FlacDemuxer", ()=>FlacDemuxer); +var _codecDataJs = require("../codec-data.js"); +var _demuxerJs = require("../demuxer.js"); +var _inputTrackJs = require("../input-track.js"); +var _miscJs = require("../misc.js"); +var _packetJs = require("../packet.js"); +var _readerJs = require("../reader.js"); +var _metadataJs = require("../metadata.js"); +var _flacMiscJs = require("./flac-misc.js"); +class FlacDemuxer extends (0, _demuxerJs.Demuxer) { + constructor(input){ + super(input); + this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos + this.metadataPromise = null; + this.track = null; + this.metadataTags = {}; + this.audioInfo = null; + this.lastLoadedPos = null; + this.blockingBit = null; + this.readingMutex = new (0, _miscJs.AsyncMutex)(); + this.lastSampleLoaded = false; + this.reader = input._reader; + } + async computeDuration() { + await this.readMetadata(); + (0, _miscJs.assert)(this.track); + return this.track.computeDuration(); + } + async getMetadataTags() { + await this.readMetadata(); + return this.metadataTags; + } + async getTracks() { + await this.readMetadata(); + (0, _miscJs.assert)(this.track); + return [ + this.track + ]; + } + async getMimeType() { + return 'audio/flac'; + } + async readMetadata() { + let currentPos = 4; // Skip 'fLaC' + return this.metadataPromise ??= (async ()=>{ + while(this.reader.fileSize === null || currentPos < this.reader.fileSize){ + let sizeSlice = this.reader.requestSlice(currentPos, 4); + if (sizeSlice instanceof Promise) sizeSlice = await sizeSlice; + currentPos += 4; + if (sizeSlice === null) throw new Error(`Metadata block at position ${currentPos} is too small! Corrupted file.`); + (0, _miscJs.assert)(sizeSlice); + const byte = (0, _readerJs.readU8)(sizeSlice); // first bit: isLastMetadata, remaining 7 bits: metaBlockType + const size = (0, _readerJs.readU24Be)(sizeSlice); + const isLastMetadata = (byte & 0x80) !== 0; + const metaBlockType = byte & 0x7f; + switch(metaBlockType){ + case (0, _codecDataJs.FlacBlockType).STREAMINFO: + { + // Parse streaminfo block + // https://www.rfc-editor.org/rfc/rfc9639.html#section-8.2 + let streamInfoBlock = this.reader.requestSlice(currentPos, size); + if (streamInfoBlock instanceof Promise) streamInfoBlock = await streamInfoBlock; + (0, _miscJs.assert)(streamInfoBlock); + if (streamInfoBlock === null) throw new Error(`StreamInfo block at position ${currentPos} is too small! Corrupted file.`); + const streamInfoBytes = (0, _readerJs.readBytes)(streamInfoBlock, 34); + const bitstream = new (0, _miscJs.Bitstream)(streamInfoBytes); + const minimumBlockSize = bitstream.readBits(16); + const maximumBlockSize = bitstream.readBits(16); + const minimumFrameSize = bitstream.readBits(24); + const maximumFrameSize = bitstream.readBits(24); + const sampleRate = bitstream.readBits(20); + const numberOfChannels = bitstream.readBits(3) + 1; + bitstream.readBits(5); // bitsPerSample - 1 + const totalSamples = bitstream.readBits(36); + // https://www.w3.org/TR/webcodecs-flac-codec-registration/#audiodecoderconfig-description + // description is required, and has to be the following: + // 1. The bytes 0x66 0x4C 0x61 0x43 ("fLaC" in ASCII) + // 2. A metadata block (called the STREAMINFO block) as described in section 7 of [FLAC] + // 3. Optionaly (sic) other metadata blocks, that are not used by the specification + bitstream.skipBits(128); // md5 hash + const description = new Uint8Array(42); + // 1. "fLaC" + description.set(new Uint8Array([ + 0x66, + 0x4c, + 0x61, + 0x43 + ]), 0); + // 2. STREAMINFO block + description.set(new Uint8Array([ + 128, + 0, + 0, + 34 + ]), 4); + // 3. Other metadata blocks + description.set(streamInfoBytes, 8); + this.audioInfo = { + numberOfChannels, + sampleRate, + totalSamples, + minimumBlockSize, + maximumBlockSize, + minimumFrameSize, + maximumFrameSize, + description + }; + this.track = new (0, _inputTrackJs.InputAudioTrack)(this.input, new FlacAudioTrackBacking(this)); + break; + } + case (0, _codecDataJs.FlacBlockType).VORBIS_COMMENT: + { + // Parse vorbis comment block + // https://www.rfc-editor.org/rfc/rfc9639.html#name-vorbis-comment + let vorbisCommentBlock = this.reader.requestSlice(currentPos, size); + if (vorbisCommentBlock instanceof Promise) vorbisCommentBlock = await vorbisCommentBlock; + (0, _miscJs.assert)(vorbisCommentBlock); + (0, _codecDataJs.readVorbisComments)((0, _readerJs.readBytes)(vorbisCommentBlock, size), this.metadataTags); + break; + } + case (0, _codecDataJs.FlacBlockType).PICTURE: + { + // Parse picture block + // https://www.rfc-editor.org/rfc/rfc9639.html#name-picture + let pictureBlock = this.reader.requestSlice(currentPos, size); + if (pictureBlock instanceof Promise) pictureBlock = await pictureBlock; + (0, _miscJs.assert)(pictureBlock); + const pictureType = (0, _readerJs.readU32Be)(pictureBlock); + const mediaTypeLength = (0, _readerJs.readU32Be)(pictureBlock); + const mediaType = (0, _miscJs.textDecoder).decode((0, _readerJs.readBytes)(pictureBlock, mediaTypeLength)); + const descriptionLength = (0, _readerJs.readU32Be)(pictureBlock); + const description = (0, _miscJs.textDecoder).decode((0, _readerJs.readBytes)(pictureBlock, descriptionLength)); + pictureBlock.skip(16); // Skip width, height, color depth, number of indexed colors + const dataLength = (0, _readerJs.readU32Be)(pictureBlock); + const data = (0, _readerJs.readBytes)(pictureBlock, dataLength); + this.metadataTags.images ??= []; + this.metadataTags.images.push({ + data, + mimeType: mediaType, + // https://www.rfc-editor.org/rfc/rfc9639.html#table13 + kind: pictureType === 3 ? 'coverFront' : pictureType === 4 ? 'coverBack' : 'unknown', + description + }); + break; + } + default: + break; + } + currentPos += size; + if (isLastMetadata) { + this.lastLoadedPos = currentPos; + break; + } + } + })(); + } + async readNextFlacFrame({ startPos, isFirstPacket }) { + (0, _miscJs.assert)(this.audioInfo); + // we expect that there are at least `minimumFrameSize` bytes left in the file + // Ideally we also want to validate the next header is valid + // to throw out an accidential sync word + // The shortest valid FLAC header I can think of, based off the code + // of readFlacFrameHeader: + // 4 bytes used for bitstream from syncword to bit depth + // 1 byte coded number + // (uncommon values, no bytes read) + // 1 byte crc + // --> 6 bytes + const minimumHeaderLength = 6; + // If we read everything in readFlacFrameHeader, we read 16 bytes + const maximumHeaderSize = 16; + const maximumSliceLength = this.audioInfo.maximumFrameSize + maximumHeaderSize; + const slice = await this.reader.requestSliceRange(startPos, this.audioInfo.minimumFrameSize, maximumSliceLength); + if (!slice) return null; + const frameHeader = this.readFlacFrameHeader({ + slice, + isFirstPacket: isFirstPacket + }); + if (!frameHeader) return null; + // We don't know exactly how long the packet is, we only know the `minimumFrameSize` and `maximumFrameSize` + // The packet is over if the next 2 bytes are the sync word followed by a valid header + // or the end of the file is reached + // The next sync word is expected at earliest when `minimumFrameSize` is reached, + // we can skip over anything before that + slice.filePos = startPos + this.audioInfo.minimumFrameSize; + while(true){ + // Reached end of the file, packet is over + if (slice.filePos > slice.end - minimumHeaderLength) return { + num: frameHeader.num, + blockSize: frameHeader.blockSize, + sampleRate: frameHeader.sampleRate, + size: slice.end - startPos, + isLastFrame: true + }; + const nextByte = (0, _readerJs.readU8)(slice); + if (nextByte === 0xff) { + const positionBeforeReading = slice.filePos; + const byteAfterNextByte = (0, _readerJs.readU8)(slice); + const expected = this.blockingBit === 1 ? 249 : 248; + if (byteAfterNextByte !== expected) { + slice.filePos = positionBeforeReading; + continue; + } + slice.skip(-2); + const lengthIfNextFlacFrameHeaderIsLegit = slice.filePos - startPos; + const nextFrameHeader = this.readFlacFrameHeader({ + slice, + isFirstPacket: false + }); + if (!nextFrameHeader) { + slice.filePos = positionBeforeReading; + continue; + } + // Ensure the frameOrSampleNum is consecutive. + // https://github.com/Vanilagy/mediabunny/issues/194 + if (this.blockingBit === 0) // Case A: If the stream is fixed block size, this is the frame number, which increments by 1 + { + if (nextFrameHeader.num - frameHeader.num !== 1) { + slice.filePos = positionBeforeReading; + continue; + } + } else // Case B: If the stream is variable block size, this is the sample number, which increments by + // amount of samples in a frame. + if (nextFrameHeader.num - frameHeader.num !== frameHeader.blockSize) { + slice.filePos = positionBeforeReading; + continue; + } + return { + num: frameHeader.num, + blockSize: frameHeader.blockSize, + sampleRate: frameHeader.sampleRate, + size: lengthIfNextFlacFrameHeaderIsLegit, + isLastFrame: false + }; + } + } + } + readFlacFrameHeader({ slice, isFirstPacket }) { + // In this function, generally it is not safe to throw errors. + // We might end up here because we stumbled upon a syncword, + // but the data might not actually be a FLAC frame, it might be random bitstream + // data, in that case we should return null and continue. + const startOffset = slice.filePos; + // https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1 + // Each frame MUST start on a byte boundary and start with the 15-bit frame + // sync code 0b111111111111100. Following the sync code is the blocking strategy + // bit, which MUST NOT change during the audio stream. + const bytes = (0, _readerJs.readBytes)(slice, 4); + const bitstream = new (0, _miscJs.Bitstream)(bytes); + const bits = bitstream.readBits(15); + if (bits !== 32764) // This cannot be a valid FLAC frame, must start with the syncword + return null; + if (this.blockingBit === null) { + (0, _miscJs.assert)(isFirstPacket); + const newBlockingBit = bitstream.readBits(1); + this.blockingBit = newBlockingBit; + } else if (this.blockingBit === 1) { + (0, _miscJs.assert)(!isFirstPacket); + const newBlockingBit = bitstream.readBits(1); + if (newBlockingBit !== 1) // This cannot be a valid FLAC frame, expected 1 but got 0 + return null; + } else if (this.blockingBit === 0) { + (0, _miscJs.assert)(!isFirstPacket); + const newBlockingBit = bitstream.readBits(1); + if (newBlockingBit !== 0) // This cannot be a valid FLAC frame, expected 0 but got 1 + return null; + } else throw new Error('Invalid blocking bit'); + const blockSizeOrUncommon = (0, _flacMiscJs.getBlockSizeOrUncommon)(bitstream.readBits(4)); + if (!blockSizeOrUncommon) // This cannot be a valid FLAC frame, the syncword was just coincidental + return null; + (0, _miscJs.assert)(this.audioInfo); + const sampleRateOrUncommon = (0, _flacMiscJs.getSampleRateOrUncommon)(bitstream.readBits(4), this.audioInfo.sampleRate); + if (!sampleRateOrUncommon) // This cannot be a valid FLAC frame, the syncword was just coincidental + return null; + bitstream.readBits(4); // channel count + bitstream.readBits(3); // bit depth + const reservedZero = bitstream.readBits(1); // reserved zero + if (reservedZero !== 0) // This cannot be a valid FLAC frame, the syncword was just coincidental + return null; + const num = (0, _flacMiscJs.readCodedNumber)(slice); + const blockSize = (0, _flacMiscJs.readBlockSize)(slice, blockSizeOrUncommon); + const sampleRate = (0, _flacMiscJs.readSampleRate)(slice, sampleRateOrUncommon); + if (sampleRate === null) // This cannot be a valid FLAC frame, the syncword was just coincidental + return null; + if (sampleRate !== this.audioInfo.sampleRate) // This cannot be a valid FLAC frame, the sample rate is not the same as in the stream info + return null; + const size = slice.filePos - startOffset; + const crc = (0, _readerJs.readU8)(slice); + slice.skip(-size); + slice.skip(-1); + const crcCalculated = (0, _flacMiscJs.calculateCrc8)((0, _readerJs.readBytes)(slice, size)); + if (crc !== crcCalculated) // Maybe this wasn't a FLAC frame at all, the syncword was just coincidentally + // in the bitstream + return null; + return { + num, + blockSize, + sampleRate + }; + } + async advanceReader() { + await this.readMetadata(); + (0, _miscJs.assert)(this.lastLoadedPos !== null); + (0, _miscJs.assert)(this.audioInfo); + const startPos = this.lastLoadedPos; + const frame = await this.readNextFlacFrame({ + startPos, + isFirstPacket: this.loadedSamples.length === 0 + }); + if (!frame) { + // Unexpected case, failed to read next FLAC frame + // handling gracefully + this.lastSampleLoaded = true; + return; + } + const lastSample = this.loadedSamples[this.loadedSamples.length - 1]; + const blockOffset = lastSample ? lastSample.blockOffset + lastSample.blockSize : 0; + const sample = { + blockOffset, + blockSize: frame.blockSize, + byteOffset: startPos, + byteSize: frame.size + }; + this.lastLoadedPos = this.lastLoadedPos + frame.size; + this.loadedSamples.push(sample); + if (frame.isLastFrame) { + this.lastSampleLoaded = true; + return; + } + } +} +class FlacAudioTrackBacking { + constructor(demuxer){ + this.demuxer = demuxer; + } + getId() { + return 1; + } + getCodec() { + return 'flac'; + } + getInternalCodecId() { + return null; + } + getNumberOfChannels() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.numberOfChannels; + } + async computeDuration() { + const lastPacket = await this.getPacket(Infinity, { + metadataOnly: true + }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); + } + getSampleRate() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.sampleRate; + } + getName() { + return null; + } + getLanguageCode() { + return 0, _miscJs.UNDETERMINED_LANGUAGE; + } + getTimeResolution() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return this.demuxer.audioInfo.sampleRate; + } + getDisposition() { + return { + ...(0, _metadataJs.DEFAULT_TRACK_DISPOSITION) + }; + } + async getFirstTimestamp() { + return 0; + } + async getDecoderConfig() { + (0, _miscJs.assert)(this.demuxer.audioInfo); + return { + codec: 'flac', + numberOfChannels: this.demuxer.audioInfo.numberOfChannels, + sampleRate: this.demuxer.audioInfo.sampleRate, + description: this.demuxer.audioInfo.description + }; + } + async getPacket(timestamp, options) { + (0, _miscJs.assert)(this.demuxer.audioInfo); + if (timestamp < 0) throw new Error('Timestamp cannot be negative'); + const release = await this.demuxer.readingMutex.acquire(); + try { + while(true){ + const packetIndex = (0, _miscJs.binarySearchLessOrEqual)(this.demuxer.loadedSamples, timestamp, (x)=>x.blockOffset / this.demuxer.audioInfo.sampleRate); + if (packetIndex === -1) { + await this.demuxer.advanceReader(); + continue; + } + const packet = this.demuxer.loadedSamples[packetIndex]; + const sampleTimestamp = packet.blockOffset / this.demuxer.audioInfo.sampleRate; + const sampleDuration = packet.blockSize / this.demuxer.audioInfo.sampleRate; + if (sampleTimestamp + sampleDuration <= timestamp) { + if (this.demuxer.lastSampleLoaded) return this.getPacketAtIndex(this.demuxer.loadedSamples.length - 1, options); + await this.demuxer.advanceReader(); + continue; + } + return this.getPacketAtIndex(packetIndex, options); + } + } finally{ + release(); + } + } + async getNextPacket(packet, options) { + const release = await this.demuxer.readingMutex.acquire(); + try { + const nextIndex = packet.sequenceNumber + 1; + if (this.demuxer.lastSampleLoaded && nextIndex >= this.demuxer.loadedSamples.length) return null; + // Ensure the next sample exists + while(nextIndex >= this.demuxer.loadedSamples.length && !this.demuxer.lastSampleLoaded)await this.demuxer.advanceReader(); + return this.getPacketAtIndex(nextIndex, options); + } finally{ + release(); + } + } + getKeyPacket(timestamp, options) { + return this.getPacket(timestamp, options); + } + getNextKeyPacket(packet, options) { + return this.getNextPacket(packet, options); + } + async getPacketAtIndex(sampleIndex, options) { + const rawSample = this.demuxer.loadedSamples[sampleIndex]; + if (!rawSample) return null; + let data; + if (options.metadataOnly) data = (0, _packetJs.PLACEHOLDER_DATA); + else { + let slice = this.demuxer.reader.requestSlice(rawSample.byteOffset, rawSample.byteSize); + if (slice instanceof Promise) slice = await slice; + if (!slice) return null; // Data didn't fit into the rest of the file + data = (0, _readerJs.readBytes)(slice, rawSample.byteSize); + } + (0, _miscJs.assert)(this.demuxer.audioInfo); + const timestamp = rawSample.blockOffset / this.demuxer.audioInfo.sampleRate; + const duration = rawSample.blockSize / this.demuxer.audioInfo.sampleRate; + return new (0, _packetJs.EncodedPacket)(data, 'key', timestamp, duration, sampleIndex, rawSample.byteSize); + } + async getFirstPacket(options) { + // Ensure the next sample exists + while(this.demuxer.loadedSamples.length === 0 && !this.demuxer.lastSampleLoaded)await this.demuxer.advanceReader(); + return this.getPacketAtIndex(0, options); + } +} + +},{"../codec-data.js":"bzpVB","../demuxer.js":"dZcnn","../input-track.js":"dPVVR","../misc.js":"kkhLS","../packet.js":"esYjd","../reader.js":"fr2Ka","../metadata.js":"3j8h1","./flac-misc.js":"66ASt","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"66ASt":[function(require,module,exports,__globalThis) { +/*! + * Copyright (c) 2025-present, Vanilagy and contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "getBlockSizeOrUncommon", ()=>getBlockSizeOrUncommon); +parcelHelpers.export(exports, "getSampleRateOrUncommon", ()=>getSampleRateOrUncommon); +parcelHelpers.export(exports, "readCodedNumber", ()=>readCodedNumber); +parcelHelpers.export(exports, "readBlockSize", ()=>readBlockSize); +parcelHelpers.export(exports, "readSampleRate", ()=>readSampleRate); +parcelHelpers.export(exports, "calculateCrc8", ()=>calculateCrc8); +var _miscJs = require("../misc.js"); +var _readerJs = require("../reader.js"); +const getBlockSizeOrUncommon = (bits)=>{ + if (bits === 0) return null; + else if (bits === 1) return 192; + else if (bits >= 2 && bits <= 5) return 144 * 2 ** bits; + else if (bits === 6) return 'uncommon-u8'; + else if (bits === 7) return 'uncommon-u16'; + else if (bits >= 8 && bits <= 15) return 2 ** bits; + else return null; +}; +const getSampleRateOrUncommon = (sampleRateBits, streamInfoSampleRate)=>{ + switch(sampleRateBits){ + case 0: + return streamInfoSampleRate; + case 1: + return 88200; + case 2: + return 176400; + case 3: + return 192000; + case 4: + return 8000; + case 5: + return 16000; + case 6: + return 22050; + case 7: + return 24000; + case 8: + return 32000; + case 9: + return 44100; + case 10: + return 48000; + case 11: + return 96000; + case 12: + return 'uncommon-u8'; + case 13: + return 'uncommon-u16'; + case 14: + return 'uncommon-u16-10'; + default: + return null; + } +}; +const readCodedNumber = (fileSlice)=>{ + let ones = 0; + const bitstream1 = new (0, _miscJs.Bitstream)((0, _readerJs.readBytes)(fileSlice, 1)); + while(bitstream1.readBits(1) === 1)ones++; + if (ones === 0) return bitstream1.readBits(7); + const bitArray = []; + const extraBytes = ones - 1; + const bitstream2 = new (0, _miscJs.Bitstream)((0, _readerJs.readBytes)(fileSlice, extraBytes)); + const firstByteBits = 8 - ones - 1; + for(let i = 0; i < firstByteBits; i++)bitArray.unshift(bitstream1.readBits(1)); + for(let i = 0; i < extraBytes; i++)for(let j = 0; j < 8; j++){ + const val = bitstream2.readBits(1); + if (j < 2) continue; + bitArray.unshift(val); + } + const encoded = bitArray.reduce((acc, bit, index)=>{ + return acc | bit << index; + }, 0); + return encoded; +}; +const readBlockSize = (slice, blockSizeBits)=>{ + if (blockSizeBits === 'uncommon-u16') return (0, _readerJs.readU16Be)(slice) + 1; + else if (blockSizeBits === 'uncommon-u8') return (0, _readerJs.readU8)(slice) + 1; + else if (typeof blockSizeBits === 'number') return blockSizeBits; + else { + (0, _miscJs.assertNever)(blockSizeBits); + (0, _miscJs.assert)(false); + } +}; +const readSampleRate = (slice, sampleRateOrUncommon)=>{ + if (sampleRateOrUncommon === 'uncommon-u16') return (0, _readerJs.readU16Be)(slice); + if (sampleRateOrUncommon === 'uncommon-u16-10') return (0, _readerJs.readU16Be)(slice) * 10; + if (sampleRateOrUncommon === 'uncommon-u8') return (0, _readerJs.readU8)(slice); + if (typeof sampleRateOrUncommon === 'number') return sampleRateOrUncommon; + return null; +}; +const calculateCrc8 = (data)=>{ + const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0 + let crc = 0x00; // Initialize CRC to 0 + for (const byte of data){ + crc ^= byte; // XOR byte into least significant byte of crc + for(let i = 0; i < 8; i++){ + // For each bit in the byte + if ((crc & 0x80) !== 0) // If the leftmost bit (MSB) is set + crc = crc << 1 ^ polynomial; // Shift left and XOR with polynomial + else crc <<= 1; // Just shift left + crc &= 0xff; // Ensure CRC remains 8-bit + } + } + return crc; +}; + +},{"../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"iSVKr":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>createVideoEngine); +var _mediabunny = require("mediabunny"); +function createVideoEngine({ canvas, ctx, events, timeupdateInterval = 250, avSyncTolerance = 0.12, dropLateFrames = false, poster = '', preflightRange = false }) { + let input = null; + let videoSink = null; + let videoIterator = null; + let nextFrame = null; + let rafId = 0; + let asyncId = 0; + let _width = 0; + let _height = 0; + let _duration = Number.NaN; + let audioClock = null; + let lastTimeUpdate = 0; + let stalled = false; + let playbackRate = 1; + let posterDrawn = false; + function normalizeSource(src) { + if (typeof src === 'string') return new (0, _mediabunny.UrlSource)(src); + if (src instanceof Blob) return new (0, _mediabunny.BlobSource)(src); + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) return new (0, _mediabunny.ReadableStreamSource)(src); + return src; + } + async function preflight(url) { + if (!preflightRange || typeof url !== 'string') return true; + try { + const res = await fetch(url, { + method: 'HEAD' + }); + const acceptRanges = res.headers.get('accept-ranges'); + if (!acceptRanges || acceptRanges === 'none') { + events.emit('error', new Event('RangeNotSupported')); + return false; + } + return true; + } catch (e) { + console.warn('preflight failed', e); + return true; + } + } + function drawPoster() { + if (!poster || posterDrawn) return; + const img = new Image(); + img.onload = ()=>{ + ctx.clearRect(0, 0, canvas.width, canvas.height); + canvas.width = img.naturalWidth || canvas.width; + canvas.height = img.naturalHeight || canvas.height; + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + posterDrawn = true; + }; + img.src = poster; + } + async function stopIterator() { + await videoIterator?.return(); + videoIterator = null; + } + function clear() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + } + async function load(src, onMetadata) { + asyncId++; + const id = asyncId; + await stopIterator(); + clear(); + posterDrawn = false; + if (!await preflight(src)) return; + const source = normalizeSource(src); + if (!source) { + drawPoster(); + return; + } + input = new (0, _mediabunny.Input)({ + source, + formats: (0, _mediabunny.ALL_FORMATS) + }); + _duration = await input.computeDuration(); + if (id !== asyncId) return; + const videoTrack = await input.getPrimaryVideoTrack(); + if (!videoTrack) { + videoSink = null; + _width = 0; + _height = 0; + canvas.width = 0; + canvas.height = 0; + drawPoster(); + if (onMetadata) onMetadata(); + return; + } + if (videoTrack.codec === null || !await videoTrack.canDecode()) { + videoSink = null; + _width = 0; + _height = 0; + canvas.width = 0; + canvas.height = 0; + clear(); + drawPoster(); + if (onMetadata) onMetadata(); + return; + } + const transparent = await videoTrack.canBeTransparent(); + videoSink = new (0, _mediabunny.CanvasSink)(videoTrack, { + poolSize: 2, + fit: 'contain', + alpha: transparent + }); + _width = videoTrack.displayWidth; + _height = videoTrack.displayHeight; + canvas.width = _width; + canvas.height = _height; + if (onMetadata) onMetadata(); + await resetIterator(0); + } + async function resetIterator(time) { + await stopIterator(); + if (!videoSink) return; + videoIterator = videoSink.canvases(time); + const first = (await videoIterator.next()).value ?? null; + const second = (await videoIterator.next()).value ?? null; + nextFrame = second; + if (first) { + ctx.drawImage(first.canvas, 0, 0); + events.emit('loadeddata'); + } else drawPoster(); + } + async function updateNextFrame(localId) { + if (!videoIterator) return; + while(true){ + const frame = (await videoIterator.next()).value ?? null; + if (!frame) return; + if (localId !== asyncId) return; + const t = audioClock.currentTime; + if (dropLateFrames) { + const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate)); + if (frame.timestamp < t - tolerance) continue; + if (frame.timestamp <= t + tolerance) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(frame.canvas, 0, 0); + } else { + nextFrame = frame; + return; + } + } else if (frame.timestamp <= t) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(frame.canvas, 0, 0); + } else { + nextFrame = frame; + return; + } + } + } + function render() { + if (!audioClock) return; + const t = audioClock.currentTime; + const now = Date.now(); + if (now - lastTimeUpdate >= timeupdateInterval) { + events.emit('timeupdate'); + lastTimeUpdate = now; + } + if (Number.isFinite(_duration) && t >= _duration) { + stop(); + events.emit('ended'); + return; + } + if (nextFrame && nextFrame.timestamp <= t) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(nextFrame.canvas, 0, 0); + nextFrame = null; + updateNextFrame(asyncId); + if (stalled) { + events.emit('canplay'); + events.emit('playing'); + stalled = false; + } + } else if (!nextFrame) { + updateNextFrame(asyncId); + if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) { + stalled = true; + events.emit('waiting'); + } + } + rafId = requestAnimationFrame(render); + } + function start(audioEngine) { + audioClock = audioEngine; + asyncId++; + stalled = false; + updateNextFrame(asyncId); + rafId = requestAnimationFrame(render); + } + function stop() { + cancelAnimationFrame(rafId); + } + async function seek(time) { + asyncId++; + await resetIterator(time); + } + function setPlaybackRate(rate) { + playbackRate = Math.max(0.1, Number(rate) || 1); + } + function destroy() { + asyncId++; + stop(); + stopIterator(); + posterDrawn = false; + input = null; + videoSink = null; + } + return { + load, + start, + stop, + seek, + setPlaybackRate, + destroy, + get width () { + return _width; + }, + get height () { + return _height; + }, + get duration () { + return _duration; + } + }; +} + +},{"mediabunny":"6p2EH","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"78ov3":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "default", ()=>clamp); +function clamp(v, min, max) { + return Math.max(min, Math.min(max, Number(v) || 0)); +} + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"9BYHB":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "createVideoEventTarget", ()=>createVideoEventTarget); +function createVideoEventTarget() { + const listeners = new Map(); + function addEventListener(type, fn) { + if (!listeners.has(type)) listeners.set(type, []); + listeners.get(type).push(fn); + } + function removeEventListener(type, fn) { + const list = listeners.get(type); + if (!list) return; + const i = list.indexOf(fn); + if (i >= 0) list.splice(i, 1); + } + function emit(type, detail) { + const evt = new Event(type); + evt.detail = detail; + const list = listeners.get(type); + if (list) list.forEach((fn)=>fn(evt)); + } + return { + addEventListener, + removeEventListener, + emit + }; +} + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}]},["gqawh"], "gqawh", "parcelRequire4dc0", {}) + +//# sourceMappingURL=index.js.map diff --git a/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map b/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map new file mode 100644 index 000000000..6ca78200e --- /dev/null +++ b/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["packages/artplayer-proxy-mediabunny/src/index.js","packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js","packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js","packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js","packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js","node_modules/mediabunny/dist/modules/src/index.js","node_modules/mediabunny/dist/modules/src/codec.js","node_modules/mediabunny/dist/modules/src/misc.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","node_modules/mediabunny/dist/modules/src/source.js","node_modules/@parcel/node-resolver-core/lib/_empty.js","node_modules/mediabunny/dist/modules/src/input.js","node_modules/mediabunny/dist/modules/src/input-format.js","node_modules/mediabunny/dist/modules/src/isobmff/isobmff-demuxer.js","node_modules/mediabunny/dist/modules/src/codec-data.js","node_modules/mediabunny/dist/modules/src/demuxer.js","node_modules/mediabunny/dist/modules/src/input-track.js","node_modules/mediabunny/dist/modules/src/custom-coder.js","node_modules/mediabunny/dist/modules/src/media-sink.js","node_modules/mediabunny/dist/modules/src/packet.js","node_modules/mediabunny/dist/modules/src/pcm.js","node_modules/mediabunny/dist/modules/src/sample.js","node_modules/mediabunny/dist/modules/src/isobmff/isobmff-misc.js","node_modules/mediabunny/dist/modules/src/isobmff/isobmff-reader.js","node_modules/mediabunny/dist/modules/src/metadata.js","node_modules/mediabunny/dist/modules/src/reader.js","node_modules/mediabunny/dist/modules/src/matroska/ebml.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-demuxer.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-misc.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-demuxer.js","node_modules/mediabunny/dist/modules/shared/mp3-misc.js","node_modules/mediabunny/dist/modules/src/id3.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-reader.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-demuxer.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-misc.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-reader.js","node_modules/mediabunny/dist/modules/src/wave/wave-demuxer.js","node_modules/mediabunny/dist/modules/src/adts/adts-reader.js","node_modules/mediabunny/dist/modules/src/adts/adts-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-misc.js","packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js","packages/artplayer-proxy-mediabunny/src/utils/clamp.js","packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js"],"sourcesContent":["import createCanvasProxy from './proxy/canvasProxy.js'\n\nexport default function artplayerProxyMediabunny(option = {}) {\n return (art) => {\n return createCanvasProxy(art, option)\n }\n}\n\nif (typeof window !== 'undefined') {\n window.artplayerProxyMediabunny = artplayerProxyMediabunny\n}\n","import createMediabunnyVideoShim from '../shim/mediabunnyVideoShim.js'\n\nexport default function createCanvasProxy(art, option) {\n const { constructor } = art\n const { createElement } = constructor.utils\n\n const canvas = createElement('canvas')\n const ctx = canvas.getContext('2d')\n\n const shim = createMediabunnyVideoShim({\n art,\n canvas,\n ctx,\n option,\n })\n\n const originalCanvasMethods = {}\n for (const prop in canvas) {\n if (typeof canvas[prop] === 'function') {\n originalCanvasMethods[prop] = canvas[prop].bind(canvas)\n }\n }\n\n for (const prop in shim) {\n if (!(prop in canvas)) {\n Object.defineProperty(canvas, prop, {\n get() {\n const value = shim[prop]\n return typeof value === 'function' ? value.bind(shim) : value\n },\n set(v) {\n shim[prop] = v\n },\n configurable: true,\n enumerable: true,\n })\n }\n }\n\n for (const prop in originalCanvasMethods) {\n canvas[prop] = (...args) => originalCanvasMethods[prop](...args)\n }\n\n art.on('destroy', () => {\n shim.destroy()\n })\n\n function resize() {\n const player = art.template?.$player\n if (!player || art.option.autoSize)\n return\n\n Object.assign(canvas.style, {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n })\n }\n\n art.on('resize', resize)\n art.on('video:loadedmetadata', resize)\n\n return canvas\n}\n","import createMediabunnyEngine from '../engine/mediabunnyEngine.js'\nimport clamp from '../utils/clamp.js'\nimport { createVideoEventTarget } from './videoEvents.js'\n\nexport default function createMediabunnyVideoShim({ art, canvas, ctx, option }) {\n const events = createVideoEventTarget()\n const engine = createMediabunnyEngine({ canvas, ctx, events, option })\n\n let _src = null\n let _volume = option.volume ?? 0.7\n let _muted = !!option.muted\n let _playbackRate = 1\n\n engine.setVolume(_volume, _muted)\n\n const { events: artEvents } = art.constructor.config\n artEvents.forEach((name) => {\n events.addEventListener(name, (e) => {\n art.emit(`video:${e.type}`, e)\n })\n })\n\n const shim = {\n addEventListener: events.addEventListener,\n removeEventListener: events.removeEventListener,\n\n get src() {\n return _src\n },\n set src(v) {\n _src = v\n if (v)\n engine.load(v)\n },\n\n get currentTime() {\n return engine.currentTime\n },\n set currentTime(t) {\n engine.seek(Number(t) || 0)\n },\n\n get duration() {\n return engine.duration\n },\n\n get buffered() {\n const duration = engine.duration\n if (!duration || Number.isNaN(duration)) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => duration,\n }\n },\n\n get played() {\n const duration = engine.duration\n const currentTime = engine.currentTime\n if (!duration || Number.isNaN(duration) || currentTime <= 0) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => currentTime,\n }\n },\n\n get paused() {\n return engine.paused\n },\n get playing() {\n return !engine.paused && !engine.ended\n },\n get ended() {\n return engine.ended\n },\n\n get readyState() {\n return engine.readyState\n },\n\n get networkState() {\n return engine.networkState\n },\n\n get error() {\n return engine.error\n },\n\n get seeking() {\n return engine.seeking\n },\n\n get seekable() {\n const duration = engine.duration\n if (!duration || Number.isNaN(duration)) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => duration,\n }\n },\n\n get playbackRate() {\n return _playbackRate\n },\n set playbackRate(v) {\n const rate = Number(v)\n if (Number.isNaN(rate) || rate <= 0)\n return\n _playbackRate = rate\n engine.setPlaybackRate(rate)\n events.emit('ratechange')\n },\n\n get volume() {\n return _volume\n },\n set volume(v) {\n _volume = clamp(v, 0, 1)\n _muted = false\n engine.setVolume(_volume, _muted)\n events.emit('volumechange')\n },\n\n get muted() {\n return _muted\n },\n set muted(v) {\n _muted = !!v\n engine.setVolume(_volume, _muted)\n events.emit('volumechange')\n },\n\n play() {\n return engine.play()\n },\n pause() {\n engine.pause()\n },\n load() {\n if (_src)\n engine.load(_src)\n },\n\n destroy() {\n engine.destroy()\n },\n\n get videoWidth() {\n return engine.videoWidth\n },\n get videoHeight() {\n return engine.videoHeight\n },\n\n get playsInline() {\n return true\n },\n set playsInline(v) {},\n\n get autoplay() {\n return option.autoplay || false\n },\n set autoplay(v) {},\n\n get loop() {\n return option.loop || false\n },\n set loop(v) {},\n\n get controls() {\n return false\n },\n set controls(v) {},\n\n get crossOrigin() {\n return option.crossOrigin || ''\n },\n set crossOrigin(v) {},\n\n get currentSrc() {\n return _src\n },\n\n get poster() {\n return option.poster || ''\n },\n set poster(v) {\n option.poster = v\n },\n\n get preload() {\n return 'auto'\n },\n set preload(v) {},\n\n get defaultMuted() {\n return false\n },\n set defaultMuted(v) {},\n\n get defaultPlaybackRate() {\n return 1\n },\n set defaultPlaybackRate(v) {},\n\n canPlayType(_type) {\n return 'maybe'\n },\n\n getBoundingClientRect() {\n return canvas.getBoundingClientRect()\n },\n\n requestVideoFrameCallback(callback) {\n const id = requestAnimationFrame((time) => {\n callback(time, {\n presentationTime: engine.currentTime,\n expectedDisplayTime: time + 16.6,\n width: engine.videoWidth,\n height: engine.videoHeight,\n mediaTime: engine.currentTime,\n presentedFrames: 0,\n processingDuration: 0,\n captureTime: time,\n receiveTime: time,\n rtpTimestamp: 0,\n })\n })\n return id\n },\n\n cancelVideoFrameCallback(id) {\n cancelAnimationFrame(id)\n },\n\n setAttribute(name, value) {\n if (name === 'src')\n this.src = value\n else if (name === 'autoplay')\n this.autoplay = value\n else if (name === 'loop')\n this.loop = value\n else if (name === 'muted')\n this.muted = true\n else\n canvas.setAttribute(name, value)\n },\n }\n\n if (option.source) {\n shim.src = option.source\n }\n else if (art.option?.url) {\n shim.src = art.option.url\n }\n\n return shim\n}\n","import createAudioEngine from './audioEngine.js'\nimport createVideoEngine from './videoEngine.js'\n\nexport default function createMediabunnyEngine({\n canvas,\n ctx,\n events,\n option = {},\n}) {\n const defaults = {\n timeupdateInterval: 250,\n avSyncTolerance: 0.12,\n loadTimeout: 12000,\n dropLateFrames: false,\n poster: '',\n }\n\n const audio = createAudioEngine(events)\n const video = createVideoEngine({\n canvas,\n ctx,\n events,\n timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval,\n avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance,\n dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames,\n poster: option.poster ?? defaults.poster,\n preflightRange: option.preflightRange ?? false,\n })\n\n let _paused = true\n let _ended = false\n let _readyState = 0\n let _networkState = 0\n let _error = null\n let _seeking = false\n let loadSeq = 0\n\n events.addEventListener?.('ended', () => {\n _ended = true\n _paused = true\n })\n\n async function load(src) {\n const id = ++loadSeq\n pause()\n _ended = false\n _error = null\n _networkState = 2\n _readyState = 0\n setTimeout(() => events.emit('waiting'), 0)\n setTimeout(() => events.emit('loadstart'), 0)\n\n const loadTimeout = Number.isFinite(option.loadTimeout)\n ? option.loadTimeout\n : defaults.loadTimeout\n\n let timer = null\n const timeoutPromise\n = loadTimeout > 0\n ? new Promise((_, reject) => {\n timer = setTimeout(() => reject(new Error('Load timeout')), loadTimeout)\n })\n : null\n\n const loadTask = (async () => {\n try {\n let videoMetadataLoaded = false\n let audioMetadataLoaded = false\n\n const checkMetadata = () => {\n if (videoMetadataLoaded && audioMetadataLoaded) {\n _readyState = 1\n events.emit('loadedmetadata')\n events.emit('durationchange')\n }\n }\n\n const p1 = video.load(src, () => {\n if (id !== loadSeq)\n return\n videoMetadataLoaded = true\n checkMetadata()\n })\n\n const p2 = audio.load(src, () => {\n if (id !== loadSeq)\n return\n audioMetadataLoaded = true\n checkMetadata()\n })\n\n await Promise.all([p1, p2])\n if (id !== loadSeq)\n return\n\n _readyState = 4\n _networkState = 1\n events.emit('loadeddata')\n events.emit('canplay')\n events.emit('canplaythrough')\n }\n catch (err) {\n if (id !== loadSeq)\n return\n _error = { code: 4, message: err.message }\n _networkState = 3\n events.emit('error')\n console.error(err)\n }\n finally {\n if (timer)\n clearTimeout(timer)\n }\n })()\n\n if (timeoutPromise) {\n try {\n await Promise.race([loadTask, timeoutPromise])\n }\n catch (err) {\n if (id !== loadSeq)\n return\n loadSeq++\n _error = { code: 4, message: err.message }\n _networkState = 3\n events.emit('error')\n }\n }\n else {\n await loadTask\n }\n }\n\n async function play() {\n if (!_paused)\n return\n _paused = false\n await audio.play()\n video.start(audio)\n events.emit('play')\n events.emit('playing')\n }\n\n function pause() {\n if (_paused)\n return\n _paused = true\n audio.pause()\n video.stop()\n events.emit('pause')\n }\n\n async function seek(time) {\n const shouldResume = !_paused\n _seeking = true\n events.emit('seeking')\n events.emit('waiting')\n pause()\n await audio.seek(time)\n await video.seek(time)\n _seeking = false\n events.emit('seeked')\n if (shouldResume && !_ended) {\n await play()\n }\n }\n\n function destroy() {\n pause()\n audio.destroy()\n video.destroy()\n }\n\n return {\n load,\n play,\n pause,\n seek,\n destroy,\n\n setVolume: audio.setVolume,\n setPlaybackRate(rate) {\n audio.setPlaybackRate(rate)\n video.setPlaybackRate(rate)\n },\n\n get currentTime() {\n return audio.currentTime\n },\n get duration() {\n return audio.duration || video.duration\n },\n get paused() {\n return _paused\n },\n get seeking() {\n return _seeking\n },\n get ended() {\n return _ended\n },\n get readyState() {\n return _readyState\n },\n get networkState() {\n return _networkState\n },\n get error() {\n return _error\n },\n get videoWidth() {\n return video.width\n },\n get videoHeight() {\n return video.height\n },\n }\n}\n","import {\n ALL_FORMATS,\n AudioBufferSink,\n BlobSource,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default function createAudioEngine(events) {\n let input = null\n let audioSink = null\n\n let audioContext = null\n let gainNode = null\n\n let audioIterator = null\n let audioContextStartTime = 0\n let playbackTimeAtStart = 0\n let latestScheduledEndTime = 0\n\n let _duration = Number.NaN\n let _paused = true\n\n let _volume = 0.7\n let _muted = false\n let _playbackRate = 1\n\n let asyncId = 0\n const queuedNodes = new Set()\n\n function getCurrentTime() {\n if (_paused)\n return playbackTimeAtStart\n return (\n (audioContext.currentTime - audioContextStartTime) * _playbackRate\n + playbackTimeAtStart\n )\n }\n\n function updateGain() {\n if (!gainNode)\n return\n const v = _muted ? 0 : _volume\n gainNode.gain.value = v * v\n }\n\n function ensureAudioContext(sampleRate) {\n if (audioContext)\n return\n\n const AudioContext\n = window.AudioContext || window.webkitAudioContext\n\n try {\n audioContext = new AudioContext({ sampleRate })\n }\n catch {\n audioContext = new AudioContext()\n }\n\n gainNode = audioContext.createGain()\n gainNode.connect(audioContext.destination)\n updateGain()\n }\n\n function stopQueuedNodes() {\n for (const node of queuedNodes) {\n node.stop()\n }\n queuedNodes.clear()\n }\n\n async function stopIterator() {\n await audioIterator?.return()\n audioIterator = null\n }\n\n function normalizeSource(src) {\n if (typeof src === 'string')\n return new UrlSource(src)\n if (src instanceof Blob)\n return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream)\n return new ReadableStreamSource(src)\n return src\n }\n\n async function load(src, onMetadata) {\n asyncId++\n const id = asyncId\n\n await stopIterator()\n stopQueuedNodes()\n\n _paused = true\n playbackTimeAtStart = 0\n audioContextStartTime = 0\n\n const source = normalizeSource(src)\n if (!source)\n return\n\n input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n _duration = await input.computeDuration()\n if (id !== asyncId)\n return\n\n const audioTrack = await input.getPrimaryAudioTrack()\n if (!audioTrack) {\n audioSink = null\n ensureAudioContext()\n if (onMetadata)\n onMetadata()\n return\n }\n\n if (audioTrack.codec === null || !(await audioTrack.canDecode())) {\n audioSink = null\n ensureAudioContext()\n if (onMetadata)\n onMetadata()\n return\n }\n\n ensureAudioContext(audioTrack.sampleRate)\n audioSink = new AudioBufferSink(audioTrack)\n\n if (onMetadata)\n onMetadata()\n }\n\n async function runIterator(localId) {\n if (!audioSink)\n return\n\n await stopIterator()\n audioIterator = audioSink.buffers(getCurrentTime())\n\n while (true) {\n if (localId !== asyncId)\n return\n if (_paused)\n return\n\n const nextPromise = audioIterator.next()\n\n const checkStarvation = setInterval(() => {\n if (localId !== asyncId || _paused) {\n clearInterval(checkStarvation)\n return\n }\n if (audioContext.state === 'running'\n && audioContext.currentTime >= latestScheduledEndTime - 0.2) {\n audioContext.suspend()\n events.emit('waiting')\n }\n }, 50)\n\n let result\n try {\n result = await nextPromise\n }\n catch (e) {\n console.error(e)\n break\n }\n finally {\n clearInterval(checkStarvation)\n }\n\n if (localId !== asyncId)\n return\n if (_paused)\n return\n\n if (audioContext.state === 'suspended') {\n await audioContext.resume()\n events.emit('canplay')\n events.emit('playing')\n }\n\n if (result.done)\n break\n\n const { buffer, timestamp } = result.value\n\n const node = audioContext.createBufferSource()\n node.buffer = buffer\n node.connect(gainNode)\n node.playbackRate.value = _playbackRate\n\n const startAt\n = audioContextStartTime\n + (timestamp - playbackTimeAtStart) / _playbackRate\n\n const duration = buffer.duration\n const endAt = startAt + duration / _playbackRate\n\n if (endAt > latestScheduledEndTime) {\n latestScheduledEndTime = endAt\n }\n\n if (startAt >= audioContext.currentTime) {\n node.start(startAt)\n }\n else {\n node.start(\n audioContext.currentTime,\n (audioContext.currentTime - startAt) * _playbackRate,\n )\n }\n\n queuedNodes.add(node)\n node.onended = () => queuedNodes.delete(node)\n }\n }\n\n async function play() {\n if (!_paused)\n return\n\n if (!audioContext) {\n ensureAudioContext()\n }\n\n if (audioContext.state === 'suspended') {\n await audioContext.resume()\n }\n\n audioContextStartTime = audioContext.currentTime\n latestScheduledEndTime = audioContextStartTime\n _paused = false\n\n asyncId++\n runIterator(asyncId)\n }\n\n function pause() {\n if (_paused)\n return\n\n playbackTimeAtStart = getCurrentTime()\n _paused = true\n\n stopIterator()\n stopQueuedNodes()\n }\n\n async function seek(time) {\n playbackTimeAtStart = Math.max(0, time)\n audioContextStartTime = audioContext.currentTime\n latestScheduledEndTime = audioContextStartTime\n\n asyncId++\n if (!_paused) {\n runIterator(asyncId)\n }\n }\n\n function destroy() {\n asyncId++\n pause()\n audioContext?.close()\n audioContext = null\n input = null\n audioSink = null\n }\n\n return {\n load,\n play,\n pause,\n seek,\n destroy,\n\n setVolume(v, muted) {\n _volume = v\n _muted = muted\n updateGain()\n },\n\n setPlaybackRate(rate) {\n if (rate === _playbackRate)\n return\n\n if (!_paused) {\n playbackTimeAtStart = getCurrentTime()\n audioContextStartTime = audioContext.currentTime\n }\n\n _playbackRate = rate\n\n if (!_paused) {\n asyncId++\n runIterator(asyncId)\n }\n },\n\n get currentTime() {\n return getCurrentTime()\n },\n\n get duration() {\n return _duration\n },\n\n get paused() {\n return _paused\n },\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/// \n/// \nexport { Output, } from './output.js';\nexport { OutputFormat, AdtsOutputFormat, FlacOutputFormat, IsobmffOutputFormat, MkvOutputFormat, MovOutputFormat, Mp3OutputFormat, Mp4OutputFormat, OggOutputFormat, WavOutputFormat, WebMOutputFormat, } from './output-format.js';\nexport { MediaSource, VideoSource, AudioSource, SubtitleSource, AudioBufferSource, AudioSampleSource, CanvasSource, EncodedAudioPacketSource, EncodedVideoPacketSource, MediaStreamAudioTrackSource, MediaStreamVideoTrackSource, TextSubtitleSource, VideoSampleSource, } from './media-source.js';\nexport { VIDEO_CODECS, AUDIO_CODECS, PCM_AUDIO_CODECS, NON_PCM_AUDIO_CODECS, SUBTITLE_CODECS, } from './codec.js';\nexport { canEncode, canEncodeVideo, canEncodeAudio, canEncodeSubtitles, getEncodableCodecs, getEncodableVideoCodecs, getEncodableAudioCodecs, getEncodableSubtitleCodecs, getFirstEncodableVideoCodec, getFirstEncodableAudioCodec, getFirstEncodableSubtitleCodec, Quality, QUALITY_VERY_LOW, QUALITY_LOW, QUALITY_MEDIUM, QUALITY_HIGH, QUALITY_VERY_HIGH, } from './encode.js';\nexport { Target, BufferTarget, FilePathTarget, NullTarget, StreamTarget, } from './target.js';\nexport { ALL_TRACK_TYPES, } from './output.js';\nexport { Source, BlobSource, BufferSource, FilePathSource, StreamSource, ReadableStreamSource, UrlSource, } from './source.js';\nexport { InputFormat, AdtsInputFormat, IsobmffInputFormat, MatroskaInputFormat, Mp3InputFormat, Mp4InputFormat, OggInputFormat, QuickTimeInputFormat, WaveInputFormat, WebMInputFormat, FlacInputFormat, ALL_FORMATS, ADTS, MATROSKA, MP3, MP4, OGG, QTFF, WAVE, WEBM, FLAC, } from './input-format.js';\nexport { Input, InputDisposedError, } from './input.js';\nexport { InputTrack, InputVideoTrack, InputAudioTrack, } from './input-track.js';\nexport { EncodedPacket, } from './packet.js';\nexport { AudioSample, VideoSample, } from './sample.js';\nexport { AudioBufferSink, AudioSampleSink, BaseMediaSampleSink, CanvasSink, EncodedPacketSink, VideoSampleSink, } from './media-sink.js';\nexport { Conversion, } from './conversion.js';\nexport { CustomVideoDecoder, CustomVideoEncoder, CustomAudioDecoder, CustomAudioEncoder, registerDecoder, registerEncoder, } from './custom-coder.js';\nexport { RichImageData, AttachedFile, } from './metadata.js';\n// 🐡🦔\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Bitstream, COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, bytesToHexString, isAllowSharedBufferSource, last, reverseBitsU32, toDataView, } from './misc.js';\n/**\n * List of known video codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const VIDEO_CODECS = [\n 'avc',\n 'hevc',\n 'vp9',\n 'av1',\n 'vp8',\n];\n/**\n * List of known PCM (uncompressed) audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const PCM_AUDIO_CODECS = [\n 'pcm-s16', // We don't prefix 'le' so we're compatible with the WebCodecs-registered PCM codec strings\n 'pcm-s16be',\n 'pcm-s24',\n 'pcm-s24be',\n 'pcm-s32',\n 'pcm-s32be',\n 'pcm-f32',\n 'pcm-f32be',\n 'pcm-f64',\n 'pcm-f64be',\n 'pcm-u8',\n 'pcm-s8',\n 'ulaw',\n 'alaw',\n];\n/**\n * List of known compressed audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const NON_PCM_AUDIO_CODECS = [\n 'aac',\n 'opus',\n 'mp3',\n 'vorbis',\n 'flac',\n];\n/**\n * List of known audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const AUDIO_CODECS = [\n ...NON_PCM_AUDIO_CODECS,\n ...PCM_AUDIO_CODECS,\n];\n/**\n * List of known subtitle codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const SUBTITLE_CODECS = [\n 'webvtt',\n]; // TODO add the rest\n// https://en.wikipedia.org/wiki/Advanced_Video_Coding\nconst AVC_LEVEL_TABLE = [\n { maxMacroblocks: 99, maxBitrate: 64000, level: 0x0A }, // Level 1\n { maxMacroblocks: 396, maxBitrate: 192000, level: 0x0B }, // Level 1.1\n { maxMacroblocks: 396, maxBitrate: 384000, level: 0x0C }, // Level 1.2\n { maxMacroblocks: 396, maxBitrate: 768000, level: 0x0D }, // Level 1.3\n { maxMacroblocks: 396, maxBitrate: 2000000, level: 0x14 }, // Level 2\n { maxMacroblocks: 792, maxBitrate: 4000000, level: 0x15 }, // Level 2.1\n { maxMacroblocks: 1620, maxBitrate: 4000000, level: 0x16 }, // Level 2.2\n { maxMacroblocks: 1620, maxBitrate: 10000000, level: 0x1E }, // Level 3\n { maxMacroblocks: 3600, maxBitrate: 14000000, level: 0x1F }, // Level 3.1\n { maxMacroblocks: 5120, maxBitrate: 20000000, level: 0x20 }, // Level 3.2\n { maxMacroblocks: 8192, maxBitrate: 20000000, level: 0x28 }, // Level 4\n { maxMacroblocks: 8192, maxBitrate: 50000000, level: 0x29 }, // Level 4.1\n { maxMacroblocks: 8704, maxBitrate: 50000000, level: 0x2A }, // Level 4.2\n { maxMacroblocks: 22080, maxBitrate: 135000000, level: 0x32 }, // Level 5\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x33 }, // Level 5.1\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x34 }, // Level 5.2\n { maxMacroblocks: 139264, maxBitrate: 240000000, level: 0x3C }, // Level 6\n { maxMacroblocks: 139264, maxBitrate: 480000000, level: 0x3D }, // Level 6.1\n { maxMacroblocks: 139264, maxBitrate: 800000000, level: 0x3E }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding\nconst HEVC_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 128000, tier: 'L', level: 30 }, // Level 1 (Low Tier)\n { maxPictureSize: 122880, maxBitrate: 1500000, tier: 'L', level: 60 }, // Level 2 (Low Tier)\n { maxPictureSize: 245760, maxBitrate: 3000000, tier: 'L', level: 63 }, // Level 2.1 (Low Tier)\n { maxPictureSize: 552960, maxBitrate: 6000000, tier: 'L', level: 90 }, // Level 3 (Low Tier)\n { maxPictureSize: 983040, maxBitrate: 10000000, tier: 'L', level: 93 }, // Level 3.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 12000000, tier: 'L', level: 120 }, // Level 4 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 30000000, tier: 'H', level: 120 }, // Level 4 (High Tier)\n { maxPictureSize: 2228224, maxBitrate: 20000000, tier: 'L', level: 123 }, // Level 4.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 50000000, tier: 'H', level: 123 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 25000000, tier: 'L', level: 150 }, // Level 5 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 150 }, // Level 5 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'L', level: 153 }, // Level 5.1 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 153 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'L', level: 156 }, // Level 5.2 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 156 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'L', level: 180 }, // Level 6 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 180 }, // Level 6 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 120000000, tier: 'L', level: 183 }, // Level 6.1 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 183 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'L', level: 186 }, // Level 6.2 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 186 }, // Level 6.2 (High Tier)\n];\n// https://en.wikipedia.org/wiki/VP9\nexport const VP9_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 200000, level: 10 }, // Level 1\n { maxPictureSize: 73728, maxBitrate: 800000, level: 11 }, // Level 1.1\n { maxPictureSize: 122880, maxBitrate: 1800000, level: 20 }, // Level 2\n { maxPictureSize: 245760, maxBitrate: 3600000, level: 21 }, // Level 2.1\n { maxPictureSize: 552960, maxBitrate: 7200000, level: 30 }, // Level 3\n { maxPictureSize: 983040, maxBitrate: 12000000, level: 31 }, // Level 3.1\n { maxPictureSize: 2228224, maxBitrate: 18000000, level: 40 }, // Level 4\n { maxPictureSize: 2228224, maxBitrate: 30000000, level: 41 }, // Level 4.1\n { maxPictureSize: 8912896, maxBitrate: 60000000, level: 50 }, // Level 5\n { maxPictureSize: 8912896, maxBitrate: 120000000, level: 51 }, // Level 5.1\n { maxPictureSize: 8912896, maxBitrate: 180000000, level: 52 }, // Level 5.2\n { maxPictureSize: 35651584, maxBitrate: 180000000, level: 60 }, // Level 6\n { maxPictureSize: 35651584, maxBitrate: 240000000, level: 61 }, // Level 6.1\n { maxPictureSize: 35651584, maxBitrate: 480000000, level: 62 }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/AV1\nconst AV1_LEVEL_TABLE = [\n { maxPictureSize: 147456, maxBitrate: 1500000, tier: 'M', level: 0 }, // Level 2.0 (Main Tier)\n { maxPictureSize: 278784, maxBitrate: 3000000, tier: 'M', level: 1 }, // Level 2.1 (Main Tier)\n { maxPictureSize: 665856, maxBitrate: 6000000, tier: 'M', level: 4 }, // Level 3.0 (Main Tier)\n { maxPictureSize: 1065024, maxBitrate: 10000000, tier: 'M', level: 5 }, // Level 3.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 12000000, tier: 'M', level: 8 }, // Level 4.0 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 30000000, tier: 'H', level: 8 }, // Level 4.0 (High Tier)\n { maxPictureSize: 2359296, maxBitrate: 20000000, tier: 'M', level: 9 }, // Level 4.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 50000000, tier: 'H', level: 9 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 30000000, tier: 'M', level: 12 }, // Level 5.0 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 12 }, // Level 5.0 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'M', level: 13 }, // Level 5.1 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 13 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'M', level: 14 }, // Level 5.2 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 14 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 15 }, // Level 5.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 15 }, // Level 5.3 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 16 }, // Level 6.0 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 16 }, // Level 6.0 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 100000000, tier: 'M', level: 17 }, // Level 6.1 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 17 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 18 }, // Level 6.2 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 18 }, // Level 6.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 19 }, // Level 6.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 19 }, // Level 6.3 (High Tier)\n];\nconst VP9_DEFAULT_SUFFIX = '.01.01.01.01.00';\nconst AV1_DEFAULT_SUFFIX = '.0.110.01.01.01.0';\nexport const buildVideoCodecString = (codec, width, height, bitrate) => {\n if (codec === 'avc') {\n const profileIndication = 0x64; // High Profile\n const totalMacroblocks = Math.ceil(width / 16) * Math.ceil(height / 16);\n // Determine the level based on the table\n const levelInfo = AVC_LEVEL_TABLE.find(level => totalMacroblocks <= level.maxMacroblocks && bitrate <= level.maxBitrate) ?? last(AVC_LEVEL_TABLE);\n const levelIndication = levelInfo ? levelInfo.level : 0;\n const hexProfileIndication = profileIndication.toString(16).padStart(2, '0');\n const hexProfileCompatibility = '00';\n const hexLevelIndication = levelIndication.toString(16).padStart(2, '0');\n return `avc1.${hexProfileIndication}${hexProfileCompatibility}${hexLevelIndication}`;\n }\n else if (codec === 'hevc') {\n const profilePrefix = ''; // Profile space 0\n const profileIdc = 1; // Main Profile\n const compatibilityFlags = '6'; // Taken from the example in ISO 14496-15\n const pictureSize = width * height;\n const levelInfo = HEVC_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(HEVC_LEVEL_TABLE);\n const constraintFlags = 'B0'; // Progressive source flag\n return 'hev1.'\n + `${profilePrefix}${profileIdc}.`\n + `${compatibilityFlags}.`\n + `${levelInfo.tier}${levelInfo.level}.`\n + `${constraintFlags}`;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n const profile = '00'; // Profile 0\n const pictureSize = width * height;\n const levelInfo = VP9_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(VP9_LEVEL_TABLE);\n const bitDepth = '08'; // 8-bit\n return `vp09.${profile}.${levelInfo.level.toString().padStart(2, '0')}.${bitDepth}`;\n }\n else if (codec === 'av1') {\n const profile = 0; // Main Profile, single digit\n const pictureSize = width * height;\n const levelInfo = AV1_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(AV1_LEVEL_TABLE);\n const level = levelInfo.level.toString().padStart(2, '0');\n const bitDepth = '08'; // 8-bit\n return `av01.${profile}.${level}${levelInfo.tier}.${bitDepth}`;\n }\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const generateVp9CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://www.webmproject.org/docs/container/#vp9-codec-feature-metadata-codecprivate\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const profile = Number(parts[1]);\n const level = Number(parts[2]);\n const bitDepth = Number(parts[3]);\n const chromaSubsampling = parts[4] ? Number(parts[4]) : 1;\n return [\n 1, 1, profile,\n 2, 1, level,\n 3, 1, bitDepth,\n 4, 1, chromaSubsampling,\n ];\n};\nexport const generateAv1CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://aomediacodec.github.io/av1-isobmff/\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const marker = 1;\n const version = 1;\n const firstByte = (marker << 7) + version;\n const profile = Number(parts[1]);\n const levelAndTier = parts[2];\n const level = Number(levelAndTier.slice(0, -1));\n const secondByte = (profile << 5) + level;\n const tier = levelAndTier.slice(-1) === 'H' ? 1 : 0;\n const bitDepth = Number(parts[3]);\n const highBitDepth = bitDepth === 8 ? 0 : 1;\n const twelveBit = 0;\n const monochrome = parts[4] ? Number(parts[4]) : 0;\n const chromaSubsamplingX = parts[5] ? Number(parts[5][0]) : 1;\n const chromaSubsamplingY = parts[5] ? Number(parts[5][1]) : 1;\n const chromaSamplePosition = parts[5] ? Number(parts[5][2]) : 0; // CSP_UNKNOWN\n const thirdByte = (tier << 7)\n + (highBitDepth << 6)\n + (twelveBit << 5)\n + (monochrome << 4)\n + (chromaSubsamplingX << 3)\n + (chromaSubsamplingY << 2)\n + chromaSamplePosition;\n const initialPresentationDelayPresent = 0; // Should be fine\n const fourthByte = initialPresentationDelayPresent;\n return [firstByte, secondByte, thirdByte, fourthByte];\n};\nexport const extractVideoCodecString = (trackInfo) => {\n const { codec, codecDescription, colorSpace, avcCodecInfo, hevcCodecInfo, vp9CodecInfo, av1CodecInfo } = trackInfo;\n if (codec === 'avc') {\n assert(trackInfo.avcType !== null);\n if (avcCodecInfo) {\n const bytes = new Uint8Array([\n avcCodecInfo.avcProfileIndication,\n avcCodecInfo.profileCompatibility,\n avcCodecInfo.avcLevelIndication,\n ]);\n return `avc${trackInfo.avcType}.${bytesToHexString(bytes)}`;\n }\n if (!codecDescription || codecDescription.byteLength < 4) {\n throw new TypeError('AVC decoder description is not provided or is not at least 4 bytes long.');\n }\n return `avc${trackInfo.avcType}.${bytesToHexString(codecDescription.subarray(1, 4))}`;\n }\n else if (codec === 'hevc') {\n let generalProfileSpace;\n let generalProfileIdc;\n let compatibilityFlags;\n let generalTierFlag;\n let generalLevelIdc;\n let constraintFlags;\n if (hevcCodecInfo) {\n generalProfileSpace = hevcCodecInfo.generalProfileSpace;\n generalProfileIdc = hevcCodecInfo.generalProfileIdc;\n compatibilityFlags = reverseBitsU32(hevcCodecInfo.generalProfileCompatibilityFlags);\n generalTierFlag = hevcCodecInfo.generalTierFlag;\n generalLevelIdc = hevcCodecInfo.generalLevelIdc;\n constraintFlags = [...hevcCodecInfo.generalConstraintIndicatorFlags];\n }\n else {\n if (!codecDescription || codecDescription.byteLength < 23) {\n throw new TypeError('HEVC decoder description is not provided or is not at least 23 bytes long.');\n }\n const view = toDataView(codecDescription);\n const profileByte = view.getUint8(1);\n generalProfileSpace = (profileByte >> 6) & 0x03;\n generalProfileIdc = profileByte & 0x1F;\n compatibilityFlags = reverseBitsU32(view.getUint32(2));\n generalTierFlag = (profileByte >> 5) & 0x01;\n generalLevelIdc = view.getUint8(12);\n constraintFlags = [];\n for (let i = 0; i < 6; i++) {\n constraintFlags.push(view.getUint8(6 + i));\n }\n }\n let codecString = 'hev1.';\n codecString += ['', 'A', 'B', 'C'][generalProfileSpace] + generalProfileIdc;\n codecString += '.';\n codecString += compatibilityFlags.toString(16).toUpperCase();\n codecString += '.';\n codecString += generalTierFlag === 0 ? 'L' : 'H';\n codecString += generalLevelIdc;\n while (constraintFlags.length > 0 && constraintFlags[constraintFlags.length - 1] === 0) {\n constraintFlags.pop();\n }\n if (constraintFlags.length > 0) {\n codecString += '.';\n codecString += constraintFlags.map(x => x.toString(16).toUpperCase()).join('.');\n }\n return codecString;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n if (!vp9CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `vp09.00.${level.toString().padStart(2, '0')}.08`;\n }\n const profile = vp9CodecInfo.profile.toString().padStart(2, '0');\n const level = vp9CodecInfo.level.toString().padStart(2, '0');\n const bitDepth = vp9CodecInfo.bitDepth.toString().padStart(2, '0');\n const chromaSubsampling = vp9CodecInfo.chromaSubsampling.toString().padStart(2, '0');\n const colourPrimaries = vp9CodecInfo.colourPrimaries.toString().padStart(2, '0');\n const transferCharacteristics = vp9CodecInfo.transferCharacteristics.toString().padStart(2, '0');\n const matrixCoefficients = vp9CodecInfo.matrixCoefficients.toString().padStart(2, '0');\n const videoFullRangeFlag = vp9CodecInfo.videoFullRangeFlag.toString().padStart(2, '0');\n let string = `vp09.${profile}.${level}.${bitDepth}.${chromaSubsampling}`;\n string += `.${colourPrimaries}.${transferCharacteristics}.${matrixCoefficients}.${videoFullRangeFlag}`;\n if (string.endsWith(VP9_DEFAULT_SUFFIX)) {\n string = string.slice(0, -VP9_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n else if (codec === 'av1') {\n if (!av1CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `av01.0.${level.toString().padStart(2, '0')}M.08`;\n }\n // https://aomediacodec.github.io/av1-isobmff/#codecsparam\n const profile = av1CodecInfo.profile; // Single digit\n const level = av1CodecInfo.level.toString().padStart(2, '0');\n const tier = av1CodecInfo.tier ? 'H' : 'M';\n const bitDepth = av1CodecInfo.bitDepth.toString().padStart(2, '0');\n const monochrome = av1CodecInfo.monochrome ? '1' : '0';\n const chromaSubsampling = 100 * av1CodecInfo.chromaSubsamplingX\n + 10 * av1CodecInfo.chromaSubsamplingY\n + 1 * (av1CodecInfo.chromaSubsamplingX && av1CodecInfo.chromaSubsamplingY\n ? av1CodecInfo.chromaSamplePosition\n : 0);\n // The defaults are 1 (ITU-R BT.709)\n const colorPrimaries = colorSpace?.primaries ? COLOR_PRIMARIES_MAP[colorSpace.primaries] : 1;\n const transferCharacteristics = colorSpace?.transfer ? TRANSFER_CHARACTERISTICS_MAP[colorSpace.transfer] : 1;\n const matrixCoefficients = colorSpace?.matrix ? MATRIX_COEFFICIENTS_MAP[colorSpace.matrix] : 1;\n const videoFullRangeFlag = colorSpace?.fullRange ? 1 : 0;\n let string = `av01.${profile}.${level}${tier}.${bitDepth}`;\n string += `.${monochrome}.${chromaSubsampling.toString().padStart(3, '0')}`;\n string += `.${colorPrimaries.toString().padStart(2, '0')}`;\n string += `.${transferCharacteristics.toString().padStart(2, '0')}`;\n string += `.${matrixCoefficients.toString().padStart(2, '0')}`;\n string += `.${videoFullRangeFlag}`;\n if (string.endsWith(AV1_DEFAULT_SUFFIX)) {\n string = string.slice(0, -AV1_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const buildAudioCodecString = (codec, numberOfChannels, sampleRate) => {\n if (codec === 'aac') {\n // If stereo or higher channels and lower sample rate, likely using HE-AAC v2 with PS\n if (numberOfChannels >= 2 && sampleRate <= 24000) {\n return 'mp4a.40.29'; // HE-AAC v2 (AAC LC + SBR + PS)\n }\n // If sample rate is low, likely using HE-AAC v1 with SBR\n if (sampleRate <= 24000) {\n return 'mp4a.40.5'; // HE-AAC v1 (AAC LC + SBR)\n }\n // Default to standard AAC-LC for higher sample rates\n return 'mp4a.40.2'; // AAC-LC\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const extractAudioCodecString = (trackInfo) => {\n const { codec, codecDescription, aacCodecInfo } = trackInfo;\n if (codec === 'aac') {\n if (!aacCodecInfo) {\n throw new TypeError('AAC codec info must be provided.');\n }\n if (aacCodecInfo.isMpeg2) {\n return 'mp4a.67';\n }\n else {\n const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n return `mp4a.40.${audioSpecificConfig.objectType}`;\n }\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (codec && PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const aacFrequencyTable = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350,\n];\nexport const aacChannelMap = [-1, 1, 2, 3, 4, 5, 6, 8];\nexport const parseAacAudioSpecificConfig = (bytes) => {\n if (!bytes || bytes.byteLength < 2) {\n throw new TypeError('AAC description must be at least 2 bytes long.');\n }\n const bitstream = new Bitstream(bytes);\n let objectType = bitstream.readBits(5);\n if (objectType === 31) {\n objectType = 32 + bitstream.readBits(6);\n }\n const frequencyIndex = bitstream.readBits(4);\n let sampleRate = null;\n if (frequencyIndex === 15) {\n sampleRate = bitstream.readBits(24);\n }\n else {\n if (frequencyIndex < aacFrequencyTable.length) {\n sampleRate = aacFrequencyTable[frequencyIndex];\n }\n }\n const channelConfiguration = bitstream.readBits(4);\n let numberOfChannels = null;\n if (channelConfiguration >= 1 && channelConfiguration <= 7) {\n numberOfChannels = aacChannelMap[channelConfiguration];\n }\n return {\n objectType,\n frequencyIndex,\n sampleRate,\n channelConfiguration,\n numberOfChannels,\n };\n};\nexport const buildAacAudioSpecificConfig = (config) => {\n let frequencyIndex = aacFrequencyTable.indexOf(config.sampleRate);\n let customSampleRate = null;\n if (frequencyIndex === -1) {\n frequencyIndex = 15;\n customSampleRate = config.sampleRate;\n }\n const channelConfiguration = aacChannelMap.indexOf(config.numberOfChannels);\n if (channelConfiguration === -1) {\n throw new TypeError(`Unsupported number of channels: ${config.numberOfChannels}`);\n }\n let bitCount = 5 + 4 + 4;\n if (config.objectType >= 32) {\n bitCount += 6;\n }\n if (frequencyIndex === 15) {\n bitCount += 24;\n }\n const byteCount = Math.ceil(bitCount / 8);\n const bytes = new Uint8Array(byteCount);\n const bitstream = new Bitstream(bytes);\n if (config.objectType < 32) {\n bitstream.writeBits(5, config.objectType);\n }\n else {\n bitstream.writeBits(5, 31);\n bitstream.writeBits(6, config.objectType - 32);\n }\n bitstream.writeBits(4, frequencyIndex);\n if (frequencyIndex === 15) {\n bitstream.writeBits(24, customSampleRate);\n }\n bitstream.writeBits(4, channelConfiguration);\n return bytes;\n};\nexport const OPUS_SAMPLE_RATE = 48_000;\nconst PCM_CODEC_REGEX = /^pcm-([usf])(\\d+)+(be)?$/;\nexport const parsePcmCodec = (codec) => {\n assert(PCM_AUDIO_CODECS.includes(codec));\n if (codec === 'ulaw') {\n return { dataType: 'ulaw', sampleSize: 1, littleEndian: true, silentValue: 255 };\n }\n else if (codec === 'alaw') {\n return { dataType: 'alaw', sampleSize: 1, littleEndian: true, silentValue: 213 };\n }\n const match = PCM_CODEC_REGEX.exec(codec);\n assert(match);\n let dataType;\n if (match[1] === 'u') {\n dataType = 'unsigned';\n }\n else if (match[1] === 's') {\n dataType = 'signed';\n }\n else {\n dataType = 'float';\n }\n const sampleSize = (Number(match[2]) / 8);\n const littleEndian = match[3] !== 'be';\n const silentValue = codec === 'pcm-u8' ? 2 ** 7 : 0;\n return { dataType, sampleSize, littleEndian, silentValue };\n};\nexport const inferCodecFromCodecString = (codecString) => {\n // Video codecs\n if (codecString.startsWith('avc1') || codecString.startsWith('avc3')) {\n return 'avc';\n }\n else if (codecString.startsWith('hev1') || codecString.startsWith('hvc1')) {\n return 'hevc';\n }\n else if (codecString === 'vp8') {\n return 'vp8';\n }\n else if (codecString.startsWith('vp09')) {\n return 'vp9';\n }\n else if (codecString.startsWith('av01')) {\n return 'av1';\n }\n // Audio codecs\n if (codecString.startsWith('mp4a.40') || codecString === 'mp4a.67') {\n return 'aac';\n }\n else if (codecString === 'mp3'\n || codecString === 'mp4a.69'\n || codecString === 'mp4a.6B'\n || codecString === 'mp4a.6b') {\n return 'mp3';\n }\n else if (codecString === 'opus') {\n return 'opus';\n }\n else if (codecString === 'vorbis') {\n return 'vorbis';\n }\n else if (codecString === 'flac') {\n return 'flac';\n }\n else if (codecString === 'ulaw') {\n return 'ulaw';\n }\n else if (codecString === 'alaw') {\n return 'alaw';\n }\n else if (PCM_CODEC_REGEX.test(codecString)) {\n return codecString;\n }\n // Subtitle codecs\n if (codecString === 'webvtt') {\n return 'webvtt';\n }\n return null;\n};\nexport const getVideoEncoderConfigExtension = (codec) => {\n if (codec === 'avc') {\n return {\n avc: {\n format: 'avc', // Ensure the format is not Annex B\n },\n };\n }\n else if (codec === 'hevc') {\n return {\n hevc: {\n format: 'hevc', // Ensure the format is not Annex B\n },\n };\n }\n return {};\n};\nexport const getAudioEncoderConfigExtension = (codec) => {\n if (codec === 'aac') {\n return {\n aac: {\n format: 'aac', // Ensure the format is not ADTS\n },\n };\n }\n else if (codec === 'opus') {\n return {\n opus: {\n format: 'opus',\n },\n };\n }\n return {};\n};\nconst VALID_VIDEO_CODEC_STRING_PREFIXES = ['avc1', 'avc3', 'hev1', 'hvc1', 'vp8', 'vp09', 'av01'];\nconst AVC_CODEC_STRING_REGEX = /^(avc1|avc3)\\.[0-9a-fA-F]{6}$/;\nconst HEVC_CODEC_STRING_REGEX = /^(hev1|hvc1)\\.(?:[ABC]?\\d+)\\.[0-9a-fA-F]{1,8}\\.[LH]\\d+(?:\\.[0-9a-fA-F]{1,2}){0,6}$/;\nconst VP9_CODEC_STRING_REGEX = /^vp09(?:\\.\\d{2}){3}(?:(?:\\.\\d{2}){5})?$/;\nconst AV1_CODEC_STRING_REGEX = /^av01\\.\\d\\.\\d{2}[MH]\\.\\d{2}(?:\\.\\d\\.\\d{3}\\.\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d)?$/;\nexport const validateVideoChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Video chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Video chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Video chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Video chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedHeight) || metadata.decoderConfig.codedHeight <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.colorSpace !== undefined) {\n const { colorSpace } = metadata.decoderConfig;\n if (typeof colorSpace !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace, when provided, must be an object.');\n }\n const primariesValues = Object.keys(COLOR_PRIMARIES_MAP);\n if (colorSpace.primaries != null && !primariesValues.includes(colorSpace.primaries)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of`\n + ` ${primariesValues.join(', ')}.`);\n }\n const transferValues = Object.keys(TRANSFER_CHARACTERISTICS_MAP);\n if (colorSpace.transfer != null && !transferValues.includes(colorSpace.transfer)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of`\n + ` ${transferValues.join(', ')}.`);\n }\n const matrixValues = Object.keys(MATRIX_COEFFICIENTS_MAP);\n if (colorSpace.matrix != null && !matrixValues.includes(colorSpace.matrix)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of`\n + ` ${matrixValues.join(', ')}.`);\n }\n if (colorSpace.fullRange != null && typeof colorSpace.fullRange !== 'boolean') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('avc1') || metadata.decoderConfig.codec.startsWith('avc3')) {\n // AVC-specific validation\n if (!AVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as'\n + ' specified in Section 3.4 of RFC 6381.');\n }\n // `description` may or may not be set, depending on if the format is AVCC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-avc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('hev1') || metadata.decoderConfig.codec.startsWith('hvc1')) {\n // HEVC-specific validation\n if (!HEVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as'\n + ' specified in Section E.3 of ISO 14496-15.');\n }\n // `description` may or may not be set, depending on if the format is HEVC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-hevc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('vp8')) {\n // VP8-specific validation\n if (metadata.decoderConfig.codec !== 'vp8') {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be \"vp8\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vp09')) {\n // VP9-specific validation\n if (!VP9_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://www.webmproject.org/vp9/mp4/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('av01')) {\n // AV1-specific validation\n if (!AV1_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://aomediacodec.github.io/av1-isobmff/.');\n }\n }\n};\nconst VALID_AUDIO_CODEC_STRING_PREFIXES = ['mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm'];\nexport const validateAudioChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Audio chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Audio chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Audio chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Audio chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.numberOfChannels) || metadata.decoderConfig.numberOfChannels <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('mp4a')\n // These three refer to MP3:\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n // AAC-specific validation\n const validStrings = ['mp4a.40.2', 'mp4a.40.02', 'mp4a.40.5', 'mp4a.40.05', 'mp4a.40.29', 'mp4a.67'];\n if (!validStrings.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as'\n + ' specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be'\n + ' an AudioSpecificConfig as specified in ISO 14496-3.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('mp3') || metadata.decoderConfig.codec.startsWith('mp4a')) {\n // MP3-specific validation\n if (metadata.decoderConfig.codec !== 'mp3'\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be \"mp3\", \"mp4a.69\" or'\n + ' \"mp4a.6B\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('opus')) {\n // Opus-specific validation\n if (metadata.decoderConfig.codec !== 'opus') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be \"opus\".');\n }\n if (metadata.decoderConfig.description && metadata.decoderConfig.description.byteLength < 18) {\n // Description is optional for Opus per-spec, so we shouldn't enforce it\n throw new TypeError('Audio chunk metadata decoder configuration description, when specified, is expected to be an'\n + ' Identification Header as specified in Section 5.1 of RFC 7845.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vorbis')) {\n // Vorbis-specific validation\n if (metadata.decoderConfig.codec !== 'vorbis') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be \"vorbis\".');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('flac')) {\n // FLAC-specific validation\n if (metadata.decoderConfig.codec !== 'flac') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be \"flac\".');\n }\n const minDescriptionSize = 4 + 4 + 34; // 'fLaC' + metadata block header + STREAMINFO block\n if (!metadata.decoderConfig.description || metadata.decoderConfig.description.byteLength < minDescriptionSize) {\n throw new TypeError('Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('pcm')\n || metadata.decoderConfig.codec.startsWith('ulaw')\n || metadata.decoderConfig.codec.startsWith('alaw')) {\n // PCM-specific validation\n if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM'\n + ` codecs (${PCM_AUDIO_CODECS.join(', ')}).`);\n }\n }\n};\nexport const validateSubtitleMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Subtitle metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Subtitle metadata must be an object.');\n }\n if (!metadata.config) {\n throw new TypeError('Subtitle metadata must include a config object.');\n }\n if (typeof metadata.config !== 'object') {\n throw new TypeError('Subtitle metadata config must be an object.');\n }\n if (typeof metadata.config.description !== 'string') {\n throw new TypeError('Subtitle metadata config description must be a string.');\n }\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport function assert(x) {\n if (!x) {\n throw new Error('Assertion failed.');\n }\n}\nexport const normalizeRotation = (rotation) => {\n const mappedRotation = (rotation % 360 + 360) % 360;\n if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) {\n return mappedRotation;\n }\n else {\n throw new Error(`Invalid rotation ${rotation}.`);\n }\n};\nexport const last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nexport const isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\nexport class Bitstream {\n constructor(bytes) {\n this.bytes = bytes;\n /** Current offset in bits. */\n this.pos = 0;\n }\n seekToByte(byteOffset) {\n this.pos = 8 * byteOffset;\n }\n readBit() {\n const byteIndex = Math.floor(this.pos / 8);\n const byte = this.bytes[byteIndex] ?? 0;\n const bitIndex = 0b111 - (this.pos & 0b111);\n const bit = (byte & (1 << bitIndex)) >> bitIndex;\n this.pos++;\n return bit;\n }\n readBits(n) {\n if (n === 1) {\n return this.readBit();\n }\n let result = 0;\n for (let i = 0; i < n; i++) {\n result <<= 1;\n result |= this.readBit();\n }\n return result;\n }\n writeBits(n, value) {\n const end = this.pos + n;\n for (let i = this.pos; i < end; i++) {\n const byteIndex = Math.floor(i / 8);\n let byte = this.bytes[byteIndex];\n const bitIndex = 0b111 - (i & 0b111);\n byte &= ~(1 << bitIndex);\n byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n this.bytes[byteIndex] = byte;\n }\n this.pos = end;\n }\n ;\n readAlignedByte() {\n // Ensure we're byte-aligned\n if (this.pos % 8 !== 0) {\n throw new Error('Bitstream is not byte-aligned.');\n }\n const byteIndex = this.pos / 8;\n const byte = this.bytes[byteIndex] ?? 0;\n this.pos += 8;\n return byte;\n }\n skipBits(n) {\n this.pos += n;\n }\n getBitsLeft() {\n return this.bytes.length * 8 - this.pos;\n }\n clone() {\n const clone = new Bitstream(this.bytes);\n clone.pos = this.pos;\n return clone;\n }\n}\n/** Reads an exponential-Golomb universal code from a Bitstream. */\nexport const readExpGolomb = (bitstream) => {\n let leadingZeroBits = 0;\n while (bitstream.readBits(1) === 0 && leadingZeroBits < 32) {\n leadingZeroBits++;\n }\n if (leadingZeroBits >= 32) {\n throw new Error('Invalid exponential-Golomb code.');\n }\n const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits);\n return result;\n};\n/** Reads a signed exponential-Golomb universal code from a Bitstream. */\nexport const readSignedExpGolomb = (bitstream) => {\n const codeNum = readExpGolomb(bitstream);\n return ((codeNum & 1) === 0)\n ? -(codeNum >> 1)\n : ((codeNum + 1) >> 1);\n};\nexport const writeBits = (bytes, start, end, value) => {\n for (let i = start; i < end; i++) {\n const byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n const bitIndex = 0b111 - (i & 0b111);\n byte &= ~(1 << bitIndex);\n byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n bytes[byteIndex] = byte;\n }\n};\nexport const toUint8Array = (source) => {\n if (source.constructor === Uint8Array) { // We want a true Uint8Array, not something that extends it like Buffer\n return source;\n }\n else if (ArrayBuffer.isView(source)) {\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n else {\n return new Uint8Array(source);\n }\n};\nexport const toDataView = (source) => {\n if (source.constructor === DataView) {\n return source;\n }\n else if (ArrayBuffer.isView(source)) {\n return new DataView(source.buffer, source.byteOffset, source.byteLength);\n }\n else {\n return new DataView(source);\n }\n};\nexport const textDecoder = /* #__PURE__ */ new TextDecoder();\nexport const textEncoder = /* #__PURE__ */ new TextEncoder();\nexport const isIso88591Compatible = (text) => {\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code > 255) {\n return false;\n }\n }\n return true;\n};\nconst invertObject = (object) => {\n return Object.fromEntries(Object.entries(object).map(([key, value]) => [value, key]));\n};\n// For the color space mappings, see Rec. ITU-T H.273.\nexport const COLOR_PRIMARIES_MAP = {\n bt709: 1, // ITU-R BT.709\n bt470bg: 5, // ITU-R BT.470BG\n smpte170m: 6, // ITU-R BT.601 525 - SMPTE 170M\n bt2020: 9, // ITU-R BT.202\n smpte432: 12, // SMPTE EG 432-1\n};\nexport const COLOR_PRIMARIES_MAP_INVERSE = /* #__PURE__ */ invertObject(COLOR_PRIMARIES_MAP);\nexport const TRANSFER_CHARACTERISTICS_MAP = {\n 'bt709': 1, // ITU-R BT.709\n 'smpte170m': 6, // SMPTE 170M\n 'linear': 8, // Linear transfer characteristics\n 'iec61966-2-1': 13, // IEC 61966-2-1\n 'pq': 16, // Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system\n 'hlg': 18, // Rec. ITU-R BT.2100-2 hybrid loggamma (HLG) system\n};\nexport const TRANSFER_CHARACTERISTICS_MAP_INVERSE = /* #__PURE__ */ invertObject(TRANSFER_CHARACTERISTICS_MAP);\nexport const MATRIX_COEFFICIENTS_MAP = {\n 'rgb': 0, // Identity\n 'bt709': 1, // ITU-R BT.709\n 'bt470bg': 5, // ITU-R BT.470BG\n 'smpte170m': 6, // SMPTE 170M\n 'bt2020-ncl': 9, // ITU-R BT.2020-2 (non-constant luminance)\n};\nexport const MATRIX_COEFFICIENTS_MAP_INVERSE = /* #__PURE__ */ invertObject(MATRIX_COEFFICIENTS_MAP);\nexport const colorSpaceIsComplete = (colorSpace) => {\n return (!!colorSpace\n && !!colorSpace.primaries\n && !!colorSpace.transfer\n && !!colorSpace.matrix\n && colorSpace.fullRange !== undefined);\n};\nexport const isAllowSharedBufferSource = (x) => {\n return (x instanceof ArrayBuffer\n || (typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer)\n || ArrayBuffer.isView(x));\n};\nexport class AsyncMutex {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n async acquire() {\n let resolver;\n const nextPromise = new Promise((resolve) => {\n resolver = resolve;\n });\n const currentPromiseAlias = this.currentPromise;\n this.currentPromise = nextPromise;\n await currentPromiseAlias;\n return resolver;\n }\n}\nexport const bytesToHexString = (bytes) => {\n return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\n};\nexport const reverseBitsU32 = (x) => {\n x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);\n x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);\n x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);\n x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);\n x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);\n return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer\n};\n/** Returns the smallest index i such that val[i] === key, or -1 if no such index exists. */\nexport const binarySearchExact = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n const midVal = valueGetter(arr[mid]);\n if (midVal === key) {\n ans = mid;\n high = mid - 1; // Continue searching left to find the lowest index\n }\n else if (midVal < key) {\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\n/** Returns the largest index i such that val[i] <= key, or -1 if no such index exists. */\nexport const binarySearchLessOrEqual = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + (high - low + 1) / 2) | 0;\n const midVal = valueGetter(arr[mid]);\n if (midVal <= key) {\n ans = mid;\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\n/** Assumes the array is already sorted. */\nexport const insertSorted = (arr, item, valueGetter) => {\n const insertionIndex = binarySearchLessOrEqual(arr, valueGetter(item), valueGetter);\n arr.splice(insertionIndex + 1, 0, item); // This even behaves correctly for the -1 case\n};\nexport const promiseWithResolvers = () => {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve, reject: reject };\n};\nexport const removeItem = (arr, item) => {\n const index = arr.indexOf(item);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n};\nexport const findLast = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return arr[i];\n }\n }\n return undefined;\n};\nexport const findLastIndex = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return i;\n }\n }\n return -1;\n};\nexport const toAsyncIterator = async function* (source) {\n if (Symbol.iterator in source) {\n // @ts-expect-error Trust me\n yield* source[Symbol.iterator]();\n }\n else {\n // @ts-expect-error Trust me\n yield* source[Symbol.asyncIterator]();\n }\n};\nexport const validateAnyIterable = (iterable) => {\n if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) {\n throw new TypeError('Argument must be an iterable or async iterable.');\n }\n};\nexport const assertNever = (x) => {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Unexpected value: ${x}`);\n};\nexport const getUint24 = (view, byteOffset, littleEndian) => {\n const byte1 = view.getUint8(byteOffset);\n const byte2 = view.getUint8(byteOffset + 1);\n const byte3 = view.getUint8(byteOffset + 2);\n if (littleEndian) {\n return byte1 | (byte2 << 8) | (byte3 << 16);\n }\n else {\n return (byte1 << 16) | (byte2 << 8) | byte3;\n }\n};\nexport const getInt24 = (view, byteOffset, littleEndian) => {\n // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift\n // then correctly interprets the sign bit.\n return getUint24(view, byteOffset, littleEndian) << 8 >> 8;\n};\nexport const setUint24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit unsigned range (0 to 16777215)\n value = value >>> 0; // Convert to unsigned 32-bit\n value = value & 0xFFFFFF; // Mask to 24 bits\n if (littleEndian) {\n view.setUint8(byteOffset, value & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, (value >>> 16) & 0xFF);\n }\n else {\n view.setUint8(byteOffset, (value >>> 16) & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, value & 0xFF);\n }\n};\nexport const setInt24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit signed range (-8388608 to 8388607)\n value = clamp(value, -8388608, 8388607);\n // Convert negative values to their 24-bit representation\n if (value < 0) {\n value = (value + 0x1000000) & 0xFFFFFF;\n }\n setUint24(view, byteOffset, value, littleEndian);\n};\nexport const setInt64 = (view, byteOffset, value, littleEndian) => {\n if (littleEndian) {\n view.setUint32(byteOffset + 0, value, true);\n view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true);\n }\n else {\n view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true);\n view.setUint32(byteOffset + 4, value, true);\n }\n};\n/**\n * Calls a function on each value spat out by an async generator. The reason for writing this manually instead of\n * using a generator function is that the generator function queues return() calls - here, we forward them immediately.\n */\nexport const mapAsyncGenerator = (generator, map) => {\n return {\n async next() {\n const result = await generator.next();\n if (result.done) {\n return { value: undefined, done: true };\n }\n else {\n return { value: map(result.value), done: false };\n }\n },\n return() {\n return generator.return();\n },\n throw(error) {\n return generator.throw(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n};\nexport const clamp = (value, min, max) => {\n return Math.max(min, Math.min(max, value));\n};\nexport const UNDETERMINED_LANGUAGE = 'und';\nexport const roundIfAlmostInteger = (value) => {\n const rounded = Math.round(value);\n if (Math.abs(value / rounded - 1) < 10 * Number.EPSILON) {\n return rounded;\n }\n else {\n return value;\n }\n};\nexport const roundToMultiple = (value, multiple) => {\n return Math.round(value / multiple) * multiple;\n};\nexport const ilog = (x) => {\n let ret = 0;\n while (x) {\n ret++;\n x >>= 1;\n }\n return ret;\n};\nconst ISO_639_2_REGEX = /^[a-z]{3}$/;\nexport const isIso639Dash2LanguageCode = (x) => {\n return ISO_639_2_REGEX.test(x);\n};\n// Since the result will be truncated, add a bit of eps to compensate for floating point errors\nexport const SECOND_TO_MICROSECOND_FACTOR = 1e6 * (1 + Number.EPSILON);\n/**\n * Merges two RequestInit objects with special handling for headers.\n * Headers are merged case-insensitively, but original casing is preserved.\n * init2 headers take precedence and will override case-insensitive matches from init1.\n */\nexport const mergeRequestInit = (init1, init2) => {\n const merged = { ...init1, ...init2 };\n // Special handling for headers\n if (init1.headers || init2.headers) {\n const headers1 = init1.headers ? normalizeHeaders(init1.headers) : {};\n const headers2 = init2.headers ? normalizeHeaders(init2.headers) : {};\n const mergedHeaders = { ...headers1 };\n // For each header in headers2, check if a case-insensitive match exists in mergedHeaders\n Object.entries(headers2).forEach(([key2, value2]) => {\n const existingKey = Object.keys(mergedHeaders).find(key1 => key1.toLowerCase() === key2.toLowerCase());\n if (existingKey) {\n delete mergedHeaders[existingKey];\n }\n mergedHeaders[key2] = value2;\n });\n merged.headers = mergedHeaders;\n }\n return merged;\n};\n/** Normalizes HeadersInit to a Record format. */\nconst normalizeHeaders = (headers) => {\n if (headers instanceof Headers) {\n const result = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n if (Array.isArray(headers)) {\n const result = {};\n headers.forEach(([key, value]) => {\n result[key] = value;\n });\n return result;\n }\n return headers;\n};\nexport const retriedFetch = async (fetchFn, url, requestInit, getRetryDelay, shouldStop) => {\n let attempts = 0;\n while (true) {\n try {\n return await fetchFn(url, requestInit);\n }\n catch (error) {\n if (shouldStop()) {\n throw error;\n }\n attempts++;\n const retryDelayInSeconds = getRetryDelay(attempts, error, url);\n if (retryDelayInSeconds === null) {\n throw error;\n }\n console.error('Retrying failed fetch. Error:', error);\n if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) {\n throw new TypeError('Retry delay must be a non-negative finite number.');\n }\n if (retryDelayInSeconds > 0) {\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n }\n if (shouldStop()) {\n throw error;\n }\n }\n }\n};\nexport const computeRationalApproximation = (x, maxDenominator) => {\n // Handle negative numbers\n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x);\n let prevNumerator = 0, prevDenominator = 1;\n let currNumerator = 1, currDenominator = 0;\n // Continued fraction algorithm\n let remainder = x;\n while (true) {\n const integer = Math.floor(remainder);\n // Calculate next convergent\n const nextNumerator = integer * currNumerator + prevNumerator;\n const nextDenominator = integer * currDenominator + prevDenominator;\n if (nextDenominator > maxDenominator) {\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n }\n prevNumerator = currNumerator;\n prevDenominator = currDenominator;\n currNumerator = nextNumerator;\n currDenominator = nextDenominator;\n remainder = 1 / (remainder - integer);\n // Guard against precision issues\n if (!isFinite(remainder)) {\n break;\n }\n }\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n};\nexport class CallSerializer {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n call(fn) {\n return this.currentPromise = this.currentPromise.then(fn);\n }\n}\nlet isWebKitCache = null;\nexport const isWebKit = () => {\n if (isWebKitCache !== null) {\n return isWebKitCache;\n }\n // This even returns true for WebKit-wrapping browsers such as Chrome on iOS\n return isWebKitCache = !!(typeof navigator !== 'undefined'\n && (navigator.vendor?.match(/apple/i)\n // Or, in workers:\n || (/AppleWebKit/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent))\n || /\\b(iPad|iPhone|iPod)\\b/.test(navigator.userAgent)));\n};\nlet isFirefoxCache = null;\nexport const isFirefox = () => {\n if (isFirefoxCache !== null) {\n return isFirefoxCache;\n }\n return isFirefoxCache = typeof navigator !== 'undefined' && navigator.userAgent?.includes('Firefox');\n};\nlet isChromiumCache = null;\nexport const isChromium = () => {\n if (isChromiumCache !== null) {\n return isChromiumCache;\n }\n return isChromiumCache = !!(typeof navigator !== 'undefined'\n && (navigator.vendor?.includes('Google Inc') || /Chrome/.test(navigator.userAgent)));\n};\nlet chromiumVersionCache = null;\nexport const getChromiumVersion = () => {\n if (chromiumVersionCache !== null) {\n return chromiumVersionCache;\n }\n if (typeof navigator === 'undefined') {\n return null;\n }\n const match = /\\bChrome\\/(\\d+)/.exec(navigator.userAgent);\n if (!match) {\n return null;\n }\n return chromiumVersionCache = Number(match[1]);\n};\n/** Acts like `??` except the condition is -1 and not null/undefined. */\nexport const coalesceIndex = (a, b) => {\n return a !== -1 ? a : b;\n};\nexport const closedIntervalsOverlap = (startA, endA, startB, endB) => {\n return startA <= endB && startB <= endA;\n};\nexport const keyValueIterator = function* (object) {\n for (const key in object) {\n const value = object[key];\n if (value === undefined) {\n continue;\n }\n yield { key, value };\n }\n};\nexport const imageMimeTypeToExtension = (mimeType) => {\n switch (mimeType.toLowerCase()) {\n case 'image/jpeg':\n case 'image/jpg':\n return '.jpg';\n case 'image/png':\n return '.png';\n case 'image/gif':\n return '.gif';\n case 'image/webp':\n return '.webp';\n case 'image/bmp':\n return '.bmp';\n case 'image/svg+xml':\n return '.svg';\n case 'image/tiff':\n return '.tiff';\n case 'image/avif':\n return '.avif';\n case 'image/x-icon':\n case 'image/vnd.microsoft.icon':\n return '.ico';\n default:\n return null;\n }\n};\nexport const base64ToBytes = (base64) => {\n const decoded = atob(base64);\n const bytes = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) {\n bytes[i] = decoded.charCodeAt(i);\n }\n return bytes;\n};\nexport const bytesToBase64 = (bytes) => {\n let string = '';\n for (let i = 0; i < bytes.length; i++) {\n string += String.fromCharCode(bytes[i]);\n }\n return btoa(string);\n};\nexport const uint8ArraysAreEqual = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n};\nexport const polyfillSymbolDispose = () => {\n // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html\n // @ts-expect-error Readonly\n Symbol.dispose ??= Symbol('Symbol.dispose');\n};\nexport const isNumber = (x) => {\n return typeof x === 'number' && !Number.isNaN(x);\n};\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, binarySearchLessOrEqual, closedIntervalsOverlap, isNumber, isWebKit, mergeRequestInit, promiseWithResolvers, retriedFetch, toDataView, toUint8Array, } from './misc.js';\nimport * as nodeAlias from './node.js';\nimport { InputDisposedError } from './input.js';\nconst node = typeof nodeAlias !== 'undefined'\n ? nodeAlias // Aliasing it prevents some bundler warnings\n : undefined;\n/**\n * The source base class, representing a resource from which bytes can be read.\n * @group Input sources\n * @public\n */\nexport class Source {\n constructor() {\n /** @internal */\n this._disposed = false;\n /** @internal */\n this._sizePromise = null;\n /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */\n this.onread = null;\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Returns null if the source is unsized.\n */\n async getSizeOrNull() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n return this._sizePromise ??= Promise.resolve(this._retrieveSize());\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Throws an error if the source is unsized.\n */\n async getSize() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n const result = await this.getSizeOrNull();\n if (result === null) {\n throw new Error('Cannot determine the size of an unsized source.');\n }\n return result;\n }\n}\n/**\n * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory.\n * @group Input sources\n * @public\n */\nexport class BufferSource extends Source {\n /**\n * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`,\n * or `ArrayBufferView`.\n */\n constructor(buffer) {\n if (!(buffer instanceof ArrayBuffer)\n && !(typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer)\n && !ArrayBuffer.isView(buffer)) {\n throw new TypeError('buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.');\n }\n super();\n /** @internal */\n this._onreadCalled = false;\n this._bytes = toUint8Array(buffer);\n this._view = toDataView(buffer);\n }\n /** @internal */\n _retrieveSize() {\n return this._bytes.byteLength;\n }\n /** @internal */\n _read() {\n if (!this._onreadCalled) {\n // We just say the first read retrives all bytes from the source (which, I mean, it does)\n this.onread?.(0, this._bytes.byteLength);\n this._onreadCalled = true;\n }\n return {\n bytes: this._bytes,\n view: this._view,\n offset: 0,\n };\n }\n /** @internal */\n _dispose() { }\n}\n/**\n * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a\n * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when\n * reading files off the disk.\n * @group Input sources\n * @public\n */\nexport class BlobSource extends Source {\n /**\n * Creates a new {@link BlobSource} backed by the specified\n * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob).\n */\n constructor(blob, options = {}) {\n if (!(blob instanceof Blob)) {\n throw new TypeError('blob must be a Blob.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._readers = new WeakMap();\n this._blob = blob;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 4,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.fileSystem,\n });\n }\n /** @internal */\n _retrieveSize() {\n const size = this._blob.size;\n this._orchestrator.fileSize = size;\n return size;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n let reader = this._readers.get(worker);\n if (reader === undefined) {\n // https://github.com/Vanilagy/mediabunny/issues/184\n // WebKit has critical bugs with blob.stream():\n // - WebKitBlobResource error 1 when streaming large files\n // - Memory buildup and reload loops on iOS (network process crashes)\n // - ReadableStream stalls under backpressure (especially video)\n // Affects Safari and all iOS browsers (Chrome, Firefox, etc.).\n // Use arrayBuffer() fallback for WebKit browsers.\n if ('stream' in this._blob && !isWebKit()) {\n // Get a reader of the blob starting at the required offset, and then keep it around\n const slice = this._blob.slice(worker.currentPos);\n reader = slice.stream().getReader();\n }\n else {\n // We'll need to use more primitive ways\n reader = null;\n }\n this._readers.set(worker, reader);\n }\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n if (reader) {\n const { done, value } = await reader.read();\n if (done) {\n this._orchestrator.forgetWorker(worker);\n throw new Error('Blob reader stopped unexpectedly before all requested data was read.');\n }\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n else {\n const data = await this._blob.slice(worker.currentPos, worker.targetPos).arrayBuffer();\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.byteLength);\n this._orchestrator.supplyWorkerData(worker, new Uint8Array(data));\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\nconst URL_SOURCE_MIN_LOAD_AMOUNT = 0.5 * 2 ** 20; // 0.5 MiB\nconst DEFAULT_RETRY_DELAY = ((previousAttempts, error, src) => {\n // Check if this could be a CORS error. If so, we cannot recover from it and\n // should not attempt to retry.\n // CORS errors are intentionally not opaque, so we need to rely on heuristics.\n const couldBeCorsError = error instanceof Error && (error.message.includes('Failed to fetch') // Chrome\n || error.message.includes('Load failed') // Safari\n || error.message.includes('NetworkError when attempting to fetch resource') // Firefox\n );\n if (couldBeCorsError) {\n let originOfSrc = null;\n // Checking if the origin is different, because only then a CORS error could originate\n try {\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n originOfSrc = new URL(src instanceof Request ? src.url : src, window.location.href).origin;\n }\n }\n catch {\n // URL parse failed\n }\n // If user is offline, it is probably not a CORS error.\n const isOnline = typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true;\n if (isOnline && originOfSrc !== null && originOfSrc !== window.location.origin) {\n console.warn(`Request will not be retried because a CORS error was suspected due to different origins. You can`\n + ` modify this behavior by providing your own function for the 'getRetryDelay' option.`);\n return null;\n }\n }\n return Math.min(2 ** (previousAttempts - 2), 16);\n});\n/**\n * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized\n * reading and prefetching pattern to minimize request count and latency.\n * @group Input sources\n * @public\n */\nexport class UrlSource extends Source {\n /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */\n constructor(url, options = {}) {\n if (typeof url !== 'string'\n && !(url instanceof URL)\n && !(typeof Request !== 'undefined' && url instanceof Request)) {\n throw new TypeError('url must be a string, URL or Request.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) {\n throw new TypeError('options.requestInit, when provided, must be an object.');\n }\n if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') {\n throw new TypeError('options.getRetryDelay, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.fetchFn !== undefined && typeof options.fetchFn !== 'function') {\n throw new TypeError('options.fetchFn, when provided, must be a function.');\n // Won't bother validating this function beyond this\n }\n super();\n /** @internal */\n this._existingResponses = new WeakMap();\n this._url = url;\n this._options = options;\n this._getRetryDelay = options.getRetryDelay ?? DEFAULT_RETRY_DELAY;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (64 * 2 ** 20 /* 64 MiB */),\n // Most files in the real-world have a single sequential access pattern, but having two in parallel can\n // also happen\n maxWorkerCount: 2,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.network,\n });\n }\n /** @internal */\n async _retrieveSize() {\n // Retrieving the resource size for UrlSource is optimized: Almost always (= always), the first bytes we have to\n // read are the start of the file. This means it's smart to combine size fetching with fetching the start of the\n // file. We additionally use this step to probe if the server supports range requests, killing three birds with\n // one stone.\n const abortController = new AbortController();\n const response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n // We could also send a non-range request to request the same bytes (all of them), but doing it like\n // this is an easy way to check if the server supports range requests in the first place\n Range: 'bytes=0-',\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n let worker;\n let fileSize;\n if (response.status === 206) {\n fileSize = this._getTotalLengthFromRangeResponse(response);\n worker = this._orchestrator.createWorker(0, Math.min(fileSize, URL_SOURCE_MIN_LOAD_AMOUNT));\n }\n else {\n // Server probably returned a 200.\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n fileSize = Number(contentLength);\n worker = this._orchestrator.createWorker(0, fileSize);\n this._orchestrator.options.maxCacheSize = Infinity; // 🤷\n console.warn('HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has'\n + ' to be downloaded. For efficient media file streaming across a network, please make sure your'\n + ' server supports range requests.');\n }\n else {\n throw new Error(`HTTP response (status ${response.status}) must surface Content-Length header.`);\n }\n }\n this._orchestrator.fileSize = fileSize;\n this._existingResponses.set(worker, { response, abortController });\n this._orchestrator.runWorker(worker);\n return fileSize;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n // The outer loop is for resuming a request if it dies mid-response\n while (true) {\n const existing = this._existingResponses.get(worker);\n this._existingResponses.delete(worker);\n let abortController = existing?.abortController;\n let response = existing?.response;\n if (!abortController) {\n abortController = new AbortController();\n response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n Range: `bytes=${worker.currentPos}-`,\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n }\n assert(response);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n if (worker.currentPos > 0 && response.status !== 206) {\n throw new Error('HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media'\n + ' file streaming across a network, please make sure your server supports range requests.');\n }\n if (!response.body) {\n throw new Error('Missing HTTP response body stream. The used fetch function must provide the response body as a'\n + ' ReadableStream.');\n }\n const reader = response.body.getReader();\n while (true) {\n if (worker.currentPos >= worker.targetPos || worker.aborted) {\n abortController.abort();\n worker.running = false;\n return;\n }\n let readResult;\n try {\n readResult = await reader.read();\n }\n catch (error) {\n if (this._disposed) {\n // No need to try to retry\n throw error;\n }\n const retryDelayInSeconds = this._getRetryDelay(1, error, this._url);\n if (retryDelayInSeconds !== null) {\n console.error('Error while reading response stream. Attempting to resume.', error);\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n break;\n }\n else {\n throw error;\n }\n }\n if (worker.aborted) {\n break;\n }\n const { done, value } = readResult;\n if (done) {\n if (worker.currentPos >= worker.targetPos) {\n // All data was delivered, we're good\n this._orchestrator.forgetWorker(worker);\n worker.running = false;\n return;\n }\n // The response stopped early, before the target. This can happen if server decides to cap range\n // requests arbitrarily, even if the request had an uncapped end. In this case, let's fetch the rest\n // of the data using a new request.\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n if (worker.aborted) {\n break;\n }\n }\n worker.running = false;\n // The previous UrlSource had logic for circumventing https://issues.chromium.org/issues/436025873; I haven't\n // been able to observe this bug with the new UrlSource (maybe because we're using response streaming), so the\n // logic for that has vanished for now. Leaving a comment here if this becomes relevant again.\n }\n /** @internal */\n _getTotalLengthFromRangeResponse(response) {\n const contentRange = response.headers.get('Content-Range');\n if (contentRange) {\n const match = /\\/(\\d+)/.exec(contentRange);\n if (match) {\n return Number(match[1]);\n }\n }\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n return Number(contentLength);\n }\n else {\n throw new Error('Partial HTTP response (status 206) must surface either Content-Range or'\n + ' Content-Length header.');\n }\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\n/**\n * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno.\n *\n * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file\n * handle acquired by this source.\n * @group Input sources\n * @public\n */\nexport class FilePathSource extends Source {\n /** Creates a new {@link FilePathSource} backed by the file at the specified file path. */\n constructor(filePath, options = {}) {\n if (typeof filePath !== 'string') {\n throw new TypeError('filePath must be a string.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._fileHandle = null;\n // Let's back this source with a StreamSource, makes the implementation very simple\n this._streamSource = new StreamSource({\n getSize: async () => {\n this._fileHandle = await node.fs.open(filePath, 'r');\n const stats = await this._fileHandle.stat();\n return stats.size;\n },\n read: async (start, end) => {\n assert(this._fileHandle);\n const buffer = new Uint8Array(end - start);\n await this._fileHandle.read(buffer, 0, end - start, start);\n return buffer;\n },\n maxCacheSize: options.maxCacheSize,\n prefetchProfile: 'fileSystem',\n });\n }\n /** @internal */\n _read(start, end) {\n return this._streamSource._read(start, end);\n }\n /** @internal */\n _retrieveSize() {\n return this._streamSource._retrieveSize();\n }\n /** @internal */\n _dispose() {\n this._streamSource._dispose();\n void this._fileHandle?.close();\n this._fileHandle = null;\n }\n}\n/**\n * A general-purpose, callback-driven source that can get its data from anywhere.\n * @group Input sources\n * @public\n */\nexport class StreamSource extends Source {\n /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */\n constructor(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (typeof options.getSize !== 'function') {\n throw new TypeError('options.getSize must be a function.');\n }\n if (typeof options.read !== 'function') {\n throw new TypeError('options.read must be a function.');\n }\n if (options.dispose !== undefined && typeof options.dispose !== 'function') {\n throw new TypeError('options.dispose, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.prefetchProfile && !['none', 'fileSystem', 'network'].includes(options.prefetchProfile)) {\n throw new TypeError('options.prefetchProfile, when provided, must be one of \\'none\\', \\'fileSystem\\' or \\'network\\'.');\n }\n super();\n this._options = options;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 2, // Fixed for now, *should* be fine\n prefetchProfile: PREFETCH_PROFILES[options.prefetchProfile ?? 'none'],\n runWorker: this._runWorker.bind(this),\n });\n }\n /** @internal */\n _retrieveSize() {\n const result = this._options.getSize();\n if (result instanceof Promise) {\n return result.then((size) => {\n if (!Number.isInteger(size) || size < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = size;\n return size;\n });\n }\n else {\n if (!Number.isInteger(result) || result < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = result;\n return result;\n }\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n const originalCurrentPos = worker.currentPos;\n const originalTargetPos = worker.targetPos;\n let data = this._options.read(worker.currentPos, originalTargetPos);\n if (data instanceof Promise)\n data = await data;\n if (worker.aborted) {\n break;\n }\n if (data instanceof Uint8Array) {\n data = toUint8Array(data); // Normalize things like Node.js Buffer to Uint8Array\n if (data.length !== originalTargetPos - worker.currentPos) {\n // Yes, we're that strict\n throw new Error(`options.read returned a Uint8Array with unexpected length: Requested ${originalTargetPos - worker.currentPos} bytes, but got ${data.length}.`);\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n else if (data instanceof ReadableStream) {\n const reader = data.getReader();\n while (worker.currentPos < originalTargetPos && !worker.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n if (worker.currentPos < originalTargetPos) {\n // Yes, we're *that* strict\n throw new Error(`ReadableStream returned by options.read ended before supplying enough data.`\n + ` Requested ${originalTargetPos - originalCurrentPos} bytes, but got ${worker.currentPos - originalCurrentPos}`);\n }\n break;\n }\n if (!(value instanceof Uint8Array)) {\n throw new TypeError('ReadableStream returned by options.read must yield Uint8Array chunks.');\n }\n if (worker.aborted) {\n break;\n }\n const data = toUint8Array(value); // Normalize things like Node.js Buffer to Uint8Array\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n }\n else {\n throw new TypeError('options.read must return or resolve to a Uint8Array or a ReadableStream.');\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n this._options.dispose?.();\n }\n}\n/**\n * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of\n * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally\n * streaming in input files that are still being constructed and whose size we don't yet know, like for example the\n * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder).\n *\n * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the\n * lack of random file access. You should only use this source with sequential access patterns, such as reading all\n * packets from start to end. This source does not work well with random access patterns unless you increase its\n * max cache size.\n *\n * @group Input sources\n * @public\n */\nexport class ReadableStreamSource extends Source {\n /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */\n constructor(stream, options = {}) {\n if (!(stream instanceof ReadableStream)) {\n throw new TypeError('stream must be a ReadableStream.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._reader = null;\n /** @internal */\n this._cache = [];\n /** @internal */\n this._pendingSlices = [];\n /** @internal */\n this._currentIndex = 0;\n /** @internal */\n this._targetIndex = 0;\n /** @internal */\n this._maxRequestedIndex = 0;\n /** @internal */\n this._endIndex = null;\n /** @internal */\n this._pulling = false;\n this._stream = stream;\n this._maxCacheSize = options.maxCacheSize ?? (16 * 2 ** 20 /* 16 MiB */);\n }\n /** @internal */\n _retrieveSize() {\n return this._endIndex; // Starts out as null, meaning this source is unsized\n }\n /** @internal */\n _read(start, end) {\n if (this._endIndex !== null && end > this._endIndex) {\n return null;\n }\n this._maxRequestedIndex = Math.max(this._maxRequestedIndex, end);\n const cacheStartIndex = binarySearchLessOrEqual(this._cache, start, x => x.start);\n const cacheStartEntry = cacheStartIndex !== -1 ? this._cache[cacheStartIndex] : null;\n if (cacheStartEntry && cacheStartEntry.start <= start && end <= cacheStartEntry.end) {\n // The request can be satisfied with a single cache entry\n return {\n bytes: cacheStartEntry.bytes,\n view: cacheStartEntry.view,\n offset: cacheStartEntry.start,\n };\n }\n let lastEnd = start;\n const bytes = new Uint8Array(end - start);\n if (cacheStartIndex !== -1) {\n // Walk over the cache to see if we can satisfy the request using multiple cache entries\n for (let i = cacheStartIndex; i < this._cache.length; i++) {\n const cacheEntry = this._cache[i];\n if (cacheEntry.start >= end) {\n break;\n }\n const cappedStart = Math.max(start, cacheEntry.start);\n if (cappedStart > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const cappedEnd = Math.min(end, cacheEntry.end);\n if (cappedStart < cappedEnd) {\n bytes.set(cacheEntry.bytes.subarray(cappedStart - cacheEntry.start, cappedEnd - cacheEntry.start), cappedStart - start);\n lastEnd = cappedEnd;\n }\n }\n }\n if (lastEnd === end) {\n return {\n bytes,\n view: toDataView(bytes),\n offset: start,\n };\n }\n // We need to pull more data\n if (this._currentIndex > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const { promise, resolve, reject } = promiseWithResolvers();\n this._pendingSlices.push({\n start,\n end,\n bytes,\n resolve,\n reject,\n });\n this._targetIndex = Math.max(this._targetIndex, end);\n // Start pulling from the stream if we're not already doing it\n if (!this._pulling) {\n this._pulling = true;\n void this._pull()\n .catch((error) => {\n this._pulling = false;\n if (this._pendingSlices.length > 0) {\n this._pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n this._pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n return promise;\n }\n /** @internal */\n _throwDueToCacheMiss() {\n throw new Error('Read is before the cached region. With ReadableStreamSource, you must access the data more'\n + ' sequentially or increase the size of its cache.');\n }\n /** @internal */\n async _pull() {\n this._reader ??= this._stream.getReader();\n // This is the loop that keeps pulling data from the stream until a target index is reached, filling requests\n // in the process\n while (this._currentIndex < this._targetIndex && !this._disposed) {\n const { done, value } = await this._reader.read();\n if (done) {\n for (const pendingSlice of this._pendingSlices) {\n pendingSlice.resolve(null);\n }\n this._pendingSlices.length = 0;\n this._endIndex = this._currentIndex; // We know how long the file is now!\n break;\n }\n const startIndex = this._currentIndex;\n const endIndex = this._currentIndex + value.byteLength;\n // Fill the pending slices with the data\n for (let i = 0; i < this._pendingSlices.length; i++) {\n const pendingSlice = this._pendingSlices[i];\n const cappedStart = Math.max(startIndex, pendingSlice.start);\n const cappedEnd = Math.min(endIndex, pendingSlice.end);\n if (cappedStart < cappedEnd) {\n pendingSlice.bytes.set(value.subarray(cappedStart - startIndex, cappedEnd - startIndex), cappedStart - pendingSlice.start);\n if (cappedEnd === pendingSlice.end) {\n // Pending slice fully filled\n pendingSlice.resolve({\n bytes: pendingSlice.bytes,\n view: toDataView(pendingSlice.bytes),\n offset: pendingSlice.start,\n });\n this._pendingSlices.splice(i, 1);\n i--;\n }\n }\n }\n this._cache.push({\n start: startIndex,\n end: endIndex,\n bytes: value,\n view: toDataView(value),\n age: 0, // Unused\n });\n // Do cache eviction, based on the distance from the last-requested index. It's important that we do it like\n // this and not based on where the reader is at, because if the reader is fast, we'll unnecessarily evict\n // data that we still might need.\n while (this._cache.length > 0) {\n const firstEntry = this._cache[0];\n const distance = this._maxRequestedIndex - firstEntry.end;\n if (distance <= this._maxCacheSize) {\n break;\n }\n this._cache.shift();\n }\n this._currentIndex += value.byteLength;\n }\n this._pulling = false;\n }\n /** @internal */\n _dispose() {\n this._pendingSlices.length = 0;\n this._cache.length = 0;\n }\n}\nconst PREFETCH_PROFILES = {\n none: (start, end) => ({ start, end }),\n fileSystem: (start, end) => {\n const padding = 2 ** 16;\n start = Math.floor((start - padding) / padding) * padding;\n end = Math.ceil((end + padding) / padding) * padding;\n return { start, end };\n },\n network: (start, end, workers) => {\n // Add a slight bit of start padding because backwards reading is painful\n const paddingStart = 2 ** 16;\n start = Math.max(0, Math.floor((start - paddingStart) / paddingStart) * paddingStart);\n // Remote resources have extreme latency (relatively speaking), so the benefit from intelligent\n // prefetching is great. The network prefetch strategy is as follows: When we notice\n // successive reads to a worker's read region, we prefetch more data at the end of that region,\n // growing exponentially (up to a cap). This performs well for real-world use cases: Either we read a\n // small part of the file once and then never need it again, in which case the requested about of data\n // is small. Or, we're repeatedly doing a sequential access pattern (common in media files), in which\n // case we can become more and more confident to prefetch more and more data.\n for (const worker of workers) {\n const maxExtensionAmount = 8 * 2 ** 20; // 8 MiB\n // When the read region cross the threshold point, we trigger a prefetch. This point is typically\n // in the middle of the worker's read region, or a fixed offset from the end if the region has grown\n // really large.\n const thresholdPoint = Math.max((worker.startPos + worker.targetPos) / 2, worker.targetPos - maxExtensionAmount);\n if (closedIntervalsOverlap(start, end, thresholdPoint, worker.targetPos)) {\n const size = worker.targetPos - worker.startPos;\n // If we extend by maxExtensionAmount\n const a = Math.ceil((size + 1) / maxExtensionAmount) * maxExtensionAmount;\n // If we extend to the next power of 2\n const b = 2 ** Math.ceil(Math.log2(size + 1));\n const extent = Math.min(b, a);\n end = Math.max(end, worker.startPos + extent);\n }\n }\n end = Math.max(end, start + URL_SOURCE_MIN_LOAD_AMOUNT);\n return {\n start,\n end,\n };\n },\n};\n/**\n * Godclass for orchestrating complex, cached read operations. The reading model is as follows: Any reading task is\n * delegated to a *worker*, which is a sequential reader positioned somewhere along the file. All workers run in\n * parallel and can be stopped and resumed in their forward movement. When read requests come in, this orchestrator will\n * first try to satisfy the request with only the cached data. If this isn't possible, workers are spun up for all\n * missing parts (or existing workers are repurposed), and these workers will then fill the holes in the data as they\n * march along the file.\n */\nclass ReadOrchestrator {\n constructor(options) {\n this.options = options;\n this.fileSize = null;\n this.nextAge = 0; // Used for LRU eviction of both cache entries and workers\n this.workers = [];\n this.cache = [];\n this.currentCacheSize = 0;\n this.disposed = false;\n }\n read(innerStart, innerEnd) {\n assert(this.fileSize !== null);\n const prefetchRange = this.options.prefetchProfile(innerStart, innerEnd, this.workers);\n const outerStart = Math.max(prefetchRange.start, 0);\n const outerEnd = Math.min(prefetchRange.end, this.fileSize);\n assert(outerStart <= innerStart && innerEnd <= outerEnd);\n let result = null;\n const innerCacheStartIndex = binarySearchLessOrEqual(this.cache, innerStart, x => x.start);\n const innerStartEntry = innerCacheStartIndex !== -1 ? this.cache[innerCacheStartIndex] : null;\n // See if the read request can be satisfied by a single cache entry\n if (innerStartEntry && innerStartEntry.start <= innerStart && innerEnd <= innerStartEntry.end) {\n innerStartEntry.age = this.nextAge++;\n result = {\n bytes: innerStartEntry.bytes,\n view: innerStartEntry.view,\n offset: innerStartEntry.start,\n };\n // Can't return yet though, still need to check if the prefetch range might lie outside the cached area\n }\n const outerCacheStartIndex = binarySearchLessOrEqual(this.cache, outerStart, x => x.start);\n const bytes = result ? null : new Uint8Array(innerEnd - innerStart);\n let contiguousBytesWriteEnd = 0; // Used to track if the cache is able to completely cover the bytes\n let lastEnd = outerStart;\n // The \"holes\" in the cache (the parts we need to load)\n const outerHoles = [];\n // Loop over the cache and build up the list of holes\n if (outerCacheStartIndex !== -1) {\n for (let i = outerCacheStartIndex; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.start >= outerEnd) {\n break;\n }\n if (entry.end <= outerStart) {\n continue;\n }\n const cappedOuterStart = Math.max(outerStart, entry.start);\n const cappedOuterEnd = Math.min(outerEnd, entry.end);\n assert(cappedOuterStart <= cappedOuterEnd);\n if (lastEnd < cappedOuterStart) {\n outerHoles.push({ start: lastEnd, end: cappedOuterStart });\n }\n lastEnd = cappedOuterEnd;\n if (bytes) {\n const cappedInnerStart = Math.max(innerStart, entry.start);\n const cappedInnerEnd = Math.min(innerEnd, entry.end);\n if (cappedInnerStart < cappedInnerEnd) {\n const relativeOffset = cappedInnerStart - innerStart;\n // Fill the relevant section of the bytes with the cached data\n bytes.set(entry.bytes.subarray(cappedInnerStart - entry.start, cappedInnerEnd - entry.start), relativeOffset);\n if (relativeOffset === contiguousBytesWriteEnd) {\n contiguousBytesWriteEnd = cappedInnerEnd - innerStart;\n }\n }\n }\n entry.age = this.nextAge++;\n }\n if (lastEnd < outerEnd) {\n outerHoles.push({ start: lastEnd, end: outerEnd });\n }\n }\n else {\n outerHoles.push({ start: outerStart, end: outerEnd });\n }\n if (bytes && contiguousBytesWriteEnd >= bytes.length) {\n // Multiple cache entries were able to completely cover the requested bytes!\n result = {\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n };\n }\n if (outerHoles.length === 0) {\n assert(result);\n return result;\n }\n // We need to read more data, so now we're in async land\n const { promise, resolve, reject } = promiseWithResolvers();\n const innerHoles = [];\n for (const outerHole of outerHoles) {\n const cappedStart = Math.max(innerStart, outerHole.start);\n const cappedEnd = Math.min(innerEnd, outerHole.end);\n if (cappedStart === outerHole.start && cappedEnd === outerHole.end) {\n innerHoles.push(outerHole); // Can reuse without allocating a new object\n }\n else if (cappedStart < cappedEnd) {\n innerHoles.push({ start: cappedStart, end: cappedEnd });\n }\n }\n // Fire off workers to take care of patching the holes\n for (const outerHole of outerHoles) {\n const pendingSlice = bytes && {\n start: innerStart,\n bytes,\n holes: innerHoles,\n resolve,\n reject,\n };\n let workerFound = false;\n for (const worker of this.workers) {\n // A small tolerance in the case that the requested region is *just* after the target position of an\n // existing worker. In that case, it's probably more efficient to repurpose that worker than to spawn\n // another one so close to it\n const gapTolerance = 2 ** 17;\n // This check also implies worker.currentPos <= outerHole.start, a critical condition\n if (closedIntervalsOverlap(outerHole.start - gapTolerance, outerHole.start, worker.currentPos, worker.targetPos)) {\n worker.targetPos = Math.max(worker.targetPos, outerHole.end); // Update the worker's target position\n workerFound = true;\n if (pendingSlice && !worker.pendingSlices.includes(pendingSlice)) {\n worker.pendingSlices.push(pendingSlice);\n }\n if (!worker.running) {\n // Kick it off if it's idle\n this.runWorker(worker);\n }\n break;\n }\n }\n if (!workerFound) {\n // We need to spawn a new worker\n const newWorker = this.createWorker(outerHole.start, outerHole.end);\n if (pendingSlice) {\n newWorker.pendingSlices = [pendingSlice];\n }\n this.runWorker(newWorker);\n }\n }\n if (!result) {\n assert(bytes);\n result = promise.then(bytes => ({\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n }));\n }\n else {\n // The requested region was satisfied by the cache, but the entire prefetch region was not\n }\n return result;\n }\n createWorker(startPos, targetPos) {\n const worker = {\n startPos,\n currentPos: startPos,\n targetPos,\n running: false,\n // Due to async shenanigans, it can happen that workers are started after disposal. In this case, instead of\n // simply not creating the worker, we allow it to run but immediately label it as aborted, so it can then\n // shut itself down.\n aborted: this.disposed,\n pendingSlices: [],\n age: this.nextAge++,\n };\n this.workers.push(worker);\n // LRU eviction of the other workers\n while (this.workers.length > this.options.maxWorkerCount) {\n let oldestIndex = 0;\n let oldestWorker = this.workers[0];\n for (let i = 1; i < this.workers.length; i++) {\n const worker = this.workers[i];\n if (worker.age < oldestWorker.age) {\n oldestIndex = i;\n oldestWorker = worker;\n }\n }\n if (oldestWorker.running && oldestWorker.pendingSlices.length > 0) {\n break;\n }\n oldestWorker.aborted = true;\n this.workers.splice(oldestIndex, 1);\n }\n return worker;\n }\n runWorker(worker) {\n assert(!worker.running);\n assert(worker.currentPos < worker.targetPos);\n worker.running = true;\n worker.age = this.nextAge++;\n void this.options.runWorker(worker)\n .catch((error) => {\n worker.running = false;\n if (worker.pendingSlices.length > 0) {\n worker.pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n worker.pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n /** Called by a worker when it has read some data. */\n supplyWorkerData(worker, bytes) {\n assert(!worker.aborted);\n const start = worker.currentPos;\n const end = start + bytes.length;\n this.insertIntoCache({\n start,\n end,\n bytes,\n view: toDataView(bytes),\n age: this.nextAge++,\n });\n worker.currentPos += bytes.length;\n worker.targetPos = Math.max(worker.targetPos, worker.currentPos); // In case it overshoots\n // Now, let's see if we can use the read bytes to fill any pending slice\n for (let i = 0; i < worker.pendingSlices.length; i++) {\n const pendingSlice = worker.pendingSlices[i];\n const clampedStart = Math.max(start, pendingSlice.start);\n const clampedEnd = Math.min(end, pendingSlice.start + pendingSlice.bytes.length);\n if (clampedStart < clampedEnd) {\n pendingSlice.bytes.set(bytes.subarray(clampedStart - start, clampedEnd - start), clampedStart - pendingSlice.start);\n }\n for (let j = 0; j < pendingSlice.holes.length; j++) {\n // The hole is intentionally not modified here if the read section starts somewhere in the middle of\n // the hole. We don't need to do \"hole splitting\", since the workers are spawned *by* the holes,\n // meaning there's always a worker which will consume the hole left to right.\n const hole = pendingSlice.holes[j];\n if (start <= hole.start && end > hole.start) {\n hole.start = end;\n }\n if (hole.end <= hole.start) {\n pendingSlice.holes.splice(j, 1);\n j--;\n }\n }\n if (pendingSlice.holes.length === 0) {\n // The slice has been fulfilled, everything has been read. Let's resolve the promise\n pendingSlice.resolve(pendingSlice.bytes);\n worker.pendingSlices.splice(i, 1);\n i--;\n }\n }\n // Remove other idle workers if we \"ate\" into their territory\n for (let i = 0; i < this.workers.length; i++) {\n const otherWorker = this.workers[i];\n if (worker === otherWorker || otherWorker.running) {\n continue;\n }\n if (closedIntervalsOverlap(start, end, otherWorker.currentPos, otherWorker.targetPos)) {\n this.workers.splice(i, 1);\n i--;\n }\n }\n }\n forgetWorker(worker) {\n const index = this.workers.indexOf(worker);\n assert(index !== -1);\n this.workers.splice(index, 1);\n }\n insertIntoCache(entry) {\n if (this.options.maxCacheSize === 0) {\n return; // No caching\n }\n let insertionIndex = binarySearchLessOrEqual(this.cache, entry.start, x => x.start) + 1;\n if (insertionIndex > 0) {\n const previous = this.cache[insertionIndex - 1];\n if (previous.end >= entry.end) {\n // Previous entry swallows the one to be inserted; we don't need to do anything\n return;\n }\n if (previous.end > entry.start) {\n // Partial overlap with the previous entry, let's join\n const joined = new Uint8Array(entry.end - previous.start);\n joined.set(previous.bytes, 0);\n joined.set(entry.bytes, entry.start - previous.start);\n this.currentCacheSize += entry.end - previous.end;\n previous.bytes = joined;\n previous.view = toDataView(joined);\n previous.end = entry.end;\n // Do the rest of the logic with the previous entry instead\n insertionIndex--;\n entry = previous;\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n for (let i = insertionIndex + 1; i < this.cache.length; i++) {\n const next = this.cache[i];\n if (entry.end <= next.start) {\n // Even if they touch, we don't wanna merge them, no need\n break;\n }\n if (entry.end >= next.end) {\n // The inserted entry completely swallows the next entry\n this.cache.splice(i, 1);\n this.currentCacheSize -= next.bytes.length;\n i--;\n continue;\n }\n // Partial overlap, let's join\n const joined = new Uint8Array(next.end - entry.start);\n joined.set(entry.bytes, 0);\n joined.set(next.bytes, next.start - entry.start);\n this.currentCacheSize -= entry.end - next.start; // Subtract the overlap\n entry.bytes = joined;\n entry.view = toDataView(joined);\n entry.end = next.end;\n this.cache.splice(i, 1);\n break; // After the join case, we're done: the next entry cannot possibly overlap with the inserted one.\n }\n // LRU eviction of cache entries\n while (this.currentCacheSize > this.options.maxCacheSize) {\n let oldestIndex = 0;\n let oldestEntry = this.cache[0];\n for (let i = 1; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.age < oldestEntry.age) {\n oldestIndex = i;\n oldestEntry = entry;\n }\n }\n if (this.currentCacheSize - oldestEntry.bytes.length <= this.options.maxCacheSize) {\n // Don't evict if it would shrink the cache below the max size\n break;\n }\n this.cache.splice(oldestIndex, 1);\n this.currentCacheSize -= oldestEntry.bytes.length;\n }\n }\n dispose() {\n for (const worker of this.workers) {\n worker.aborted = true;\n }\n this.workers.length = 0;\n this.cache.length = 0;\n this.disposed = true;\n }\n}\n","\"use strict\";","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { InputFormat } from './input-format.js';\nimport { assert, polyfillSymbolDispose } from './misc.js';\nimport { Reader } from './reader.js';\nimport { Source } from './source.js';\npolyfillSymbolDispose();\n/**\n * Represents an input media file. This is the root object from which all media read operations start.\n * @group Input files & tracks\n * @public\n */\nexport class Input {\n /** True if the input has been disposed. */\n get disposed() {\n return this._disposed;\n }\n /**\n * Creates a new input file from the specified options. No reading operations will be performed until methods are\n * called on this instance.\n */\n constructor(options) {\n /** @internal */\n this._demuxerPromise = null;\n /** @internal */\n this._format = null;\n /** @internal */\n this._disposed = false;\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Array.isArray(options.formats) || options.formats.some(x => !(x instanceof InputFormat))) {\n throw new TypeError('options.formats must be an array of InputFormat.');\n }\n if (!(options.source instanceof Source)) {\n throw new TypeError('options.source must be a Source.');\n }\n if (options.source._disposed) {\n throw new Error('options.source must not be disposed.');\n }\n this._formats = options.formats;\n this._source = options.source;\n this._reader = new Reader(options.source);\n }\n /** @internal */\n _getDemuxer() {\n return this._demuxerPromise ??= (async () => {\n this._reader.fileSize = await this._source.getSizeOrNull();\n for (const format of this._formats) {\n const canRead = await format._canReadInput(this);\n if (canRead) {\n this._format = format;\n return format._createDemuxer(this);\n }\n }\n throw new Error('Input has an unsupported or unrecognizable format.');\n })();\n }\n /**\n * Returns the source from which this input file reads its data. This is the same source that was passed to the\n * constructor.\n */\n get source() {\n return this._source;\n }\n /**\n * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons\n * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true\n * for both MKV and WebM).\n */\n async getFormat() {\n await this._getDemuxer();\n assert(this._format);\n return this._format;\n }\n /**\n * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among\n * all tracks.\n */\n async computeDuration() {\n const demuxer = await this._getDemuxer();\n return demuxer.computeDuration();\n }\n /** Returns the list of all tracks of this input file. */\n async getTracks() {\n const demuxer = await this._getDemuxer();\n return demuxer.getTracks();\n }\n /** Returns the list of all video tracks of this input file. */\n async getVideoTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isVideoTrack());\n }\n /** Returns the list of all audio tracks of this input file. */\n async getAudioTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isAudioTrack());\n }\n /** Returns the primary video track of this input file, or null if there are no video tracks. */\n async getPrimaryVideoTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isVideoTrack()) ?? null;\n }\n /** Returns the primary audio track of this input file, or null if there are no audio tracks. */\n async getPrimaryAudioTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isAudioTrack()) ?? null;\n }\n /** Returns the full MIME type of this input file, including track codecs. */\n async getMimeType() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMimeType();\n }\n /**\n * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other\n * attached files.\n */\n async getMetadataTags() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMetadataTags();\n }\n /**\n * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be\n * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink\n * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}.\n *\n * You are expected not to use an input after disposing it. While some operations may still work, it is not\n * specified and may change in any future update.\n */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._source._disposed = true;\n this._source._dispose();\n }\n /**\n * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with\n * JavaScript Explicit Resource Management features.\n */\n [Symbol.dispose]() {\n this.dispose();\n }\n}\n/**\n * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed.\n * @group Input files & tracks\n * @public\n */\nexport class InputDisposedError extends Error {\n /** Creates a new {@link InputDisposedError}. */\n constructor(message = 'Input has been disposed.') {\n super(message);\n this.name = 'InputDisposedError';\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { IsobmffDemuxer } from './isobmff/isobmff-demuxer.js';\nimport { EBMLId, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readElementHeader, readElementSize, readUnsignedInt, readVarIntSize, } from './matroska/ebml.js';\nimport { MatroskaDemuxer } from './matroska/matroska-demuxer.js';\nimport { Mp3Demuxer } from './mp3/mp3-demuxer.js';\nimport { FRAME_HEADER_SIZE } from '../shared/mp3-misc.js';\nimport { ID3_V2_HEADER_SIZE, readId3V2Header } from './id3.js';\nimport { readNextFrameHeader } from './mp3/mp3-reader.js';\nimport { OggDemuxer } from './ogg/ogg-demuxer.js';\nimport { WaveDemuxer } from './wave/wave-demuxer.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts/adts-reader.js';\nimport { AdtsDemuxer } from './adts/adts-demuxer.js';\nimport { readAscii } from './reader.js';\nimport { FlacDemuxer } from './flac/flac-demuxer.js';\n/**\n * Base class representing an input media file format.\n * @group Input formats\n * @public\n */\nexport class InputFormat {\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @group Input formats\n * @public\n */\nexport class IsobmffInputFormat extends InputFormat {\n /** @internal */\n async _getMajorBrand(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return null;\n slice.skip(4);\n const fourCc = readAscii(slice, 4);\n if (fourCc !== 'ftyp') {\n return null;\n }\n return readAscii(slice, 4);\n }\n /** @internal */\n _createDemuxer(input) {\n return new IsobmffDemuxer(input);\n }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format.\n *\n * Do not instantiate this class; use the {@link MP4} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp4InputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return !!majorBrand && majorBrand !== 'qt ';\n }\n get name() {\n return 'MP4';\n }\n get mimeType() {\n return 'video/mp4';\n }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV.\n *\n * Do not instantiate this class; use the {@link QTFF} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class QuickTimeInputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return majorBrand === 'qt ';\n }\n get name() {\n return 'QuickTime File Format';\n }\n get mimeType() {\n return 'video/quicktime';\n }\n}\n/**\n * Matroska file format.\n *\n * Do not instantiate this class; use the {@link MATROSKA} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class MatroskaInputFormat extends InputFormat {\n /** @internal */\n async isSupportedEBMLOfDocType(input, desiredDocType) {\n let headerSlice = input._reader.requestSlice(0, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n return false;\n const varIntSize = readVarIntSize(headerSlice);\n if (varIntSize === null) {\n return false;\n }\n if (varIntSize < 1 || varIntSize > 8) {\n return false;\n }\n const id = readUnsignedInt(headerSlice, varIntSize);\n if (id !== EBMLId.EBML) {\n return false;\n }\n const dataSize = readElementSize(headerSlice);\n if (dataSize === null) {\n return false; // Miss me with that shit\n }\n let dataSlice = input._reader.requestSlice(headerSlice.filePos, dataSize);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n return false;\n const startPos = headerSlice.filePos;\n while (dataSlice.filePos <= startPos + dataSize - MIN_HEADER_SIZE) {\n const header = readElementHeader(dataSlice);\n if (!header)\n break;\n const { id, size } = header;\n const dataStartPos = dataSlice.filePos;\n if (size === null)\n return false;\n switch (id) {\n case EBMLId.EBMLVersion:\n {\n const ebmlVersion = readUnsignedInt(dataSlice, size);\n if (ebmlVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.EBMLReadVersion:\n {\n const ebmlReadVersion = readUnsignedInt(dataSlice, size);\n if (ebmlReadVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocType:\n {\n const docType = readAsciiString(dataSlice, size);\n if (docType !== desiredDocType) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocTypeVersion:\n {\n const docTypeVersion = readUnsignedInt(dataSlice, size);\n if (docTypeVersion > 4) { // Support up to Matroska v4\n return false;\n }\n }\n ;\n break;\n }\n dataSlice.filePos = dataStartPos + size;\n }\n return true;\n }\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'matroska');\n }\n /** @internal */\n _createDemuxer(input) {\n return new MatroskaDemuxer(input);\n }\n get name() {\n return 'Matroska';\n }\n get mimeType() {\n return 'video/x-matroska';\n }\n}\n/**\n * WebM file format, based on Matroska.\n *\n * Do not instantiate this class; use the {@link WEBM} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WebMInputFormat extends MatroskaInputFormat {\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'webm');\n }\n get name() {\n return 'WebM';\n }\n get mimeType() {\n return 'video/webm';\n }\n}\n/**\n * MP3 file format.\n *\n * Do not instantiate this class; use the {@link MP3} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp3InputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 10);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let slice = input._reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n currentPos = slice.filePos + id3V2Header.size;\n }\n const firstResult = await readNextFrameHeader(input._reader, currentPos, currentPos + 4096);\n if (!firstResult) {\n return false;\n }\n if (id3V2HeaderFound) {\n // If there was an ID3v2 tag at the start, we can be pretty sure this is MP3 by now\n return true;\n }\n currentPos = firstResult.startPos + firstResult.header.totalSize;\n // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find\n // another header right after it:\n const secondResult = await readNextFrameHeader(input._reader, currentPos, currentPos + FRAME_HEADER_SIZE);\n if (!secondResult) {\n return false;\n }\n const firstHeader = firstResult.header;\n const secondHeader = secondResult.header;\n // In a well-formed MP3 file, we'd expect these two frames to share some similarities:\n if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) {\n return false;\n }\n // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file\n return true;\n }\n /** @internal */\n _createDemuxer(input) {\n return new Mp3Demuxer(input);\n }\n get name() {\n return 'MP3';\n }\n get mimeType() {\n return 'audio/mpeg';\n }\n}\n/**\n * WAVE file format, based on RIFF.\n *\n * Do not instantiate this class; use the {@link WAVE} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WaveInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const riffType = readAscii(slice, 4);\n if (riffType !== 'RIFF' && riffType !== 'RIFX' && riffType !== 'RF64') {\n return false;\n }\n slice.skip(4);\n const format = readAscii(slice, 4);\n return format === 'WAVE';\n }\n /** @internal */\n _createDemuxer(input) {\n return new WaveDemuxer(input);\n }\n get name() {\n return 'WAVE';\n }\n get mimeType() {\n return 'audio/wav';\n }\n}\n/**\n * Ogg file format.\n *\n * Do not instantiate this class; use the {@link OGG} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class OggInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'OggS';\n }\n /** @internal */\n _createDemuxer(input) {\n return new OggDemuxer(input);\n }\n get name() {\n return 'Ogg';\n }\n get mimeType() {\n return 'application/ogg';\n }\n}\n/**\n * FLAC file format.\n *\n * Do not instantiate this class; use the {@link FLAC} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class FlacInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'fLaC';\n }\n get name() {\n return 'FLAC';\n }\n get mimeType() {\n return 'audio/flac';\n }\n /** @internal */\n _createDemuxer(input) {\n return new FlacDemuxer(input);\n }\n}\n/**\n * ADTS file format.\n *\n * Do not instantiate this class; use the {@link ADTS} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class AdtsInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSliceRange(0, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const firstHeader = readFrameHeader(slice);\n if (!firstHeader) {\n return false;\n }\n slice = input._reader.requestSliceRange(firstHeader.frameLength, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const secondHeader = readFrameHeader(slice);\n if (!secondHeader) {\n return false;\n }\n return firstHeader.objectType === secondHeader.objectType\n && firstHeader.samplingFrequencyIndex === secondHeader.samplingFrequencyIndex\n && firstHeader.channelConfiguration === secondHeader.channelConfiguration;\n }\n /** @internal */\n _createDemuxer(input) {\n return new AdtsDemuxer(input);\n }\n get name() {\n return 'ADTS';\n }\n get mimeType() {\n return 'audio/aac';\n }\n}\n/**\n * MP4 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP4 = /* #__PURE__ */ new Mp4InputFormat();\n/**\n * QuickTime File Format input format singleton.\n * @group Input formats\n * @public\n */\nexport const QTFF = /* #__PURE__ */ new QuickTimeInputFormat();\n/**\n * Matroska input format singleton.\n * @group Input formats\n * @public\n */\nexport const MATROSKA = /* #__PURE__ */ new MatroskaInputFormat();\n/**\n * WebM input format singleton.\n * @group Input formats\n * @public\n */\nexport const WEBM = /* #__PURE__ */ new WebMInputFormat();\n/**\n * MP3 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP3 = /* #__PURE__ */ new Mp3InputFormat();\n/**\n * WAVE input format singleton.\n * @group Input formats\n * @public\n */\nexport const WAVE = /* #__PURE__ */ new WaveInputFormat();\n/**\n * Ogg input format singleton.\n * @group Input formats\n * @public\n */\nexport const OGG = /* #__PURE__ */ new OggInputFormat();\n/**\n * ADTS input format singleton.\n * @group Input formats\n * @public\n */\nexport const ADTS = /* #__PURE__ */ new AdtsInputFormat();\n/**\n * FLAC input format singleton.\n * @group Input formats\n * @public\n */\nexport const FLAC = /* #__PURE__ */ new FlacInputFormat();\n/**\n * List of all input format singletons. If you don't need to support all input formats, you should specify the\n * formats individually for better tree shaking.\n * @group Input formats\n * @public\n */\nexport const ALL_FORMATS = [MP4, QTFF, MATROSKA, WEBM, WAVE, OGG, FLAC, MP3, ADTS];\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, parseAacAudioSpecificConfig, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { extractAv1CodecInfoFromPacket, extractVp9CodecInfoFromPacket, FlacBlockType, } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, binarySearchExact, binarySearchLessOrEqual, Bitstream, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundToMultiple, textDecoder, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, toDataView, roundIfAlmostInteger, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE, readBoxHeader, readDataBox, readFixed_16_16, readFixed_2_30, readIsomVariableInteger, readMetadataStringShort, } from './isobmff-reader.js';\nimport { readBytes, readF64Be, readI16Be, readI32Be, readI64Be, readU16Be, readU24Be, readU32Be, readU64Be, readU8, readAscii, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION, RichImageData } from '../metadata.js';\nexport class IsobmffDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.moovSlice = null;\n this.currentTrack = null;\n this.tracks = [];\n this.metadataPromise = null;\n this.movieTimescale = -1;\n this.movieDurationInTimescale = -1;\n this.isQuickTime = false;\n this.metadataTags = {};\n this.currentMetadataKeys = null;\n this.isFragmented = false;\n this.fragmentTrackDefaults = [];\n this.currentFragment = null;\n /**\n * Caches the last fragment that was read. Based on the assumption that there will be multiple reads to the\n * same fragment in quick succession.\n */\n this.lastReadFragment = null;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks.map(track => track.inputTrack);\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.inputTrack.getCodecParameterString()));\n return buildIsobmffMimeType({\n isQuickTime: this.isQuickTime,\n hasVideo: this.tracks.some(x => x.info?.type === 'video'),\n hasAudio: this.tracks.some(x => x.info?.type === 'audio'),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const startPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'ftyp') {\n const majorBrand = readAscii(slice, 4);\n this.isQuickTime = majorBrand === 'qt ';\n }\n else if (boxInfo.name === 'moov') {\n // Found moov, load it\n let moovSlice = this.reader.requestSlice(slice.filePos, boxInfo.contentSize);\n if (moovSlice instanceof Promise)\n moovSlice = await moovSlice;\n if (!moovSlice)\n break;\n this.moovSlice = moovSlice;\n this.readContiguousBoxes(this.moovSlice);\n // Put default tracks first\n this.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n for (const track of this.tracks) {\n // Modify the edit list offset based on the previous segment durations. They are in different\n // timescales, so we first convert to seconds and then into the track timescale.\n const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;\n track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);\n }\n break;\n }\n currentPos = startPos + boxInfo.totalSize;\n }\n if (this.isFragmented && this.reader.fileSize !== null) {\n // The last 4 bytes may contain the size of the mfra box at the end of the file\n let lastWordSlice = this.reader.requestSlice(this.reader.fileSize - 4, 4);\n if (lastWordSlice instanceof Promise)\n lastWordSlice = await lastWordSlice;\n assert(lastWordSlice);\n const lastWord = readU32Be(lastWordSlice);\n const potentialMfraPos = this.reader.fileSize - lastWord;\n if (potentialMfraPos >= 0 && potentialMfraPos <= this.reader.fileSize - MAX_BOX_HEADER_SIZE) {\n let mfraHeaderSlice = this.reader.requestSliceRange(potentialMfraPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (mfraHeaderSlice instanceof Promise)\n mfraHeaderSlice = await mfraHeaderSlice;\n if (mfraHeaderSlice) {\n const boxInfo = readBoxHeader(mfraHeaderSlice);\n if (boxInfo && boxInfo.name === 'mfra') {\n // We found the mfra box, allowing for much better random access. Let's parse it.\n let mfraSlice = this.reader.requestSlice(mfraHeaderSlice.filePos, boxInfo.contentSize);\n if (mfraSlice instanceof Promise)\n mfraSlice = await mfraSlice;\n if (mfraSlice) {\n this.readContiguousBoxes(mfraSlice);\n }\n }\n }\n }\n }\n })();\n }\n getSampleTableForTrack(internalTrack) {\n if (internalTrack.sampleTable) {\n return internalTrack.sampleTable;\n }\n const sampleTable = {\n sampleTimingEntries: [],\n sampleCompositionTimeOffsets: [],\n sampleSizes: [],\n keySampleIndices: null,\n chunkOffsets: [],\n sampleToChunk: [],\n presentationTimestamps: null,\n presentationTimestampIndexMap: null,\n };\n internalTrack.sampleTable = sampleTable;\n assert(this.moovSlice);\n const stblContainerSlice = this.moovSlice.slice(internalTrack.sampleTableByteOffset);\n this.currentTrack = internalTrack;\n this.traverseBox(stblContainerSlice);\n this.currentTrack = null;\n const isPcmCodec = internalTrack.info?.type === 'audio'\n && internalTrack.info.codec\n && PCM_AUDIO_CODECS.includes(internalTrack.info.codec);\n if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) {\n // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat\n // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second.\n // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge\n // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM,\n // we say that each chunk (that normally holds many samples) now is one big sample. We can this because\n // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still\n // encodes valid audio information.\n assert(internalTrack.info?.type === 'audio');\n const pcmInfo = parsePcmCodec(internalTrack.info.codec);\n const newSampleTimingEntries = [];\n const newSampleSizes = [];\n for (let i = 0; i < sampleTable.sampleToChunk.length; i++) {\n const chunkEntry = sampleTable.sampleToChunk[i];\n const nextEntry = sampleTable.sampleToChunk[i + 1];\n const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length)\n - chunkEntry.startChunkIndex;\n for (let j = 0; j < chunkCount; j++) {\n const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk;\n const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk\n const startTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, startSampleIndex, x => x.startIndex);\n const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex];\n const endTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, endSampleIndex, x => x.startIndex);\n const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex];\n const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp\n + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta;\n const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp\n + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta;\n const delta = lastSampleTimestamp - firstSampleTimestamp;\n const lastSampleTimingEntry = last(newSampleTimingEntries);\n if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) {\n lastSampleTimingEntry.count++;\n }\n else {\n // One sample for the entire chunk\n newSampleTimingEntries.push({\n startIndex: chunkEntry.startChunkIndex + j,\n startDecodeTimestamp: firstSampleTimestamp,\n count: 1,\n delta,\n });\n }\n // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we\n // can directly compute it as we know how many PCM frames are in this chunk, and the size of each\n // PCM frame. This also improves compatibility with some files which fail to write proper sample\n // size values into their sample tables in the PCM case.\n const chunkSize = chunkEntry.samplesPerChunk\n * pcmInfo.sampleSize\n * internalTrack.info.numberOfChannels;\n newSampleSizes.push(chunkSize);\n }\n chunkEntry.startSampleIndex = chunkEntry.startChunkIndex;\n chunkEntry.samplesPerChunk = 1;\n }\n sampleTable.sampleTimingEntries = newSampleTimingEntries;\n sampleTable.sampleSizes = newSampleSizes;\n }\n if (sampleTable.sampleCompositionTimeOffsets.length > 0) {\n // If composition time offsets are defined, we must build a list of all presentation timestamps and then\n // sort them\n sampleTable.presentationTimestamps = [];\n for (const entry of sampleTable.sampleTimingEntries) {\n for (let i = 0; i < entry.count; i++) {\n sampleTable.presentationTimestamps.push({\n presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta,\n sampleIndex: entry.startIndex + i,\n });\n }\n }\n for (const entry of sampleTable.sampleCompositionTimeOffsets) {\n for (let i = 0; i < entry.count; i++) {\n const sampleIndex = entry.startIndex + i;\n const sample = sampleTable.presentationTimestamps[sampleIndex];\n if (!sample) {\n continue;\n }\n sample.presentationTimestamp += entry.offset;\n }\n }\n sampleTable.presentationTimestamps.sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1);\n for (let i = 0; i < sampleTable.presentationTimestamps.length; i++) {\n sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i;\n }\n }\n else {\n // If they're not defined, we can simply use the decode timestamps as presentation timestamps\n }\n return sampleTable;\n }\n async readFragment(startPos) {\n if (this.lastReadFragment?.moofOffset === startPos) {\n return this.lastReadFragment;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const moofBoxInfo = readBoxHeader(headerSlice);\n assert(moofBoxInfo?.name === 'moof');\n let entireSlice = this.reader.requestSlice(startPos, moofBoxInfo.totalSize);\n if (entireSlice instanceof Promise)\n entireSlice = await entireSlice;\n assert(entireSlice);\n this.traverseBox(entireSlice);\n const fragment = this.lastReadFragment;\n assert(fragment && fragment.moofOffset === startPos);\n for (const [, trackData] of fragment.trackData) {\n const track = trackData.track;\n const { fragmentPositionCache } = track;\n if (!trackData.startTimestampIsFinal) {\n // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This\n // we'll need to figure out the start timestamp another way. We'll compute the timestamp by accessing\n // the lookup entries and fragment cache, which works out nicely with the lookup algorithm: If these\n // exist, then the lookup will automatically start at the furthest possible point. If they don't, the\n // lookup starts sequentially from the start, incrementally summing up all fragment durations. It's sort\n // of implicit, but it ends up working nicely.\n const lookupEntry = track.fragmentLookupTable.find(x => x.moofOffset === fragment.moofOffset);\n if (lookupEntry) {\n // There's a lookup entry, let's use its timestamp\n offsetFragmentTrackDataByTimestamp(trackData, lookupEntry.timestamp);\n }\n else {\n const lastCacheIndex = binarySearchLessOrEqual(fragmentPositionCache, fragment.moofOffset - 1, x => x.moofOffset);\n if (lastCacheIndex !== -1) {\n // Let's use the timestamp of the previous fragment in the cache\n const lastCache = fragmentPositionCache[lastCacheIndex];\n offsetFragmentTrackDataByTimestamp(trackData, lastCache.endTimestamp);\n }\n else {\n // We're the first fragment I guess, \"offset by 0\"\n }\n }\n trackData.startTimestampIsFinal = true;\n }\n // Let's remember that a fragment with a given timestamp is here, speeding up future lookups if no\n // lookup table exists\n const insertionIndex = binarySearchLessOrEqual(fragmentPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || fragmentPositionCache[insertionIndex].moofOffset !== fragment.moofOffset) {\n fragmentPositionCache.splice(insertionIndex + 1, 0, {\n moofOffset: fragment.moofOffset,\n startTimestamp: trackData.startTimestamp,\n endTimestamp: trackData.endTimestamp,\n });\n }\n }\n return fragment;\n }\n readContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const foundBox = this.traverseBox(slice);\n if (!foundBox) {\n break;\n }\n }\n }\n // eslint-disable-next-line @stylistic/generator-star-spacing\n *iterateContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n yield { boxInfo, slice };\n slice.filePos = startPos + boxInfo.totalSize;\n }\n }\n traverseBox(slice) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n return false;\n }\n const contentStartPos = slice.filePos;\n const boxEndPos = startPos + boxInfo.totalSize;\n switch (boxInfo.name) {\n case 'mdia':\n case 'minf':\n case 'dinf':\n case 'mfra':\n case 'edts':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mvhd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 1) {\n slice.skip(8 + 8);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU64Be(slice);\n }\n else {\n slice.skip(4 + 4);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU32Be(slice);\n }\n }\n ;\n break;\n case 'trak':\n {\n const track = {\n id: -1,\n demuxer: this,\n inputTrack: null,\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n info: null,\n timescale: -1,\n durationInMovieTimescale: -1,\n durationInMediaTimescale: -1,\n rotation: 0,\n internalCodecId: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n sampleTableByteOffset: -1,\n sampleTable: null,\n fragmentLookupTable: [],\n currentFragmentState: null,\n fragmentPositionCache: [],\n editListPreviousSegmentDurations: 0,\n editListOffset: 0,\n };\n this.currentTrack = track;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n if (track.id !== -1 && track.timescale !== -1 && track.info !== null) {\n if (track.info.type === 'video' && track.info.width !== -1) {\n const videoTrack = track;\n track.inputTrack = new InputVideoTrack(this.input, new IsobmffVideoTrackBacking(videoTrack));\n this.tracks.push(track);\n }\n else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) {\n const audioTrack = track;\n track.inputTrack = new InputAudioTrack(this.input, new IsobmffAudioTrackBacking(audioTrack));\n this.tracks.push(track);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case 'tkhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n // Spec says disabled tracks are to be treated like they don't exist, but in practice, they are treated\n // more like non-default tracks.\n const trackEnabled = !!(flags & 0x1);\n track.disposition.default = trackEnabled;\n // Skip over creation & modification time to reach the track ID\n if (version === 0) {\n slice.skip(8);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU64Be(slice);\n }\n else {\n throw new Error(`Incorrect track header version ${version}.`);\n }\n slice.skip(2 * 4 + 2 + 2 + 2 + 2);\n const matrix = [\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n ];\n const rotation = normalizeRotation(roundToMultiple(extractRotationFromMatrix(matrix), 90));\n assert(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270);\n track.rotation = rotation;\n }\n ;\n break;\n case 'elst':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n let relevantEntryFound = false;\n let previousSegmentDurations = 0;\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const segmentDuration = version === 1\n ? readU64Be(slice)\n : readU32Be(slice);\n const mediaTime = version === 1\n ? readI64Be(slice)\n : readI32Be(slice);\n const mediaRate = readFixed_16_16(slice);\n if (segmentDuration === 0) {\n // Don't care\n continue;\n }\n if (relevantEntryFound) {\n console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.');\n break;\n }\n if (mediaTime === -1) {\n previousSegmentDurations += segmentDuration;\n continue;\n }\n if (mediaRate !== 1) {\n console.warn('Unsupported edit list entry: media rate must be 1.');\n break;\n }\n track.editListPreviousSegmentDurations = previousSegmentDurations;\n track.editListOffset = mediaTime;\n relevantEntryFound = true;\n }\n }\n ;\n break;\n case 'mdhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 0) {\n slice.skip(8);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU64Be(slice);\n }\n let language = readU16Be(slice);\n if (language > 0) {\n track.languageCode = '';\n for (let i = 0; i < 3; i++) {\n track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;\n language >>= 5;\n }\n if (!isIso639Dash2LanguageCode(track.languageCode)) {\n // Sometimes the bytes are garbage\n track.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n }\n ;\n break;\n case 'hdlr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n slice.skip(8); // Version + flags + pre-defined\n const handlerType = readAscii(slice, 4);\n if (handlerType === 'vide') {\n track.info = {\n type: 'video',\n width: -1,\n height: -1,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n avcType: null,\n avcCodecInfo: null,\n hevcCodecInfo: null,\n vp9CodecInfo: null,\n av1CodecInfo: null,\n };\n }\n else if (handlerType === 'soun') {\n track.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case 'stbl':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n track.sampleTableByteOffset = startPos;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'stsd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (track.info === null || track.sampleTable) {\n break;\n }\n const stsdVersion = readU8(slice);\n slice.skip(3); // Flags\n const entries = readU32Be(slice);\n for (let i = 0; i < entries; i++) {\n const sampleBoxStartPos = slice.filePos;\n const sampleBoxInfo = readBoxHeader(slice);\n if (!sampleBoxInfo) {\n break;\n }\n track.internalCodecId = sampleBoxInfo.name;\n const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();\n if (track.info.type === 'video') {\n if (lowercaseBoxName === 'avc1' || lowercaseBoxName === 'avc3') {\n track.info.codec = 'avc';\n track.info.avcType = lowercaseBoxName === 'avc1' ? 1 : 3;\n }\n else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') {\n track.info.codec = 'hevc';\n }\n else if (lowercaseBoxName === 'vp08') {\n track.info.codec = 'vp8';\n }\n else if (lowercaseBoxName === 'vp09') {\n track.info.codec = 'vp9';\n }\n else if (lowercaseBoxName === 'av01') {\n track.info.codec = 'av1';\n }\n else {\n console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2 + 2 + 2 + 3 * 4);\n track.info.width = readU16Be(slice);\n track.info.height = readU16Be(slice);\n slice.skip(4 + 4 + 4 + 2 + 32 + 2 + 2);\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n else {\n if (lowercaseBoxName === 'mp4a') {\n // We don't know the codec yet (might be AAC, might be MP3), need to read the esds box\n }\n else if (lowercaseBoxName === 'opus') {\n track.info.codec = 'opus';\n }\n else if (lowercaseBoxName === 'flac') {\n track.info.codec = 'flac';\n }\n else if (lowercaseBoxName === 'twos'\n || lowercaseBoxName === 'sowt'\n || lowercaseBoxName === 'raw '\n || lowercaseBoxName === 'in24'\n || lowercaseBoxName === 'in32'\n || lowercaseBoxName === 'fl32'\n || lowercaseBoxName === 'fl64'\n || lowercaseBoxName === 'lpcm'\n || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5\n || lowercaseBoxName === 'fpcm' // \"\n ) {\n // It's PCM\n // developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions/\n }\n else if (lowercaseBoxName === 'ulaw') {\n track.info.codec = 'ulaw';\n }\n else if (lowercaseBoxName === 'alaw') {\n track.info.codec = 'alaw';\n }\n else {\n console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2);\n const version = readU16Be(slice);\n slice.skip(3 * 2);\n let channelCount = readU16Be(slice);\n let sampleSize = readU16Be(slice);\n slice.skip(2 * 2);\n // Can't use fixed16_16 as that's signed\n let sampleRate = readU32Be(slice) / 0x10000;\n if (stsdVersion === 0 && version > 0) {\n // Additional QuickTime fields\n if (version === 1) {\n slice.skip(4);\n sampleSize = 8 * readU32Be(slice);\n slice.skip(2 * 4);\n }\n else if (version === 2) {\n slice.skip(4);\n sampleRate = readF64Be(slice);\n channelCount = readU32Be(slice);\n slice.skip(4); // Always 0x7f000000\n sampleSize = readU32Be(slice);\n const flags = readU32Be(slice);\n slice.skip(2 * 4);\n if (lowercaseBoxName === 'lpcm') {\n const bytesPerSample = (sampleSize + 7) >> 3;\n const isFloat = Boolean(flags & 1);\n const isBigEndian = Boolean(flags & 2);\n const sFlags = flags & 4 ? -1 : 0; // I guess it means \"signed flags\" or something?\n if (sampleSize > 0 && sampleSize <= 64) {\n if (isFloat) {\n if (sampleSize === 32) {\n track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32';\n }\n }\n else {\n if (sFlags & (1 << (bytesPerSample - 1))) {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-s8';\n }\n else if (bytesPerSample === 2) {\n track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16';\n }\n else if (bytesPerSample === 3) {\n track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24';\n }\n else if (bytesPerSample === 4) {\n track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32';\n }\n }\n else {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-u8';\n }\n }\n }\n }\n if (track.info.codec === null) {\n console.warn('Unsupported PCM format.');\n }\n }\n }\n }\n if (track.info.codec === 'opus') {\n sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n track.info.numberOfChannels = channelCount;\n track.info.sampleRate = sampleRate;\n // PCM codec assignments\n if (lowercaseBoxName === 'twos') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'sowt') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'raw ') {\n track.info.codec = 'pcm-u8';\n }\n else if (lowercaseBoxName === 'in24') {\n track.info.codec = 'pcm-s24be';\n }\n else if (lowercaseBoxName === 'in32') {\n track.info.codec = 'pcm-s32be';\n }\n else if (lowercaseBoxName === 'fl32') {\n track.info.codec = 'pcm-f32be';\n }\n else if (lowercaseBoxName === 'fl64') {\n track.info.codec = 'pcm-f64be';\n }\n else if (lowercaseBoxName === 'ipcm') {\n track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box\n }\n else if (lowercaseBoxName === 'fpcm') {\n track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box\n }\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n }\n }\n ;\n break;\n case 'avcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'hvcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'vpcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(4); // Version + flags\n const profile = readU8(slice);\n const level = readU8(slice);\n const thirdByte = readU8(slice);\n const bitDepth = thirdByte >> 4;\n const chromaSubsampling = (thirdByte >> 1) & 0b111;\n const videoFullRangeFlag = thirdByte & 1;\n const colourPrimaries = readU8(slice);\n const transferCharacteristics = readU8(slice);\n const matrixCoefficients = readU8(slice);\n track.info.vp9CodecInfo = {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n }\n ;\n break;\n case 'av1C':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(1); // Marker + version\n const secondByte = readU8(slice);\n const profile = secondByte >> 5;\n const level = secondByte & 0b11111;\n const thirdByte = readU8(slice);\n const tier = thirdByte >> 7;\n const highBitDepth = (thirdByte >> 6) & 1;\n const twelveBit = (thirdByte >> 5) & 1;\n const monochrome = (thirdByte >> 4) & 1;\n const chromaSubsamplingX = (thirdByte >> 3) & 1;\n const chromaSubsamplingY = (thirdByte >> 2) & 1;\n const chromaSamplePosition = thirdByte & 0b11;\n // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitDepth = profile === 2 && highBitDepth ? (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n track.info.av1CodecInfo = {\n profile,\n level,\n tier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n ;\n break;\n case 'colr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n const colourType = readAscii(slice, 4);\n if (colourType !== 'nclx') {\n break;\n }\n const colourPrimaries = readU16Be(slice);\n const transferCharacteristics = readU16Be(slice);\n const matrixCoefficients = readU16Be(slice);\n const fullRangeFlag = Boolean(readU8(slice) & 0x80);\n track.info.colorSpace = {\n primaries: COLOR_PRIMARIES_MAP_INVERSE[colourPrimaries],\n transfer: TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics],\n matrix: MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients],\n fullRange: fullRangeFlag,\n };\n }\n ;\n break;\n case 'wave':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'esds':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n const tag = readU8(slice);\n assert(tag === 0x03); // ES Descriptor\n readIsomVariableInteger(slice); // Length\n slice.skip(2); // ES ID\n const mixed = readU8(slice);\n const streamDependenceFlag = (mixed & 0x80) !== 0;\n const urlFlag = (mixed & 0x40) !== 0;\n const ocrStreamFlag = (mixed & 0x20) !== 0;\n if (streamDependenceFlag) {\n slice.skip(2);\n }\n if (urlFlag) {\n const urlLength = readU8(slice);\n slice.skip(urlLength);\n }\n if (ocrStreamFlag) {\n slice.skip(2);\n }\n const decoderConfigTag = readU8(slice);\n assert(decoderConfigTag === 0x04); // DecoderConfigDescriptor\n const decoderConfigDescriptorLength = readIsomVariableInteger(slice); // Length\n const payloadStart = slice.filePos;\n const objectTypeIndication = readU8(slice);\n if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) {\n track.info.codec = 'aac';\n track.info.aacCodecInfo = { isMpeg2: objectTypeIndication === 0x67 };\n }\n else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) {\n track.info.codec = 'mp3';\n }\n else if (objectTypeIndication === 0xdd) {\n track.info.codec = 'vorbis'; // \"nonstandard, gpac uses it\" - FFmpeg\n }\n else {\n console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`);\n }\n slice.skip(1 + 3 + 4 + 4);\n if (decoderConfigDescriptorLength > slice.filePos - payloadStart) {\n // There's a DecoderSpecificInfo at the end, let's read it\n const decoderSpecificInfoTag = readU8(slice);\n assert(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo\n const decoderSpecificInfoLength = readIsomVariableInteger(slice);\n track.info.codecDescription = readBytes(slice, decoderSpecificInfoLength);\n if (track.info.codec === 'aac') {\n // Let's try to deduce more accurate values directly from the AudioSpecificConfig:\n const audioSpecificConfig = parseAacAudioSpecificConfig(track.info.codecDescription);\n if (audioSpecificConfig.numberOfChannels !== null) {\n track.info.numberOfChannels = audioSpecificConfig.numberOfChannels;\n }\n if (audioSpecificConfig.sampleRate !== null) {\n track.info.sampleRate = audioSpecificConfig.sampleRate;\n }\n }\n }\n }\n ;\n break;\n case 'enda':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n const littleEndian = readU16Be(slice) & 0xff; // 0xff is from FFmpeg\n if (littleEndian) {\n if (track.info.codec === 'pcm-s16be') {\n track.info.codec = 'pcm-s16';\n }\n else if (track.info.codec === 'pcm-s24be') {\n track.info.codec = 'pcm-s24';\n }\n else if (track.info.codec === 'pcm-s32be') {\n track.info.codec = 'pcm-s32';\n }\n else if (track.info.codec === 'pcm-f32be') {\n track.info.codec = 'pcm-f32';\n }\n else if (track.info.codec === 'pcm-f64be') {\n track.info.codec = 'pcm-f64';\n }\n }\n }\n ;\n break;\n case 'pcmC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1 + 3); // Version + flags\n // ISO/IEC 23003-5\n const formatFlags = readU8(slice);\n const isLittleEndian = Boolean(formatFlags & 0x01);\n const pcmSampleSize = readU8(slice);\n if (track.info.codec === 'pcm-s16be') {\n // ipcm\n if (isLittleEndian) {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24be';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32be';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n else if (track.info.codec === 'pcm-f32be') {\n // fpcm\n if (isLittleEndian) {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32be';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64be';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n break;\n }\n ;\n case 'dOps':\n { // Used for Opus audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1); // Version\n // https://www.opus-codec.org/docs/opus_in_isobmff.html\n const outputChannelCount = readU8(slice);\n const preSkip = readU16Be(slice);\n const inputSampleRate = readU32Be(slice);\n const outputGain = readI16Be(slice);\n const channelMappingFamily = readU8(slice);\n let channelMappingTable;\n if (channelMappingFamily !== 0) {\n channelMappingTable = readBytes(slice, 2 + outputChannelCount);\n }\n else {\n channelMappingTable = new Uint8Array(0);\n }\n // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06\n const description = new Uint8Array(8 + 1 + 1 + 2 + 4 + 2 + 1 + channelMappingTable.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x4f707573, false); // 'Opus'\n view.setUint32(4, 0x48656164, false); // 'Head'\n view.setUint8(8, 1); // Version\n view.setUint8(9, outputChannelCount);\n view.setUint16(10, preSkip, true);\n view.setUint32(12, inputSampleRate, true);\n view.setInt16(16, outputGain, true);\n view.setUint8(18, channelMappingFamily);\n description.set(channelMappingTable, 19);\n track.info.codecDescription = description;\n track.info.numberOfChannels = outputChannelCount;\n // Don't copy the input sample rate, irrelevant, and output sample rate is fixed\n }\n ;\n break;\n case 'dfLa':\n { // Used for FLAC audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n // https://datatracker.ietf.org/doc/rfc9639/\n const BLOCK_TYPE_MASK = 0x7f;\n const LAST_METADATA_BLOCK_FLAG_MASK = 0x80;\n const startPos = slice.filePos;\n while (slice.filePos < boxEndPos) {\n const flagAndType = readU8(slice);\n const metadataBlockLength = readU24Be(slice);\n const type = flagAndType & BLOCK_TYPE_MASK;\n // It's a STREAMINFO block; let's extract the actual sample rate and channel count\n if (type === FlacBlockType.STREAMINFO) {\n slice.skip(10);\n // Extract sample rate and channel count\n const word = readU32Be(slice);\n const sampleRate = word >>> 12;\n const numberOfChannels = ((word >> 9) & 0b111) + 1;\n track.info.sampleRate = sampleRate;\n track.info.numberOfChannels = numberOfChannels;\n slice.skip(20);\n }\n else {\n // Simply skip ahead to the next block\n slice.skip(metadataBlockLength);\n }\n if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) {\n break;\n }\n }\n const endPos = slice.filePos;\n slice.filePos = startPos;\n const bytes = readBytes(slice, endPos - startPos);\n const description = new Uint8Array(4 + bytes.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x664c6143, false); // 'fLaC'\n description.set(bytes, 4);\n // Set the codec description to be 'fLaC' + all metadata blocks\n track.info.codecDescription = description;\n }\n ;\n break;\n case 'stts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n let currentIndex = 0;\n let currentTimestamp = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleDelta = readU32Be(slice);\n track.sampleTable.sampleTimingEntries.push({\n startIndex: currentIndex,\n startDecodeTimestamp: currentTimestamp,\n count: sampleCount,\n delta: sampleDelta,\n });\n currentIndex += sampleCount;\n currentTimestamp += sampleCount * sampleDelta;\n }\n }\n ;\n break;\n case 'ctts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(1 + 3); // Version + flags\n const entryCount = readU32Be(slice);\n let sampleIndex = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleOffset = readI32Be(slice);\n track.sampleTable.sampleCompositionTimeOffsets.push({\n startIndex: sampleIndex,\n count: sampleCount,\n offset: sampleOffset,\n });\n sampleIndex += sampleCount;\n }\n }\n ;\n break;\n case 'stsz':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const sampleSize = readU32Be(slice);\n const sampleCount = readU32Be(slice);\n if (sampleSize === 0) {\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = readU32Be(slice);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n else {\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stz2':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n slice.skip(3); // Reserved\n const fieldSize = readU8(slice); // in bits\n const sampleCount = readU32Be(slice);\n const bytes = readBytes(slice, Math.ceil(sampleCount * fieldSize / 8));\n const bitstream = new Bitstream(bytes);\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = bitstream.readBits(fieldSize);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stss':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n track.sampleTable.keySampleIndices = [];\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const sampleIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n track.sampleTable.keySampleIndices.push(sampleIndex);\n }\n if (track.sampleTable.keySampleIndices[0] !== 0) {\n // Some files don't mark the first sample a key sample, which is basically almost always incorrect.\n // Here, we correct for that mistake:\n track.sampleTable.keySampleIndices.unshift(0);\n }\n }\n ;\n break;\n case 'stsc':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4);\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const startChunkIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n const samplesPerChunk = readU32Be(slice);\n const sampleDescriptionIndex = readU32Be(slice);\n track.sampleTable.sampleToChunk.push({\n startSampleIndex: -1,\n startChunkIndex,\n samplesPerChunk,\n sampleDescriptionIndex,\n });\n }\n let startSampleIndex = 0;\n for (let i = 0; i < track.sampleTable.sampleToChunk.length; i++) {\n track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex;\n if (i < track.sampleTable.sampleToChunk.length - 1) {\n const nextChunk = track.sampleTable.sampleToChunk[i + 1];\n const chunkCount = nextChunk.startChunkIndex\n - track.sampleTable.sampleToChunk[i].startChunkIndex;\n startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk;\n }\n }\n }\n ;\n break;\n case 'stco':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU32Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'co64':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU64Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'mvex':\n {\n this.isFragmented = true;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mehd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const fragmentDuration = version === 1 ? readU64Be(slice) : readU32Be(slice);\n this.movieDurationInTimescale = fragmentDuration;\n }\n ;\n break;\n case 'trex':\n {\n slice.skip(4); // Version + flags\n const trackId = readU32Be(slice);\n const defaultSampleDescriptionIndex = readU32Be(slice);\n const defaultSampleDuration = readU32Be(slice);\n const defaultSampleSize = readU32Be(slice);\n const defaultSampleFlags = readU32Be(slice);\n // We store these separately rather than in the tracks since the tracks may not exist yet\n this.fragmentTrackDefaults.push({\n trackId,\n defaultSampleDescriptionIndex,\n defaultSampleDuration,\n defaultSampleSize,\n defaultSampleFlags,\n });\n }\n ;\n break;\n case 'tfra':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n break;\n }\n const word = readU32Be(slice);\n const lengthSizeOfTrafNum = (word & 0b110000) >> 4;\n const lengthSizeOfTrunNum = (word & 0b001100) >> 2;\n const lengthSizeOfSampleNum = word & 0b000011;\n const functions = [readU8, readU16Be, readU24Be, readU32Be];\n const readTrafNum = functions[lengthSizeOfTrafNum];\n const readTrunNum = functions[lengthSizeOfTrunNum];\n const readSampleNum = functions[lengthSizeOfSampleNum];\n const numberOfEntries = readU32Be(slice);\n for (let i = 0; i < numberOfEntries; i++) {\n const time = version === 1 ? readU64Be(slice) : readU32Be(slice);\n const moofOffset = version === 1 ? readU64Be(slice) : readU32Be(slice);\n readTrafNum(slice);\n readTrunNum(slice);\n readSampleNum(slice);\n track.fragmentLookupTable.push({\n timestamp: time,\n moofOffset,\n });\n }\n // Sort by timestamp in case it's not naturally sorted\n track.fragmentLookupTable.sort((a, b) => a.timestamp - b.timestamp);\n // Remove multiple entries for the same time\n for (let i = 0; i < track.fragmentLookupTable.length - 1; i++) {\n const entry1 = track.fragmentLookupTable[i];\n const entry2 = track.fragmentLookupTable[i + 1];\n if (entry1.timestamp === entry2.timestamp) {\n track.fragmentLookupTable.splice(i + 1, 1);\n i--;\n }\n }\n }\n ;\n break;\n case 'moof':\n {\n this.currentFragment = {\n moofOffset: startPos,\n moofSize: boxInfo.totalSize,\n implicitBaseDataOffset: startPos,\n trackData: new Map(),\n };\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n this.lastReadFragment = this.currentFragment;\n this.currentFragment = null;\n }\n ;\n break;\n case 'traf':\n {\n assert(this.currentFragment);\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n // It is possible that there is no current track, for example when we don't care about the track\n // referenced in the track fragment header.\n if (this.currentTrack) {\n const trackData = this.currentFragment.trackData.get(this.currentTrack.id);\n if (trackData) {\n const { currentFragmentState } = this.currentTrack;\n assert(currentFragmentState);\n if (currentFragmentState.startTimestamp !== null) {\n offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp);\n trackData.startTimestampIsFinal = true;\n }\n }\n this.currentTrack.currentFragmentState = null;\n this.currentTrack = null;\n }\n }\n ;\n break;\n case 'tfhd':\n {\n assert(this.currentFragment);\n slice.skip(1); // Version\n const flags = readU24Be(slice);\n const baseDataOffsetPresent = Boolean(flags & 0x000001);\n const sampleDescriptionIndexPresent = Boolean(flags & 0x000002);\n const defaultSampleDurationPresent = Boolean(flags & 0x000008);\n const defaultSampleSizePresent = Boolean(flags & 0x000010);\n const defaultSampleFlagsPresent = Boolean(flags & 0x000020);\n const durationIsEmpty = Boolean(flags & 0x010000);\n const defaultBaseIsMoof = Boolean(flags & 0x020000);\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n // We don't care about this track\n break;\n }\n const defaults = this.fragmentTrackDefaults.find(x => x.trackId === trackId);\n this.currentTrack = track;\n track.currentFragmentState = {\n baseDataOffset: this.currentFragment.implicitBaseDataOffset,\n sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null,\n defaultSampleDuration: defaults?.defaultSampleDuration ?? null,\n defaultSampleSize: defaults?.defaultSampleSize ?? null,\n defaultSampleFlags: defaults?.defaultSampleFlags ?? null,\n startTimestamp: null,\n };\n if (baseDataOffsetPresent) {\n track.currentFragmentState.baseDataOffset = readU64Be(slice);\n }\n else if (defaultBaseIsMoof) {\n track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset;\n }\n if (sampleDescriptionIndexPresent) {\n track.currentFragmentState.sampleDescriptionIndex = readU32Be(slice);\n }\n if (defaultSampleDurationPresent) {\n track.currentFragmentState.defaultSampleDuration = readU32Be(slice);\n }\n if (defaultSampleSizePresent) {\n track.currentFragmentState.defaultSampleSize = readU32Be(slice);\n }\n if (defaultSampleFlagsPresent) {\n track.currentFragmentState.defaultSampleFlags = readU32Be(slice);\n }\n if (durationIsEmpty) {\n track.currentFragmentState.defaultSampleDuration = 0;\n }\n }\n ;\n break;\n case 'tfdt':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.currentFragmentState);\n const version = readU8(slice);\n slice.skip(3); // Flags\n const baseMediaDecodeTime = version === 0 ? readU32Be(slice) : readU64Be(slice);\n track.currentFragmentState.startTimestamp = baseMediaDecodeTime;\n }\n ;\n break;\n case 'trun':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(this.currentFragment);\n assert(track.currentFragmentState);\n if (this.currentFragment.trackData.has(track.id)) {\n console.warn('Can\\'t have two trun boxes for the same track in one fragment. Ignoring...');\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n const dataOffsetPresent = Boolean(flags & 0x000001);\n const firstSampleFlagsPresent = Boolean(flags & 0x000004);\n const sampleDurationPresent = Boolean(flags & 0x000100);\n const sampleSizePresent = Boolean(flags & 0x000200);\n const sampleFlagsPresent = Boolean(flags & 0x000400);\n const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800);\n const sampleCount = readU32Be(slice);\n let dataOffset = track.currentFragmentState.baseDataOffset;\n if (dataOffsetPresent) {\n dataOffset += readI32Be(slice);\n }\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = readU32Be(slice);\n }\n let currentOffset = dataOffset;\n if (sampleCount === 0) {\n // Don't associate the fragment with the track if it has no samples, this simplifies other code\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n break;\n }\n let currentTimestamp = 0;\n const trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n samples: [],\n presentationTimestamps: [],\n startTimestampIsFinal: false,\n };\n this.currentFragment.trackData.set(track.id, trackData);\n for (let i = 0; i < sampleCount; i++) {\n let sampleDuration;\n if (sampleDurationPresent) {\n sampleDuration = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleDuration !== null);\n sampleDuration = track.currentFragmentState.defaultSampleDuration;\n }\n let sampleSize;\n if (sampleSizePresent) {\n sampleSize = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleSize !== null);\n sampleSize = track.currentFragmentState.defaultSampleSize;\n }\n let sampleFlags;\n if (sampleFlagsPresent) {\n sampleFlags = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleFlags !== null);\n sampleFlags = track.currentFragmentState.defaultSampleFlags;\n }\n if (i === 0 && firstSampleFlags !== null) {\n sampleFlags = firstSampleFlags;\n }\n let sampleCompositionTimeOffset = 0;\n if (sampleCompositionTimeOffsetsPresent) {\n if (version === 0) {\n sampleCompositionTimeOffset = readU32Be(slice);\n }\n else {\n sampleCompositionTimeOffset = readI32Be(slice);\n }\n }\n const isKeyFrame = !(sampleFlags & 0x00010000);\n trackData.samples.push({\n presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset,\n duration: sampleDuration,\n byteOffset: currentOffset,\n byteSize: sampleSize,\n isKeyFrame,\n });\n currentOffset += sampleSize;\n currentTimestamp += sampleDuration;\n }\n trackData.presentationTimestamps = trackData.samples\n .map((x, i) => ({ presentationTimestamp: x.presentationTimestamp, sampleIndex: i }))\n .sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentSample = trackData.samples[currentEntry.sampleIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update sample durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp;\n }\n }\n const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex];\n const lastSample = trackData.samples[last(trackData.presentationTimestamps).sampleIndex];\n trackData.startTimestamp = firstSample.presentationTimestamp;\n trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration;\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n }\n ;\n break;\n // Metadata section\n // https://exiftool.org/TagNames/QuickTime.html\n // https://mp4workshop.com/about\n case 'udta':\n { // Contains either movie metadata or track metadata\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n if (boxInfo.name !== 'meta' && !this.currentTrack) {\n const startPos = slice.filePos;\n this.metadataTags.raw ??= {};\n if (boxInfo.name[0] === '©') {\n // https://mp4workshop.com/about\n // Box name starting with © indicates \"international text\"\n this.metadataTags.raw[boxInfo.name] ??= readMetadataStringShort(slice);\n }\n else {\n this.metadataTags.raw[boxInfo.name] ??= readBytes(slice, boxInfo.contentSize);\n }\n slice.filePos = startPos;\n }\n switch (boxInfo.name) {\n case 'meta':\n {\n slice.skip(-boxInfo.headerSize);\n this.traverseBox(slice);\n }\n ;\n break;\n case '©nam':\n case 'name':\n {\n if (this.currentTrack) {\n this.currentTrack.name = textDecoder.decode(readBytes(slice, boxInfo.contentSize));\n }\n else {\n this.metadataTags.title ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©des':\n {\n if (!this.currentTrack) {\n this.metadataTags.description ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©ART':\n {\n if (!this.currentTrack) {\n this.metadataTags.artist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©alb':\n {\n if (!this.currentTrack) {\n this.metadataTags.album ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case 'albr':\n {\n if (!this.currentTrack) {\n this.metadataTags.albumArtist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©gen':\n {\n if (!this.currentTrack) {\n this.metadataTags.genre ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©day':\n {\n if (!this.currentTrack) {\n const date = new Date(readMetadataStringShort(slice));\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case '©cmt':\n {\n if (!this.currentTrack) {\n this.metadataTags.comment ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©lyr':\n {\n if (!this.currentTrack) {\n this.metadataTags.lyrics ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n case 'meta':\n {\n if (this.currentTrack) {\n break; // Only care about movie-level metadata for now\n }\n // The 'meta' box comes in two flavors, one with flags/version and one without. To know which is which,\n // let's read the next 4 bytes, which are either the version or the size of the first subbox.\n const word = readU32Be(slice);\n const isQuickTime = word !== 0;\n this.currentMetadataKeys = new Map();\n if (isQuickTime) {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n else {\n this.readContiguousBoxes(slice.slice(contentStartPos + 4, boxInfo.contentSize - 4));\n }\n this.currentMetadataKeys = null;\n }\n ;\n break;\n case 'keys':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const keySize = readU32Be(slice);\n slice.skip(4); // Key namespace\n const keyName = textDecoder.decode(readBytes(slice, keySize - 8));\n this.currentMetadataKeys.set(i + 1, keyName);\n }\n }\n ;\n break;\n case 'ilst':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n let metadataKey = boxInfo.name;\n // Interpret the box name as a u32be\n const nameAsNumber = (metadataKey.charCodeAt(0) << 24)\n + (metadataKey.charCodeAt(1) << 16)\n + (metadataKey.charCodeAt(2) << 8)\n + metadataKey.charCodeAt(3);\n if (this.currentMetadataKeys.has(nameAsNumber)) {\n // An entry exists for this number\n metadataKey = this.currentMetadataKeys.get(nameAsNumber);\n }\n const data = readDataBox(slice);\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[metadataKey] ??= data;\n switch (metadataKey) {\n case '©nam':\n case 'titl':\n case 'com.apple.quicktime.title':\n case 'title':\n {\n if (typeof data === 'string') {\n this.metadataTags.title ??= data;\n }\n }\n ;\n break;\n case '©des':\n case 'desc':\n case 'dscp':\n case 'com.apple.quicktime.description':\n case 'description':\n {\n if (typeof data === 'string') {\n this.metadataTags.description ??= data;\n }\n }\n ;\n break;\n case '©ART':\n case 'com.apple.quicktime.artist':\n case 'artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.artist ??= data;\n }\n }\n ;\n break;\n case '©alb':\n case 'albm':\n case 'com.apple.quicktime.album':\n case 'album':\n {\n if (typeof data === 'string') {\n this.metadataTags.album ??= data;\n }\n }\n ;\n break;\n case 'aART':\n case 'album_artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.albumArtist ??= data;\n }\n }\n ;\n break;\n case '©cmt':\n case 'com.apple.quicktime.comment':\n case 'comment':\n {\n if (typeof data === 'string') {\n this.metadataTags.comment ??= data;\n }\n }\n ;\n break;\n case '©gen':\n case 'gnre':\n case 'com.apple.quicktime.genre':\n case 'genre':\n {\n if (typeof data === 'string') {\n this.metadataTags.genre ??= data;\n }\n }\n ;\n break;\n case '©lyr':\n case 'lyrics':\n {\n if (typeof data === 'string') {\n this.metadataTags.lyrics ??= data;\n }\n }\n ;\n break;\n case '©day':\n case 'rldt':\n case 'com.apple.quicktime.creationdate':\n case 'date':\n {\n if (typeof data === 'string') {\n const date = new Date(data);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case 'covr':\n case 'com.apple.quicktime.artwork':\n {\n if (data instanceof RichImageData) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data: data.data,\n kind: 'coverFront',\n mimeType: data.mimeType,\n });\n }\n else if (data instanceof Uint8Array) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n kind: 'coverFront',\n mimeType: 'image/*',\n });\n }\n }\n ;\n break;\n case 'track':\n {\n if (typeof data === 'string') {\n const parts = data.split('/');\n const trackNum = Number.parseInt(parts[0], 10);\n const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(trackNum) && trackNum > 0) {\n this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'trkn':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const trackNumber = view.getUint16(2, false);\n const tracksTotal = view.getUint16(4, false);\n if (trackNumber > 0) {\n this.metadataTags.trackNumber ??= trackNumber;\n }\n if (tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'disc':\n case 'disk':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const discNumber = view.getUint16(2, false);\n const discNumberMax = view.getUint16(4, false);\n if (discNumber > 0) {\n this.metadataTags.discNumber ??= discNumber;\n }\n if (discNumberMax > 0) {\n this.metadataTags.discsTotal ??= discNumberMax;\n }\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n }\n slice.filePos = boxEndPos;\n return true;\n }\n}\nclass IsobmffTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToSampleIndex = new WeakMap();\n this.packetToFragmentLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.internalCodecId;\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n getTimeResolution() {\n return this.internalTrack.timescale;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n async getFirstPacket(options) {\n const regularPacket = await this.fetchPacketForSampleIndex(0, options);\n if (regularPacket || !this.internalTrack.demuxer.isFragmented) {\n // If there's a non-fragmented packet, always prefer that\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n mapTimestampIntoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.timescale) + this.internalTrack.editListOffset;\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.presentationTimestamp);\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n return this.fetchPacketForSampleIndex(regularSampleIndex + 1, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (locationInFragment.sampleIndex + 1 < trackData.samples.length) {\n // We can simply take the next sample in the fragment\n return {\n sampleIndex: locationInFragment.sampleIndex + 1,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getKeyframeSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const sample = trackData.samples[x.sampleIndex];\n return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale;\n });\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, regularSampleIndex);\n return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.samples.findIndex((x, i) => x.isKeyFrame && i > locationInFragment.sampleIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the fragment\n return {\n sampleIndex: nextKeyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.samples.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n sampleIndex: keyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async fetchPacketForSampleIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleInfo = getSampleInfo(sampleTable, sampleIndex);\n if (!sampleInfo) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(sampleInfo.sampleOffset, sampleInfo.sampleSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sampleInfo.sampleSize);\n }\n const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = sampleInfo.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize);\n this.packetToSampleIndex.set(packet, sampleIndex);\n return packet;\n }\n async fetchPacketInFragment(fragment, sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[sampleIndex];\n assert(fragmentSample);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(fragmentSample.byteOffset, fragmentSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, fragmentSample.byteSize);\n }\n const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = fragmentSample.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize);\n this.packetToFragmentLocation.set(packet, { fragment, sampleIndex });\n return packet;\n }\n /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */\n async performFragmentedLookup(\n // The fragment where we start looking\n startFragment, \n // This function returns the best-matching sample in a given fragment\n getMatchInFragment, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct sample will not come after it\n latestTimestamp, options) {\n const demuxer = this.internalTrack.demuxer;\n let currentFragment = null;\n let bestFragment = null;\n let bestSampleIndex = -1;\n if (startFragment) {\n const { sampleIndex, correctSampleFound } = getMatchInFragment(startFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(startFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = startFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n // Search for a lookup entry; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct fragment (or at least nearby).\n const lookupEntryIndex = binarySearchLessOrEqual(this.internalTrack.fragmentLookupTable, searchTimestamp, x => x.timestamp);\n const lookupEntry = lookupEntryIndex !== -1\n ? this.internalTrack.fragmentLookupTable[lookupEntryIndex]\n : null;\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.fragmentPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.fragmentPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(lookupEntry?.moofOffset ?? 0, positionCacheEntry?.moofOffset ?? 0) || null;\n let currentPos;\n if (!startFragment) {\n currentPos = lookupEntryPosition ?? 0;\n }\n else {\n if (lookupEntryPosition === null || startFragment.moofOffset >= lookupEntryPosition) {\n currentPos = startFragment.moofOffset + startFragment.moofSize;\n currentFragment = startFragment;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (true) {\n if (currentFragment) {\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const boxStartPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'moof') {\n currentFragment = await demuxer.readFragment(boxStartPos);\n const { sampleIndex, correctSampleFound } = getMatchInFragment(currentFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(currentFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = currentFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n currentPos = boxStartPos + boxInfo.totalSize;\n }\n // Catch faulty lookup table entries\n if (lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) {\n // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied\n // the match. In this case, let's search again but using the lookup entry before that.\n const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1];\n assert(!previousLookupEntry || previousLookupEntry.timestamp < lookupEntry.timestamp);\n const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity;\n return this.performFragmentedLookup(null, getMatchInFragment, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestFragment) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInFragment(bestFragment, bestSampleIndex, options);\n }\n return null;\n }\n}\nclass IsobmffVideoTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return false;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.vp9CodecInfo = firstPacket && extractVp9CodecInfoFromPacket(firstPacket.data);\n }\n else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.av1CodecInfo = firstPacket && extractAv1CodecInfoFromPacket(firstPacket.data);\n }\n return {\n codec: extractVideoCodecString(this.internalTrack.info),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass IsobmffAudioTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString(this.internalTrack.info),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\nconst getSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n return sampleTable.presentationTimestamps[index].sampleIndex;\n }\n else {\n const index = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, timescaleUnits, x => x.startDecodeTimestamp);\n if (index === -1) {\n return -1;\n }\n const entry = sampleTable.sampleTimingEntries[index];\n return entry.startIndex\n + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1);\n }\n};\nconst getKeyframeSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (!sampleTable.keySampleIndices) {\n // Every sample is a keyframe\n return getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n }\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n // Walk the samples in presentation order until we find one that's a keyframe\n for (let i = index; i >= 0; i--) {\n const sampleIndex = sampleTable.presentationTimestamps[i].sampleIndex;\n const isKeyFrame = binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1;\n if (isKeyFrame) {\n return sampleIndex;\n }\n }\n return -1;\n }\n else {\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index] ?? -1;\n }\n};\nconst getSampleInfo = (sampleTable, sampleIndex) => {\n const timingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, sampleIndex, x => x.startIndex);\n const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex];\n if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) {\n return null;\n }\n const decodeTimestamp = timingEntry.startDecodeTimestamp\n + (sampleIndex - timingEntry.startIndex) * timingEntry.delta;\n let presentationTimestamp = decodeTimestamp;\n const offsetEntryIndex = binarySearchLessOrEqual(sampleTable.sampleCompositionTimeOffsets, sampleIndex, x => x.startIndex);\n const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex];\n if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) {\n presentationTimestamp += offsetEntry.offset;\n }\n const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)];\n const chunkEntryIndex = binarySearchLessOrEqual(sampleTable.sampleToChunk, sampleIndex, x => x.startSampleIndex);\n const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex];\n assert(chunkEntry);\n const chunkIndex = chunkEntry.startChunkIndex\n + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk);\n const chunkOffset = sampleTable.chunkOffsets[chunkIndex];\n const startSampleIndexOfChunk = chunkEntry.startSampleIndex\n + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk;\n let chunkSize = 0;\n let sampleOffset = chunkOffset;\n if (sampleTable.sampleSizes.length === 1) {\n sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk);\n chunkSize += sampleSize * chunkEntry.samplesPerChunk;\n }\n else {\n for (let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++) {\n const sampleSize = sampleTable.sampleSizes[i];\n if (i < sampleIndex) {\n sampleOffset += sampleSize;\n }\n chunkSize += sampleSize;\n }\n }\n let duration = timingEntry.delta;\n if (sampleTable.presentationTimestamps) {\n // In order to accurately compute the duration, we need to take the duration to the next sample in presentation\n // order, not in decode order\n const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex];\n assert(presentationIndex !== undefined);\n if (presentationIndex < sampleTable.presentationTimestamps.length - 1) {\n const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1];\n const nextPresentationTimestamp = nextEntry.presentationTimestamp;\n duration = nextPresentationTimestamp - presentationTimestamp;\n }\n }\n return {\n presentationTimestamp,\n duration,\n sampleOffset,\n sampleSize,\n chunkOffset,\n chunkSize,\n isKeyFrame: sampleTable.keySampleIndices\n ? binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1\n : true,\n };\n};\nconst getNextKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex + 1;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index + 1] ?? -1;\n};\nconst offsetFragmentTrackDataByTimestamp = (trackData, timestamp) => {\n trackData.startTimestamp += timestamp;\n trackData.endTimestamp += timestamp;\n for (const sample of trackData.samples) {\n sample.presentationTimestamp += timestamp;\n }\n for (const entry of trackData.presentationTimestamps) {\n entry.presentationTimestamp += timestamp;\n }\n};\n/** Extracts the rotation component from a transformation matrix, in degrees. */\nconst extractRotationFromMatrix = (matrix) => {\n const [m11, , , m21] = matrix;\n const scaleX = Math.hypot(m11, m21);\n const cosTheta = m11 / scaleX;\n const sinTheta = m21 / scaleX;\n // Invert the rotation because matrices are post-multiplied in ISOBMFF\n const result = -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI);\n if (!Number.isFinite(result)) {\n // Can happen if the entire matrix is 0, for example\n return 0;\n }\n return result;\n};\nconst sampleTableIsEmpty = (sampleTable) => {\n return sampleTable.sampleSizes.length === 0;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, assertNever, base64ToBytes, Bitstream, bytesToBase64, keyValueIterator, getUint24, last, readExpGolomb, readSignedExpGolomb, textDecoder, textEncoder, toDataView, toUint8Array, getChromiumVersion, isChromium, } from './misc.js';\n// References for AVC/HEVC code:\n// ISO 14496-15\n// Rec. ITU-T H.264\n// Rec. ITU-T H.265\n// https://stackoverflow.com/questions/24884827\nexport var AvcNalUnitType;\n(function (AvcNalUnitType) {\n AvcNalUnitType[AvcNalUnitType[\"IDR\"] = 5] = \"IDR\";\n AvcNalUnitType[AvcNalUnitType[\"SEI\"] = 6] = \"SEI\";\n AvcNalUnitType[AvcNalUnitType[\"SPS\"] = 7] = \"SPS\";\n AvcNalUnitType[AvcNalUnitType[\"PPS\"] = 8] = \"PPS\";\n AvcNalUnitType[AvcNalUnitType[\"SPS_EXT\"] = 13] = \"SPS_EXT\";\n})(AvcNalUnitType || (AvcNalUnitType = {}));\nexport var HevcNalUnitType;\n(function (HevcNalUnitType) {\n HevcNalUnitType[HevcNalUnitType[\"RASL_N\"] = 8] = \"RASL_N\";\n HevcNalUnitType[HevcNalUnitType[\"RASL_R\"] = 9] = \"RASL_R\";\n HevcNalUnitType[HevcNalUnitType[\"BLA_W_LP\"] = 16] = \"BLA_W_LP\";\n HevcNalUnitType[HevcNalUnitType[\"RSV_IRAP_VCL23\"] = 23] = \"RSV_IRAP_VCL23\";\n HevcNalUnitType[HevcNalUnitType[\"VPS_NUT\"] = 32] = \"VPS_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"SPS_NUT\"] = 33] = \"SPS_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"PPS_NUT\"] = 34] = \"PPS_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"PREFIX_SEI_NUT\"] = 39] = \"PREFIX_SEI_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"SUFFIX_SEI_NUT\"] = 40] = \"SUFFIX_SEI_NUT\";\n})(HevcNalUnitType || (HevcNalUnitType = {}));\n/** Finds all NAL units in an AVC packet in Annex B format. */\nexport const findNalUnitsInAnnexB = (packetData) => {\n const nalUnits = [];\n let i = 0;\n while (i < packetData.length) {\n let startCodePos = -1;\n let startCodeLength = 0;\n for (let j = i; j < packetData.length - 3; j++) {\n // Check for 3-byte start code (0x000001)\n if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) {\n startCodePos = j;\n startCodeLength = 3;\n break;\n }\n // Check for 4-byte start code (0x00000001)\n if (j < packetData.length - 4\n && packetData[j] === 0\n && packetData[j + 1] === 0\n && packetData[j + 2] === 0\n && packetData[j + 3] === 1) {\n startCodePos = j;\n startCodeLength = 4;\n break;\n }\n }\n if (startCodePos === -1) {\n break; // No more start codes found\n }\n // If this isn't the first start code, extract the previous NAL unit\n if (i > 0 && startCodePos > i) {\n const nalData = packetData.subarray(i, startCodePos);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n i = startCodePos + startCodeLength;\n }\n // Extract the last NAL unit if there is one\n if (i < packetData.length) {\n const nalData = packetData.subarray(i);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n return nalUnits;\n};\n/** Finds all NAL units in an AVC packet in length-prefixed format. */\nconst findNalUnitsInLengthPrefixed = (packetData, lengthSize) => {\n const nalUnits = [];\n let offset = 0;\n const dataView = new DataView(packetData.buffer, packetData.byteOffset, packetData.byteLength);\n while (offset + lengthSize <= packetData.length) {\n let nalUnitLength;\n if (lengthSize === 1) {\n nalUnitLength = dataView.getUint8(offset);\n }\n else if (lengthSize === 2) {\n nalUnitLength = dataView.getUint16(offset, false);\n }\n else if (lengthSize === 3) {\n nalUnitLength = getUint24(dataView, offset, false);\n }\n else if (lengthSize === 4) {\n nalUnitLength = dataView.getUint32(offset, false);\n }\n else {\n assertNever(lengthSize);\n assert(false);\n }\n offset += lengthSize;\n const nalUnit = packetData.subarray(offset, offset + nalUnitLength);\n nalUnits.push(nalUnit);\n offset += nalUnitLength;\n }\n return nalUnits;\n};\nconst removeEmulationPreventionBytes = (data) => {\n const result = [];\n const len = data.length;\n for (let i = 0; i < len; i++) {\n // Look for the 0x000003 pattern\n if (i + 2 < len && data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x03) {\n result.push(0x00, 0x00); // Push the first two bytes\n i += 2; // Skip the 0x03 byte\n }\n else {\n result.push(data[i]);\n }\n }\n return new Uint8Array(result);\n};\n/** Converts an AVC packet in Annex B format to length-prefixed format. */\nexport const transformAnnexBToLengthPrefixed = (packetData) => {\n const NAL_UNIT_LENGTH_SIZE = 4;\n const nalUnits = findNalUnitsInAnnexB(packetData);\n if (nalUnits.length === 0) {\n // If no NAL units were found, it's not valid Annex B data\n return null;\n }\n let totalSize = 0;\n for (const nalUnit of nalUnits) {\n totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength;\n }\n const avccData = new Uint8Array(totalSize);\n const dataView = new DataView(avccData.buffer);\n let offset = 0;\n // Write each NAL unit with its length prefix\n for (const nalUnit of nalUnits) {\n const length = nalUnit.byteLength;\n dataView.setUint32(offset, length, false);\n offset += 4;\n avccData.set(nalUnit, offset);\n offset += nalUnit.byteLength;\n }\n return avccData;\n};\nexport const extractAvcNalUnits = (packetData, decoderConfig) => {\n if (decoderConfig.description) {\n // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n const bytes = toUint8Array(decoderConfig.description);\n const lengthSizeMinusOne = bytes[4] & 0b11;\n const lengthSize = (lengthSizeMinusOne + 1);\n return findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nconst extractNalUnitTypeForAvc = (data) => {\n return data[0] & 0x1F;\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.PPS);\n const spsExtUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS_EXT);\n if (spsUnits.length === 0) {\n return null;\n }\n if (ppsUnits.length === 0) {\n return null;\n }\n // Let's get the first SPS for profile and level information\n const spsData = spsUnits[0];\n const spsInfo = parseAvcSps(spsData);\n assert(spsInfo !== null);\n const hasExtendedData = spsInfo.profileIdc === 100\n || spsInfo.profileIdc === 110\n || spsInfo.profileIdc === 122\n || spsInfo.profileIdc === 144;\n return {\n configurationVersion: 1,\n avcProfileIndication: spsInfo.profileIdc,\n profileCompatibility: spsInfo.constraintFlags,\n avcLevelIndication: spsInfo.levelIdc,\n lengthSizeMinusOne: 3, // Typically 4 bytes for length field\n sequenceParameterSets: spsUnits,\n pictureParameterSets: ppsUnits,\n chromaFormat: hasExtendedData ? spsInfo.chromaFormatIdc : null,\n bitDepthLumaMinus8: hasExtendedData ? spsInfo.bitDepthLumaMinus8 : null,\n bitDepthChromaMinus8: hasExtendedData ? spsInfo.bitDepthChromaMinus8 : null,\n sequenceParameterSetExt: hasExtendedData ? spsExtUnits : null,\n };\n }\n catch (error) {\n console.error('Error building AVC Decoder Configuration Record:', error);\n return null;\n }\n};\n/** Serializes an AvcDecoderConfigurationRecord into the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const serializeAvcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n // Write header\n bytes.push(record.configurationVersion);\n bytes.push(record.avcProfileIndication);\n bytes.push(record.profileCompatibility);\n bytes.push(record.avcLevelIndication);\n bytes.push(0xFC | (record.lengthSizeMinusOne & 0x03)); // Reserved bits (6) + lengthSizeMinusOne (2)\n // Reserved bits (3) + numOfSequenceParameterSets (5)\n bytes.push(0xE0 | (record.sequenceParameterSets.length & 0x1F));\n // Write SPS\n for (const sps of record.sequenceParameterSets) {\n const length = sps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(sps[i]);\n }\n }\n bytes.push(record.pictureParameterSets.length);\n // Write PPS\n for (const pps of record.pictureParameterSets) {\n const length = pps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(pps[i]);\n }\n }\n if (record.avcProfileIndication === 100\n || record.avcProfileIndication === 110\n || record.avcProfileIndication === 122\n || record.avcProfileIndication === 144) {\n assert(record.chromaFormat !== null);\n assert(record.bitDepthLumaMinus8 !== null);\n assert(record.bitDepthChromaMinus8 !== null);\n assert(record.sequenceParameterSetExt !== null);\n bytes.push(0xFC | (record.chromaFormat & 0x03)); // Reserved bits + chroma_format\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07)); // Reserved bits + bit_depth_luma_minus8\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07)); // Reserved bits + bit_depth_chroma_minus8\n bytes.push(record.sequenceParameterSetExt.length);\n // Write SPS Ext\n for (const spsExt of record.sequenceParameterSetExt) {\n const length = spsExt.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(spsExt[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\n/** Deserializes an AvcDecoderConfigurationRecord from the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const deserializeAvcDecoderConfigurationRecord = (data) => {\n try {\n const view = toDataView(data);\n let offset = 0;\n // Read header\n const configurationVersion = view.getUint8(offset++);\n const avcProfileIndication = view.getUint8(offset++);\n const profileCompatibility = view.getUint8(offset++);\n const avcLevelIndication = view.getUint8(offset++);\n const lengthSizeMinusOne = view.getUint8(offset++) & 0x03;\n const numOfSequenceParameterSets = view.getUint8(offset++) & 0x1F;\n // Read SPS\n const sequenceParameterSets = [];\n for (let i = 0; i < numOfSequenceParameterSets; i++) {\n const length = view.getUint16(offset, false);\n offset += 2;\n sequenceParameterSets.push(data.subarray(offset, offset + length));\n offset += length;\n }\n const numOfPictureParameterSets = view.getUint8(offset++);\n // Read PPS\n const pictureParameterSets = [];\n for (let i = 0; i < numOfPictureParameterSets; i++) {\n const length = view.getUint16(offset, false);\n offset += 2;\n pictureParameterSets.push(data.subarray(offset, offset + length));\n offset += length;\n }\n const record = {\n configurationVersion,\n avcProfileIndication,\n profileCompatibility,\n avcLevelIndication,\n lengthSizeMinusOne,\n sequenceParameterSets,\n pictureParameterSets,\n chromaFormat: null,\n bitDepthLumaMinus8: null,\n bitDepthChromaMinus8: null,\n sequenceParameterSetExt: null,\n };\n // Check if there are extended profile fields\n if ((avcProfileIndication === 100\n || avcProfileIndication === 110\n || avcProfileIndication === 122\n || avcProfileIndication === 144)\n && offset + 4 <= data.length) {\n const chromaFormat = view.getUint8(offset++) & 0x03;\n const bitDepthLumaMinus8 = view.getUint8(offset++) & 0x07;\n const bitDepthChromaMinus8 = view.getUint8(offset++) & 0x07;\n const numOfSequenceParameterSetExt = view.getUint8(offset++);\n record.chromaFormat = chromaFormat;\n record.bitDepthLumaMinus8 = bitDepthLumaMinus8;\n record.bitDepthChromaMinus8 = bitDepthChromaMinus8;\n // Read SPS Ext\n const sequenceParameterSetExt = [];\n for (let i = 0; i < numOfSequenceParameterSetExt; i++) {\n const length = view.getUint16(offset, false);\n offset += 2;\n sequenceParameterSetExt.push(data.subarray(offset, offset + length));\n offset += length;\n }\n record.sequenceParameterSetExt = sequenceParameterSetExt;\n }\n return record;\n }\n catch (error) {\n console.error('Error deserializing AVC Decoder Configuration Record:', error);\n return null;\n }\n};\n/** Parses an AVC SPS (Sequence Parameter Set) to extract basic information. */\nexport const parseAvcSps = (sps) => {\n try {\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(1); // forbidden_zero_bit\n bitstream.skipBits(2); // nal_ref_idc\n const nalUnitType = bitstream.readBits(5);\n if (nalUnitType !== 7) { // SPS NAL unit type is 7\n return null;\n }\n const profileIdc = bitstream.readAlignedByte();\n const constraintFlags = bitstream.readAlignedByte();\n const levelIdc = bitstream.readAlignedByte();\n readExpGolomb(bitstream); // seq_parameter_set_id\n let chromaFormatIdc = null;\n let bitDepthLumaMinus8 = null;\n let bitDepthChromaMinus8 = null;\n // Handle high profile chroma_format_idc\n if (profileIdc === 100\n || profileIdc === 110\n || profileIdc === 122\n || profileIdc === 244\n || profileIdc === 44\n || profileIdc === 83\n || profileIdc === 86\n || profileIdc === 118\n || profileIdc === 128) {\n chromaFormatIdc = readExpGolomb(bitstream);\n if (chromaFormatIdc === 3) {\n bitstream.skipBits(1); // separate_colour_plane_flag\n }\n bitDepthLumaMinus8 = readExpGolomb(bitstream);\n bitDepthChromaMinus8 = readExpGolomb(bitstream);\n bitstream.skipBits(1); // qpprime_y_zero_transform_bypass_flag\n const seqScalingMatrixPresentFlag = bitstream.readBits(1);\n if (seqScalingMatrixPresentFlag) {\n for (let i = 0; i < (chromaFormatIdc !== 3 ? 8 : 12); i++) {\n const seqScalingListPresentFlag = bitstream.readBits(1);\n if (seqScalingListPresentFlag) {\n const sizeOfScalingList = i < 6 ? 16 : 64;\n let lastScale = 8;\n let nextScale = 8;\n for (let j = 0; j < sizeOfScalingList; j++) {\n if (nextScale !== 0) {\n const deltaScale = readSignedExpGolomb(bitstream);\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n }\n }\n }\n }\n readExpGolomb(bitstream); // log2_max_frame_num_minus4\n const picOrderCntType = readExpGolomb(bitstream);\n if (picOrderCntType === 0) {\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n }\n else if (picOrderCntType === 1) {\n bitstream.skipBits(1); // delta_pic_order_always_zero_flag\n readSignedExpGolomb(bitstream); // offset_for_non_ref_pic\n readSignedExpGolomb(bitstream); // offset_for_top_to_bottom_field\n const numRefFramesInPicOrderCntCycle = readExpGolomb(bitstream);\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n readSignedExpGolomb(bitstream); // offset_for_ref_frame[i]\n }\n }\n readExpGolomb(bitstream); // max_num_ref_frames\n bitstream.skipBits(1); // gaps_in_frame_num_value_allowed_flag\n readExpGolomb(bitstream); // pic_width_in_mbs_minus1\n readExpGolomb(bitstream); // pic_height_in_map_units_minus1\n const frameMbsOnlyFlag = bitstream.readBits(1);\n return {\n profileIdc,\n constraintFlags,\n levelIdc,\n frameMbsOnlyFlag,\n chromaFormatIdc,\n bitDepthLumaMinus8,\n bitDepthChromaMinus8,\n };\n }\n catch (error) {\n console.error('Error parsing AVC SPS:', error);\n return null;\n }\n};\nexport const extractHevcNalUnits = (packetData, decoderConfig) => {\n if (decoderConfig.description) {\n // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n const bytes = toUint8Array(decoderConfig.description);\n const lengthSizeMinusOne = bytes[21] & 0b11;\n const lengthSize = (lengthSizeMinusOne + 1);\n return findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nexport const extractNalUnitTypeForHevc = (data) => {\n return (data[0] >> 1) & 0x3F;\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const vpsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.VPS_NUT);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SPS_NUT);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PPS_NUT);\n const seiUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PREFIX_SEI_NUT\n || extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SUFFIX_SEI_NUT);\n if (spsUnits.length === 0 || ppsUnits.length === 0)\n return null;\n const sps = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(16); // NAL header\n bitstream.readBits(4); // sps_video_parameter_set_id\n const sps_max_sub_layers_minus1 = bitstream.readBits(3);\n const sps_temporal_id_nesting_flag = bitstream.readBits(1);\n const { general_profile_space, general_tier_flag, general_profile_idc, general_profile_compatibility_flags, general_constraint_indicator_flags, general_level_idc, } = parseProfileTierLevel(bitstream, sps_max_sub_layers_minus1);\n readExpGolomb(bitstream); // sps_seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3)\n bitstream.skipBits(1); // separate_colour_plane_flag\n readExpGolomb(bitstream); // pic_width_in_luma_samples\n readExpGolomb(bitstream); // pic_height_in_luma_samples\n if (bitstream.readBits(1)) { // conformance_window_flag\n readExpGolomb(bitstream); // conf_win_left_offset\n readExpGolomb(bitstream); // conf_win_right_offset\n readExpGolomb(bitstream); // conf_win_top_offset\n readExpGolomb(bitstream); // conf_win_bottom_offset\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1);\n const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;\n for (let i = maxNum; i <= sps_max_sub_layers_minus1; i++) {\n readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n readExpGolomb(bitstream); // sps_max_num_reorder_pics[i]\n readExpGolomb(bitstream); // sps_max_latency_increase_plus1[i]\n }\n readExpGolomb(bitstream); // log2_min_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_luma_coding_block_size\n readExpGolomb(bitstream); // log2_min_luma_transform_block_size_minus2\n readExpGolomb(bitstream); // log2_diff_max_min_luma_transform_block_size\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_inter\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_intra\n if (bitstream.readBits(1)) { // scaling_list_enabled_flag\n if (bitstream.readBits(1)) {\n skipScalingListData(bitstream);\n }\n }\n bitstream.skipBits(1); // amp_enabled_flag\n bitstream.skipBits(1); // sample_adaptive_offset_enabled_flag\n if (bitstream.readBits(1)) { // pcm_enabled_flag\n bitstream.skipBits(4); // pcm_sample_bit_depth_luma_minus1\n bitstream.skipBits(4); // pcm_sample_bit_depth_chroma_minus1\n readExpGolomb(bitstream); // log2_min_pcm_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_pcm_luma_coding_block_size\n bitstream.skipBits(1); // pcm_loop_filter_disabled_flag\n }\n const num_short_term_ref_pic_sets = readExpGolomb(bitstream);\n skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets);\n if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n const num_long_term_ref_pics_sps = readExpGolomb(bitstream);\n for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n readExpGolomb(bitstream); // lt_ref_pic_poc_lsb_sps[i]\n bitstream.skipBits(1); // used_by_curr_pic_lt_sps_flag[i]\n }\n }\n bitstream.skipBits(1); // sps_temporal_mvp_enabled_flag\n bitstream.skipBits(1); // strong_intra_smoothing_enabled_flag\n let min_spatial_segmentation_idc = 0;\n if (bitstream.readBits(1)) { // vui_parameters_present_flag\n min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1);\n }\n // Parse PPS for parallelismType\n let parallelismType = 0;\n if (ppsUnits.length > 0) {\n const pps = ppsUnits[0];\n const ppsBitstream = new Bitstream(removeEmulationPreventionBytes(pps));\n ppsBitstream.skipBits(16); // NAL header\n readExpGolomb(ppsBitstream); // pps_pic_parameter_set_id\n readExpGolomb(ppsBitstream); // pps_seq_parameter_set_id\n ppsBitstream.skipBits(1); // dependent_slice_segments_enabled_flag\n ppsBitstream.skipBits(1); // output_flag_present_flag\n ppsBitstream.skipBits(3); // num_extra_slice_header_bits\n ppsBitstream.skipBits(1); // sign_data_hiding_enabled_flag\n ppsBitstream.skipBits(1); // cabac_init_present_flag\n readExpGolomb(ppsBitstream); // num_ref_idx_l0_default_active_minus1\n readExpGolomb(ppsBitstream); // num_ref_idx_l1_default_active_minus1\n readSignedExpGolomb(ppsBitstream); // init_qp_minus26\n ppsBitstream.skipBits(1); // constrained_intra_pred_flag\n ppsBitstream.skipBits(1); // transform_skip_enabled_flag\n if (ppsBitstream.readBits(1)) { // cu_qp_delta_enabled_flag\n readExpGolomb(ppsBitstream); // diff_cu_qp_delta_depth\n }\n readSignedExpGolomb(ppsBitstream); // pps_cb_qp_offset\n readSignedExpGolomb(ppsBitstream); // pps_cr_qp_offset\n ppsBitstream.skipBits(1); // pps_slice_chroma_qp_offsets_present_flag\n ppsBitstream.skipBits(1); // weighted_pred_flag\n ppsBitstream.skipBits(1); // weighted_bipred_flag\n ppsBitstream.skipBits(1); // transquant_bypass_enabled_flag\n const tiles_enabled_flag = ppsBitstream.readBits(1);\n const entropy_coding_sync_enabled_flag = ppsBitstream.readBits(1);\n if (!tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 0;\n else if (tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 2;\n else if (!tiles_enabled_flag && entropy_coding_sync_enabled_flag)\n parallelismType = 3;\n else\n parallelismType = 0;\n }\n const arrays = [\n ...(vpsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: HevcNalUnitType.VPS_NUT,\n nalUnits: vpsUnits,\n },\n ]\n : []),\n ...(spsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: HevcNalUnitType.SPS_NUT,\n nalUnits: spsUnits,\n },\n ]\n : []),\n ...(ppsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: HevcNalUnitType.PPS_NUT,\n nalUnits: ppsUnits,\n },\n ]\n : []),\n ...(seiUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: extractNalUnitTypeForHevc(seiUnits[0]),\n nalUnits: seiUnits,\n },\n ]\n : []),\n ];\n const record = {\n configurationVersion: 1,\n generalProfileSpace: general_profile_space,\n generalTierFlag: general_tier_flag,\n generalProfileIdc: general_profile_idc,\n generalProfileCompatibilityFlags: general_profile_compatibility_flags,\n generalConstraintIndicatorFlags: general_constraint_indicator_flags,\n generalLevelIdc: general_level_idc,\n minSpatialSegmentationIdc: min_spatial_segmentation_idc,\n parallelismType,\n chromaFormatIdc: chroma_format_idc,\n bitDepthLumaMinus8: bit_depth_luma_minus8,\n bitDepthChromaMinus8: bit_depth_chroma_minus8,\n avgFrameRate: 0,\n constantFrameRate: 0,\n numTemporalLayers: sps_max_sub_layers_minus1 + 1,\n temporalIdNested: sps_temporal_id_nesting_flag,\n lengthSizeMinusOne: 3,\n arrays,\n };\n return record;\n }\n catch (error) {\n console.error('Error building HEVC Decoder Configuration Record:', error);\n return null;\n }\n};\nconst parseProfileTierLevel = (bitstream, maxNumSubLayersMinus1) => {\n const general_profile_space = bitstream.readBits(2);\n const general_tier_flag = bitstream.readBits(1);\n const general_profile_idc = bitstream.readBits(5);\n let general_profile_compatibility_flags = 0;\n for (let i = 0; i < 32; i++) {\n general_profile_compatibility_flags = (general_profile_compatibility_flags << 1) | bitstream.readBits(1);\n }\n const general_constraint_indicator_flags = new Uint8Array(6);\n for (let i = 0; i < 6; i++) {\n general_constraint_indicator_flags[i] = bitstream.readBits(8);\n }\n const general_level_idc = bitstream.readBits(8);\n const sub_layer_profile_present_flag = [];\n const sub_layer_level_present_flag = [];\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n sub_layer_profile_present_flag.push(bitstream.readBits(1));\n sub_layer_level_present_flag.push(bitstream.readBits(1));\n }\n if (maxNumSubLayersMinus1 > 0) {\n for (let i = maxNumSubLayersMinus1; i < 8; i++) {\n bitstream.skipBits(2); // reserved_zero_2bits\n }\n }\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n if (sub_layer_profile_present_flag[i])\n bitstream.skipBits(88);\n if (sub_layer_level_present_flag[i])\n bitstream.skipBits(8);\n }\n return {\n general_profile_space,\n general_tier_flag,\n general_profile_idc,\n general_profile_compatibility_flags,\n general_constraint_indicator_flags,\n general_level_idc,\n };\n};\nconst skipScalingListData = (bitstream) => {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for (let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++) {\n const scaling_list_pred_mode_flag = bitstream.readBits(1);\n if (!scaling_list_pred_mode_flag) {\n readExpGolomb(bitstream); // scaling_list_pred_matrix_id_delta\n }\n else {\n const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n if (sizeId > 1) {\n readSignedExpGolomb(bitstream); // scaling_list_dc_coef_minus8\n }\n for (let i = 0; i < coefNum; i++) {\n readSignedExpGolomb(bitstream); // scaling_list_delta_coef\n }\n }\n }\n }\n};\nconst skipAllStRefPicSets = (bitstream, num_short_term_ref_pic_sets) => {\n const NumDeltaPocs = [];\n for (let stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; stRpsIdx++) {\n NumDeltaPocs[stRpsIdx] = skipStRefPicSet(bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs);\n }\n};\nconst skipStRefPicSet = (bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs) => {\n let NumDeltaPocsThis = 0;\n let inter_ref_pic_set_prediction_flag = 0;\n let RefRpsIdx = 0;\n if (stRpsIdx !== 0) {\n inter_ref_pic_set_prediction_flag = bitstream.readBits(1);\n }\n if (inter_ref_pic_set_prediction_flag) {\n if (stRpsIdx === num_short_term_ref_pic_sets) {\n const delta_idx_minus1 = readExpGolomb(bitstream);\n RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);\n }\n else {\n RefRpsIdx = stRpsIdx - 1;\n }\n bitstream.readBits(1); // delta_rps_sign\n readExpGolomb(bitstream); // abs_delta_rps_minus1\n // The number of iterations is NumDeltaPocs[RefRpsIdx] + 1\n const numDelta = NumDeltaPocs[RefRpsIdx] ?? 0;\n for (let j = 0; j <= numDelta; j++) {\n const used_by_curr_pic_flag = bitstream.readBits(1);\n if (!used_by_curr_pic_flag) {\n bitstream.readBits(1); // use_delta_flag\n }\n }\n NumDeltaPocsThis = NumDeltaPocs[RefRpsIdx];\n }\n else {\n const num_negative_pics = readExpGolomb(bitstream);\n const num_positive_pics = readExpGolomb(bitstream);\n for (let i = 0; i < num_negative_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s0_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s0_flag[i]\n }\n for (let i = 0; i < num_positive_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s1_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s1_flag[i]\n }\n NumDeltaPocsThis = num_negative_pics + num_positive_pics;\n }\n return NumDeltaPocsThis;\n};\nconst parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1) => {\n if (bitstream.readBits(1)) { // aspect_ratio_info_present_flag\n const aspect_ratio_idc = bitstream.readBits(8);\n if (aspect_ratio_idc === 255) {\n bitstream.readBits(16); // sar_width\n bitstream.readBits(16); // sar_height\n }\n }\n if (bitstream.readBits(1)) { // overscan_info_present_flag\n bitstream.readBits(1); // overscan_appropriate_flag\n }\n if (bitstream.readBits(1)) { // video_signal_type_present_flag\n bitstream.readBits(3); // video_format\n bitstream.readBits(1); // video_full_range_flag\n if (bitstream.readBits(1)) {\n bitstream.readBits(8); // colour_primaries\n bitstream.readBits(8); // transfer_characteristics\n bitstream.readBits(8); // matrix_coeffs\n }\n }\n if (bitstream.readBits(1)) { // chroma_loc_info_present_flag\n readExpGolomb(bitstream); // chroma_sample_loc_type_top_field\n readExpGolomb(bitstream); // chroma_sample_loc_type_bottom_field\n }\n bitstream.readBits(1); // neutral_chroma_indication_flag\n bitstream.readBits(1); // field_seq_flag\n bitstream.readBits(1); // frame_field_info_present_flag\n if (bitstream.readBits(1)) { // default_display_window_flag\n readExpGolomb(bitstream); // def_disp_win_left_offset\n readExpGolomb(bitstream); // def_disp_win_right_offset\n readExpGolomb(bitstream); // def_disp_win_top_offset\n readExpGolomb(bitstream); // def_disp_win_bottom_offset\n }\n if (bitstream.readBits(1)) { // vui_timing_info_present_flag\n bitstream.readBits(32); // vui_num_units_in_tick\n bitstream.readBits(32); // vui_time_scale\n if (bitstream.readBits(1)) { // vui_poc_proportional_to_timing_flag\n readExpGolomb(bitstream); // vui_num_ticks_poc_diff_one_minus1\n }\n if (bitstream.readBits(1)) {\n skipHrdParameters(bitstream, true, sps_max_sub_layers_minus1);\n }\n }\n if (bitstream.readBits(1)) { // bitstream_restriction_flag\n bitstream.readBits(1); // tiles_fixed_structure_flag\n bitstream.readBits(1); // motion_vectors_over_pic_boundaries_flag\n bitstream.readBits(1); // restricted_ref_pic_lists_flag\n const min_spatial_segmentation_idc = readExpGolomb(bitstream);\n // skip the rest\n readExpGolomb(bitstream); // max_bytes_per_pic_denom\n readExpGolomb(bitstream); // max_bits_per_min_cu_denom\n readExpGolomb(bitstream); // log2_max_mv_length_horizontal\n readExpGolomb(bitstream); // log2_max_mv_length_vertical\n return min_spatial_segmentation_idc;\n }\n return 0;\n};\nconst skipHrdParameters = (bitstream, commonInfPresentFlag, maxNumSubLayersMinus1) => {\n let nal_hrd_parameters_present_flag = false;\n let vcl_hrd_parameters_present_flag = false;\n let sub_pic_hrd_params_present_flag = false;\n if (commonInfPresentFlag) {\n nal_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n vcl_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {\n sub_pic_hrd_params_present_flag = bitstream.readBits(1) === 1;\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(8); // tick_divisor_minus2\n bitstream.readBits(5); // du_cpb_removal_delay_increment_length_minus1\n bitstream.readBits(1); // sub_pic_cpb_params_in_pic_timing_sei_flag\n bitstream.readBits(5); // dpb_output_delay_du_length_minus1\n }\n bitstream.readBits(4); // bit_rate_scale\n bitstream.readBits(4); // cpb_size_scale\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(4); // cpb_size_du_scale\n }\n bitstream.readBits(5); // initial_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // au_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // dpb_output_delay_length_minus1\n }\n }\n for (let i = 0; i <= maxNumSubLayersMinus1; i++) {\n const fixed_pic_rate_general_flag = bitstream.readBits(1) === 1;\n let fixed_pic_rate_within_cvs_flag = true; // Default assumption if general is true\n if (!fixed_pic_rate_general_flag) {\n fixed_pic_rate_within_cvs_flag = bitstream.readBits(1) === 1;\n }\n let low_delay_hrd_flag = false; // Default assumption\n if (fixed_pic_rate_within_cvs_flag) {\n readExpGolomb(bitstream); // elemental_duration_in_tc_minus1[i]\n }\n else {\n low_delay_hrd_flag = bitstream.readBits(1) === 1;\n }\n let CpbCnt = 1; // Default if low_delay is true\n if (!low_delay_hrd_flag) {\n const cpb_cnt_minus1 = readExpGolomb(bitstream); // cpb_cnt_minus1[i]\n CpbCnt = cpb_cnt_minus1 + 1;\n }\n if (nal_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n if (vcl_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n }\n};\nconst skipSubLayerHrdParameters = (bitstream, CpbCnt, sub_pic_hrd_params_present_flag) => {\n for (let i = 0; i < CpbCnt; i++) {\n readExpGolomb(bitstream); // bit_rate_value_minus1[i]\n readExpGolomb(bitstream); // cpb_size_value_minus1[i]\n if (sub_pic_hrd_params_present_flag) {\n readExpGolomb(bitstream); // cpb_size_du_value_minus1[i]\n readExpGolomb(bitstream); // bit_rate_du_value_minus1[i]\n }\n bitstream.readBits(1); // cbr_flag[i]\n }\n};\n/** Serializes an HevcDecoderConfigurationRecord into the format specified in Section 8.3.3.1 of ISO 14496-15. */\nexport const serializeHevcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n bytes.push(record.configurationVersion);\n bytes.push(((record.generalProfileSpace & 0x3) << 6)\n | ((record.generalTierFlag & 0x1) << 5)\n | (record.generalProfileIdc & 0x1F));\n bytes.push((record.generalProfileCompatibilityFlags >>> 24) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 16) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 8) & 0xFF);\n bytes.push(record.generalProfileCompatibilityFlags & 0xFF);\n bytes.push(...record.generalConstraintIndicatorFlags);\n bytes.push(record.generalLevelIdc & 0xFF);\n bytes.push(0xF0 | ((record.minSpatialSegmentationIdc >> 8) & 0x0F)); // Reserved + high nibble\n bytes.push(record.minSpatialSegmentationIdc & 0xFF); // Low byte\n bytes.push(0xFC | (record.parallelismType & 0x03));\n bytes.push(0xFC | (record.chromaFormatIdc & 0x03));\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07));\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07));\n bytes.push((record.avgFrameRate >> 8) & 0xFF); // High byte\n bytes.push(record.avgFrameRate & 0xFF); // Low byte\n bytes.push(((record.constantFrameRate & 0x03) << 6)\n | ((record.numTemporalLayers & 0x07) << 3)\n | ((record.temporalIdNested & 0x01) << 2)\n | (record.lengthSizeMinusOne & 0x03));\n bytes.push(record.arrays.length & 0xFF);\n for (const arr of record.arrays) {\n bytes.push(((arr.arrayCompleteness & 0x01) << 7)\n | (0 << 6)\n | (arr.nalUnitType & 0x3F));\n bytes.push((arr.nalUnits.length >> 8) & 0xFF); // High byte\n bytes.push(arr.nalUnits.length & 0xFF); // Low byte\n for (const nal of arr.nalUnits) {\n bytes.push((nal.length >> 8) & 0xFF); // High byte\n bytes.push(nal.length & 0xFF); // Low byte\n for (let i = 0; i < nal.length; i++) {\n bytes.push(nal[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\nexport const extractVp9CodecInfoFromPacket = (packet) => {\n // eslint-disable-next-line @stylistic/max-len\n // https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf\n // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf\n const bitstream = new Bitstream(packet);\n // Frame marker (0b10)\n const frameMarker = bitstream.readBits(2);\n if (frameMarker !== 2) {\n return null;\n }\n // Profile\n const profileLowBit = bitstream.readBits(1);\n const profileHighBit = bitstream.readBits(1);\n const profile = (profileHighBit << 1) + profileLowBit;\n // Skip reserved bit for profile 3\n if (profile === 3) {\n bitstream.skipBits(1);\n }\n // show_existing_frame\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame === 1) {\n return null;\n }\n // frame_type (0 = key frame)\n const frameType = bitstream.readBits(1);\n if (frameType !== 0) {\n return null;\n }\n // Skip show_frame and error_resilient_mode\n bitstream.skipBits(2);\n // Sync code (0x498342)\n const syncCode = bitstream.readBits(24);\n if (syncCode !== 0x498342) {\n return null;\n }\n // Color config\n let bitDepth = 8;\n if (profile >= 2) {\n const tenOrTwelveBit = bitstream.readBits(1);\n bitDepth = tenOrTwelveBit ? 12 : 10;\n }\n // Color space\n const colorSpace = bitstream.readBits(3);\n let chromaSubsampling = 0;\n let videoFullRangeFlag = 0;\n if (colorSpace !== 7) { // 7 is CS_RGB\n const colorRange = bitstream.readBits(1);\n videoFullRangeFlag = colorRange;\n if (profile === 1 || profile === 3) {\n const subsamplingX = bitstream.readBits(1);\n const subsamplingY = bitstream.readBits(1);\n // 0 = 4:2:0 vertical\n // 1 = 4:2:0 colocated\n // 2 = 4:2:2\n // 3 = 4:4:4\n chromaSubsampling = !subsamplingX && !subsamplingY\n ? 3 // 0,0 = 4:4:4\n : subsamplingX && !subsamplingY\n ? 2 // 1,0 = 4:2:2\n : 1; // 1,1 = 4:2:0 colocated (default)\n // Skip reserved bit\n bitstream.skipBits(1);\n }\n else {\n // For profile 0 and 2, always 4:2:0\n chromaSubsampling = 1; // Using colocated as default\n }\n }\n else {\n // RGB is always 4:4:4\n chromaSubsampling = 3;\n videoFullRangeFlag = 1;\n }\n // Parse frame size\n const widthMinusOne = bitstream.readBits(16);\n const heightMinusOne = bitstream.readBits(16);\n const width = widthMinusOne + 1;\n const height = heightMinusOne + 1;\n // Calculate level based on dimensions\n const pictureSize = width * height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // Map color_space to standard values\n const matrixCoefficients = colorSpace === 7\n ? 0\n : colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const colourPrimaries = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const transferCharacteristics = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n return {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n};\n/** Iterates over all OBUs in an AV1 packet bistream. */\nexport const iterateAv1PacketObus = function* (packet) {\n // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitstream = new Bitstream(packet);\n const readLeb128 = () => {\n let value = 0;\n for (let i = 0; i < 8; i++) {\n const byte = bitstream.readAlignedByte();\n value |= ((byte & 0x7f) << (i * 7));\n if (!(byte & 0x80)) {\n break;\n }\n // Spec requirement\n if (i === 7 && (byte & 0x80)) {\n return null;\n }\n }\n // Spec requirement\n if (value >= 2 ** 32 - 1) {\n return null;\n }\n return value;\n };\n while (bitstream.getBitsLeft() >= 8) {\n // Parse OBU header\n bitstream.skipBits(1);\n const obuType = bitstream.readBits(4);\n const obuExtension = bitstream.readBits(1);\n const obuHasSizeField = bitstream.readBits(1);\n bitstream.skipBits(1);\n // Skip extension header if present\n if (obuExtension) {\n bitstream.skipBits(8);\n }\n // Read OBU size if present\n let obuSize;\n if (obuHasSizeField) {\n const obuSizeValue = readLeb128();\n if (obuSizeValue === null)\n return; // It was invalid\n obuSize = obuSizeValue;\n }\n else {\n // Calculate remaining bits and convert to bytes, rounding down\n obuSize = Math.floor(bitstream.getBitsLeft() / 8);\n }\n assert(bitstream.pos % 8 === 0);\n yield {\n type: obuType,\n data: packet.subarray(bitstream.pos / 8, bitstream.pos / 8 + obuSize),\n };\n // Move to next OBU\n bitstream.skipBits(obuSize * 8);\n }\n};\n/**\n * When AV1 codec information is not provided by the container, we can still try to extract the information by digging\n * into the AV1 bitstream.\n */\nexport const extractAv1CodecInfoFromPacket = (packet) => {\n // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n for (const { type, data } of iterateAv1PacketObus(packet)) {\n if (type !== 1) {\n continue; // 1 == OBU_SEQUENCE_HEADER\n }\n const bitstream = new Bitstream(data);\n // Read sequence header fields\n const seqProfile = bitstream.readBits(3);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const stillPicture = bitstream.readBits(1);\n const reducedStillPictureHeader = bitstream.readBits(1);\n let seqLevel = 0;\n let seqTier = 0;\n let bufferDelayLengthMinus1 = 0;\n if (reducedStillPictureHeader) {\n seqLevel = bitstream.readBits(5);\n }\n else {\n // Parse timing_info_present_flag\n const timingInfoPresentFlag = bitstream.readBits(1);\n if (timingInfoPresentFlag) {\n // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval)\n bitstream.skipBits(32); // num_units_in_display_tick\n bitstream.skipBits(32); // time_scale\n const equalPictureInterval = bitstream.readBits(1);\n if (equalPictureInterval) {\n // Skip num_ticks_per_picture_minus_1 (uvlc)\n // Since this is variable length, we'd need to implement uvlc reading\n // For now, we'll return null as this is rare\n return null;\n }\n }\n // Parse decoder_model_info_present_flag\n const decoderModelInfoPresentFlag = bitstream.readBits(1);\n if (decoderModelInfoPresentFlag) {\n // Store buffer_delay_length_minus_1 instead of just skipping\n bufferDelayLengthMinus1 = bitstream.readBits(5);\n bitstream.skipBits(32); // num_units_in_decoding_tick\n bitstream.skipBits(5); // buffer_removal_time_length_minus_1\n bitstream.skipBits(5); // frame_presentation_time_length_minus_1\n }\n // Parse operating_points_cnt_minus_1\n const operatingPointsCntMinus1 = bitstream.readBits(5);\n // For each operating point\n for (let i = 0; i <= operatingPointsCntMinus1; i++) {\n // operating_point_idc[i]\n bitstream.skipBits(12);\n // seq_level_idx[i]\n const seqLevelIdx = bitstream.readBits(5);\n if (i === 0) {\n seqLevel = seqLevelIdx;\n }\n if (seqLevelIdx > 7) {\n // seq_tier[i]\n const seqTierTemp = bitstream.readBits(1);\n if (i === 0) {\n seqTier = seqTierTemp;\n }\n }\n if (decoderModelInfoPresentFlag) {\n // decoder_model_present_for_this_op[i]\n const decoderModelPresentForThisOp = bitstream.readBits(1);\n if (decoderModelPresentForThisOp) {\n const n = bufferDelayLengthMinus1 + 1;\n bitstream.skipBits(n); // decoder_buffer_delay[op]\n bitstream.skipBits(n); // encoder_buffer_delay[op]\n bitstream.skipBits(1); // low_delay_mode_flag[op]\n }\n }\n // initial_display_delay_present_flag\n const initialDisplayDelayPresentFlag = bitstream.readBits(1);\n if (initialDisplayDelayPresentFlag) {\n // initial_display_delay_minus_1[i]\n bitstream.skipBits(4);\n }\n }\n }\n // Frame size\n const frameWidthBitsMinus1 = bitstream.readBits(4);\n const frameHeightBitsMinus1 = bitstream.readBits(4);\n const n1 = frameWidthBitsMinus1 + 1;\n bitstream.skipBits(n1); // max_frame_width_minus_1\n const n2 = frameHeightBitsMinus1 + 1;\n bitstream.skipBits(n2); // max_frame_height_minus_1\n // Frame IDs\n let frameIdNumbersPresentFlag = 0;\n if (reducedStillPictureHeader) {\n frameIdNumbersPresentFlag = 0;\n }\n else {\n frameIdNumbersPresentFlag = bitstream.readBits(1);\n }\n if (frameIdNumbersPresentFlag) {\n bitstream.skipBits(4); // delta_frame_id_length_minus_2\n bitstream.skipBits(3); // additional_frame_id_length_minus_1\n }\n bitstream.skipBits(1); // use_128x128_superblock\n bitstream.skipBits(1); // enable_filter_intra\n bitstream.skipBits(1); // enable_intra_edge_filter\n if (!reducedStillPictureHeader) {\n bitstream.skipBits(1); // enable_interintra_compound\n bitstream.skipBits(1); // enable_masked_compound\n bitstream.skipBits(1); // enable_warped_motion\n bitstream.skipBits(1); // enable_dual_filter\n const enableOrderHint = bitstream.readBits(1);\n if (enableOrderHint) {\n bitstream.skipBits(1); // enable_jnt_comp\n bitstream.skipBits(1); // enable_ref_frame_mvs\n }\n const seqChooseScreenContentTools = bitstream.readBits(1);\n let seqForceScreenContentTools = 0;\n if (seqChooseScreenContentTools) {\n seqForceScreenContentTools = 2; // SELECT_SCREEN_CONTENT_TOOLS\n }\n else {\n seqForceScreenContentTools = bitstream.readBits(1);\n }\n if (seqForceScreenContentTools > 0) {\n const seqChooseIntegerMv = bitstream.readBits(1);\n if (!seqChooseIntegerMv) {\n bitstream.skipBits(1); // seq_force_integer_mv\n }\n }\n if (enableOrderHint) {\n bitstream.skipBits(3); // order_hint_bits_minus_1\n }\n }\n bitstream.skipBits(1); // enable_superres\n bitstream.skipBits(1); // enable_cdef\n bitstream.skipBits(1); // enable_restoration\n // color_config()\n const highBitdepth = bitstream.readBits(1);\n let bitDepth = 8;\n if (seqProfile === 2 && highBitdepth) {\n const twelveBit = bitstream.readBits(1);\n bitDepth = twelveBit ? 12 : 10;\n }\n else if (seqProfile <= 2) {\n bitDepth = highBitdepth ? 10 : 8;\n }\n let monochrome = 0;\n if (seqProfile !== 1) {\n monochrome = bitstream.readBits(1);\n }\n let chromaSubsamplingX = 1;\n let chromaSubsamplingY = 1;\n let chromaSamplePosition = 0;\n if (!monochrome) {\n if (seqProfile === 0) {\n chromaSubsamplingX = 1;\n chromaSubsamplingY = 1;\n }\n else if (seqProfile === 1) {\n chromaSubsamplingX = 0;\n chromaSubsamplingY = 0;\n }\n else {\n if (bitDepth === 12) {\n chromaSubsamplingX = bitstream.readBits(1);\n if (chromaSubsamplingX) {\n chromaSubsamplingY = bitstream.readBits(1);\n }\n }\n }\n if (chromaSubsamplingX && chromaSubsamplingY) {\n chromaSamplePosition = bitstream.readBits(2);\n }\n }\n return {\n profile: seqProfile,\n level: seqLevel,\n tier: seqTier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n return null;\n};\nexport const parseOpusIdentificationHeader = (bytes) => {\n const view = toDataView(bytes);\n const outputChannelCount = view.getUint8(9);\n const preSkip = view.getUint16(10, true);\n const inputSampleRate = view.getUint32(12, true);\n const outputGain = view.getInt16(16, true);\n const channelMappingFamily = view.getUint8(18);\n let channelMappingTable = null;\n if (channelMappingFamily) {\n channelMappingTable = bytes.subarray(19, 19 + 2 + outputChannelCount);\n }\n return {\n outputChannelCount,\n preSkip,\n inputSampleRate,\n outputGain,\n channelMappingFamily,\n channelMappingTable,\n };\n};\n// From https://datatracker.ietf.org/doc/html/rfc6716, in 48 kHz samples\nconst OPUS_FRAME_DURATION_TABLE = [\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960,\n 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n];\nexport const parseOpusTocByte = (packet) => {\n const config = packet[0] >> 3;\n return {\n durationInSamples: OPUS_FRAME_DURATION_TABLE[config],\n };\n};\n// Based on vorbis_parser.c from FFmpeg.\nexport const parseModesFromVorbisSetupPacket = (setupHeader) => {\n // Verify that this is a Setup header.\n if (setupHeader.length < 7) {\n throw new Error('Setup header is too short.');\n }\n if (setupHeader[0] !== 5) {\n throw new Error('Wrong packet type in Setup header.');\n }\n const signature = String.fromCharCode(...setupHeader.slice(1, 7));\n if (signature !== 'vorbis') {\n throw new Error('Invalid packet signature in Setup header.');\n }\n // Reverse the entire buffer.\n const bufSize = setupHeader.length;\n const revBuffer = new Uint8Array(bufSize);\n for (let i = 0; i < bufSize; i++) {\n revBuffer[i] = setupHeader[bufSize - 1 - i];\n }\n // Initialize a Bitstream on the reversed buffer.\n const bitstream = new Bitstream(revBuffer);\n // --- Find the framing bit.\n // In FFmpeg code, we scan until get_bits1() returns 1.\n let gotFramingBit = 0;\n while (bitstream.getBitsLeft() > 97) {\n if (bitstream.readBits(1) === 1) {\n gotFramingBit = bitstream.pos;\n break;\n }\n }\n if (gotFramingBit === 0) {\n throw new Error('Invalid Setup header: framing bit not found.');\n }\n // --- Search backwards for a valid mode header.\n // We try to “guess” the number of modes by reading a fixed pattern.\n let modeCount = 0;\n let gotModeHeader = false;\n let lastModeCount = 0;\n while (bitstream.getBitsLeft() >= 97) {\n const tempPos = bitstream.pos;\n const a = bitstream.readBits(8);\n const b = bitstream.readBits(16);\n const c = bitstream.readBits(16);\n // If a > 63 or b or c nonzero, assume we’ve gone too far.\n if (a > 63 || b !== 0 || c !== 0) {\n bitstream.pos = tempPos;\n break;\n }\n bitstream.skipBits(1);\n modeCount++;\n if (modeCount > 64) {\n break;\n }\n const bsClone = bitstream.clone();\n const candidate = bsClone.readBits(6) + 1;\n if (candidate === modeCount) {\n gotModeHeader = true;\n lastModeCount = modeCount;\n }\n }\n if (!gotModeHeader) {\n throw new Error('Invalid Setup header: mode header not found.');\n }\n if (lastModeCount > 63) {\n throw new Error(`Unsupported mode count: ${lastModeCount}.`);\n }\n const finalModeCount = lastModeCount;\n // --- Reinitialize the bitstream.\n bitstream.pos = 0;\n // Skip the bits up to the found framing bit.\n bitstream.skipBits(gotFramingBit);\n // --- Now read, for each mode (in reverse order), 40 bits then one bit.\n // That one bit is the mode blockflag.\n const modeBlockflags = Array(finalModeCount).fill(0);\n for (let i = finalModeCount - 1; i >= 0; i--) {\n bitstream.skipBits(40);\n modeBlockflags[i] = bitstream.readBits(1);\n }\n return { modeBlockflags };\n};\n/** Determines a packet's type (key or delta) by digging into the packet bitstream. */\nexport const determineVideoPacketType = (codec, decoderConfig, packetData) => {\n switch (codec) {\n case 'avc':\n {\n const nalUnits = extractAvcNalUnits(packetData, decoderConfig);\n let isKeyframe = nalUnits.some(x => extractNalUnitTypeForAvc(x) === AvcNalUnitType.IDR);\n if (!isKeyframe && (!isChromium() || getChromiumVersion() >= 144)) {\n // In addition to IDR, Recovery Point SEI also counts as a valid H.264 keyframe by current consensus.\n // See https://github.com/w3c/webcodecs/issues/650 for the relevant discussion. WebKit and Firefox have\n // always supported them, but Chromium hasn't, therefore the (admittedly dirty) version check.\n for (const nalUnit of nalUnits) {\n const type = extractNalUnitTypeForAvc(nalUnit);\n if (type !== AvcNalUnitType.SEI) {\n continue;\n }\n const bytes = removeEmulationPreventionBytes(nalUnit);\n let pos = 1; // Skip NALU header\n // sei_rbsp()\n do {\n // sei_message()\n let payloadType = 0;\n while (true) {\n const nextByte = bytes[pos++];\n if (nextByte === undefined)\n break;\n payloadType += nextByte;\n if (nextByte < 255) {\n break;\n }\n }\n let payloadSize = 0;\n while (true) {\n const nextByte = bytes[pos++];\n if (nextByte === undefined)\n break;\n payloadSize += nextByte;\n if (nextByte < 255) {\n break;\n }\n }\n // sei_payload()\n const PAYLOAD_TYPE_RECOVERY_POINT = 6;\n if (payloadType === PAYLOAD_TYPE_RECOVERY_POINT) {\n const bitstream = new Bitstream(bytes);\n bitstream.pos = 8 * pos;\n const recoveryFrameCount = readExpGolomb(bitstream);\n const exactMatchFlag = bitstream.readBits(1);\n if (recoveryFrameCount === 0 && exactMatchFlag === 1) {\n // https://github.com/w3c/webcodecs/pull/910\n // \"recovery_frame_cnt == 0 and exact_match_flag=1 in the SEI recovery payload\"\n isKeyframe = true;\n break;\n }\n }\n pos += payloadSize;\n } while (pos < bytes.length - 1);\n }\n }\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'hevc':\n {\n const nalUnits = extractHevcNalUnits(packetData, decoderConfig);\n const isKeyframe = nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return HevcNalUnitType.BLA_W_LP <= type && type <= HevcNalUnitType.RSV_IRAP_VCL23;\n });\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'vp8':\n {\n // VP8, once again, by far the easiest to deal with.\n const frameType = packetData[0] & 0b1;\n return frameType === 0 ? 'key' : 'delta';\n }\n ;\n case 'vp9':\n {\n const bitstream = new Bitstream(packetData);\n if (bitstream.readBits(2) !== 2) {\n return null;\n }\n ;\n const profileLowBit = bitstream.readBits(1);\n const profileHighBit = bitstream.readBits(1);\n const profile = (profileHighBit << 1) + profileLowBit;\n // Skip reserved bit for profile 3\n if (profile === 3) {\n bitstream.skipBits(1);\n }\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame) {\n return null;\n }\n const frameType = bitstream.readBits(1);\n return frameType === 0 ? 'key' : 'delta';\n }\n ;\n case 'av1':\n {\n let reducedStillPictureHeader = false;\n for (const { type, data } of iterateAv1PacketObus(packetData)) {\n if (type === 1) { // OBU_SEQUENCE_HEADER\n const bitstream = new Bitstream(data);\n bitstream.skipBits(4);\n reducedStillPictureHeader = !!bitstream.readBits(1);\n }\n else if (type === 3 // OBU_FRAME_HEADER\n || type === 6 // OBU_FRAME\n || type === 7 // OBU_REDUNDANT_FRAME_HEADER\n ) {\n if (reducedStillPictureHeader) {\n return 'key';\n }\n const bitstream = new Bitstream(data);\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame) {\n return null;\n }\n const frameType = bitstream.readBits(2);\n return frameType === 0 ? 'key' : 'delta';\n }\n }\n return null;\n }\n ;\n default:\n {\n assertNever(codec);\n assert(false);\n }\n ;\n }\n};\nexport var FlacBlockType;\n(function (FlacBlockType) {\n FlacBlockType[FlacBlockType[\"STREAMINFO\"] = 0] = \"STREAMINFO\";\n FlacBlockType[FlacBlockType[\"VORBIS_COMMENT\"] = 4] = \"VORBIS_COMMENT\";\n FlacBlockType[FlacBlockType[\"PICTURE\"] = 6] = \"PICTURE\";\n})(FlacBlockType || (FlacBlockType = {}));\nexport const readVorbisComments = (bytes, metadataTags) => {\n // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2\n const commentView = toDataView(bytes);\n let commentPos = 0;\n const vendorStringLength = commentView.getUint32(commentPos, true);\n commentPos += 4;\n const vendorString = textDecoder.decode(bytes.subarray(commentPos, commentPos + vendorStringLength));\n commentPos += vendorStringLength;\n if (vendorStringLength > 0) {\n // Expose the vendor string in the raw metadata\n metadataTags.raw ??= {};\n metadataTags.raw['vendor'] ??= vendorString;\n }\n const listLength = commentView.getUint32(commentPos, true);\n commentPos += 4;\n // Loop over all metadata tags\n for (let i = 0; i < listLength; i++) {\n const stringLength = commentView.getUint32(commentPos, true);\n commentPos += 4;\n const string = textDecoder.decode(bytes.subarray(commentPos, commentPos + stringLength));\n commentPos += stringLength;\n const separatorIndex = string.indexOf('=');\n if (separatorIndex === -1) {\n continue;\n }\n const key = string.slice(0, separatorIndex).toUpperCase();\n const value = string.slice(separatorIndex + 1);\n metadataTags.raw ??= {};\n metadataTags.raw[key] ??= value;\n switch (key) {\n case 'TITLE':\n {\n metadataTags.title ??= value;\n }\n ;\n break;\n case 'DESCRIPTION':\n {\n metadataTags.description ??= value;\n }\n ;\n break;\n case 'ARTIST':\n {\n metadataTags.artist ??= value;\n }\n ;\n break;\n case 'ALBUM':\n {\n metadataTags.album ??= value;\n }\n ;\n break;\n case 'ALBUMARTIST':\n {\n metadataTags.albumArtist ??= value;\n }\n ;\n break;\n case 'COMMENT':\n {\n metadataTags.comment ??= value;\n }\n ;\n break;\n case 'LYRICS':\n {\n metadataTags.lyrics ??= value;\n }\n ;\n break;\n case 'TRACKNUMBER':\n {\n const parts = value.split('/');\n const trackNum = Number.parseInt(parts[0], 10);\n const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(trackNum) && trackNum > 0) {\n metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'TRACKTOTAL':\n {\n const tracksTotal = Number.parseInt(value, 10);\n if (Number.isInteger(tracksTotal) && tracksTotal > 0) {\n metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'DISCNUMBER':\n {\n const parts = value.split('/');\n const discNum = Number.parseInt(parts[0], 10);\n const discsTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(discNum) && discNum > 0) {\n metadataTags.discNumber ??= discNum;\n }\n if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n metadataTags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n case 'DISCTOTAL':\n {\n const discsTotal = Number.parseInt(value, 10);\n if (Number.isInteger(discsTotal) && discsTotal > 0) {\n metadataTags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n case 'DATE':\n {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n metadataTags.date ??= date;\n }\n }\n ;\n break;\n case 'GENRE':\n {\n metadataTags.genre ??= value;\n }\n ;\n break;\n case 'METADATA_BLOCK_PICTURE':\n {\n // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8\n const decoded = base64ToBytes(value);\n const view = toDataView(decoded);\n const pictureType = view.getUint32(0, false);\n const mediaTypeLength = view.getUint32(4, false);\n const mediaType = String.fromCharCode(...decoded.subarray(8, 8 + mediaTypeLength)); // ASCII\n const descriptionLength = view.getUint32(8 + mediaTypeLength, false);\n const description = textDecoder.decode(decoded.subarray(12 + mediaTypeLength, 12 + mediaTypeLength + descriptionLength));\n const dataLength = view.getUint32(mediaTypeLength + descriptionLength + 28);\n const data = decoded.subarray(mediaTypeLength + descriptionLength + 32, mediaTypeLength + descriptionLength + 32 + dataLength);\n metadataTags.images ??= [];\n metadataTags.images.push({\n data,\n mimeType: mediaType,\n kind: pictureType === 3 ? 'coverFront' : pictureType === 4 ? 'coverBack' : 'unknown',\n name: undefined,\n description: description || undefined,\n });\n }\n ;\n break;\n }\n }\n};\nexport const createVorbisComments = (headerBytes, tags, writeImages) => {\n // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2\n const commentHeaderParts = [\n headerBytes,\n ];\n const vendorString = 'Mediabunny';\n const encodedVendorString = textEncoder.encode(vendorString);\n let currentBuffer = new Uint8Array(4 + encodedVendorString.length);\n let currentView = new DataView(currentBuffer.buffer);\n currentView.setUint32(0, encodedVendorString.length, true);\n currentBuffer.set(encodedVendorString, 4);\n commentHeaderParts.push(currentBuffer);\n const writtenTags = new Set();\n const addCommentTag = (key, value) => {\n const joined = `${key}=${value}`;\n const encoded = textEncoder.encode(joined);\n currentBuffer = new Uint8Array(4 + encoded.length);\n currentView = new DataView(currentBuffer.buffer);\n currentView.setUint32(0, encoded.length, true);\n currentBuffer.set(encoded, 4);\n commentHeaderParts.push(currentBuffer);\n writtenTags.add(key);\n };\n for (const { key, value } of keyValueIterator(tags)) {\n switch (key) {\n case 'title':\n {\n addCommentTag('TITLE', value);\n }\n ;\n break;\n case 'description':\n {\n addCommentTag('DESCRIPTION', value);\n }\n ;\n break;\n case 'artist':\n {\n addCommentTag('ARTIST', value);\n }\n ;\n break;\n case 'album':\n {\n addCommentTag('ALBUM', value);\n }\n ;\n break;\n case 'albumArtist':\n {\n addCommentTag('ALBUMARTIST', value);\n }\n ;\n break;\n case 'genre':\n {\n addCommentTag('GENRE', value);\n }\n ;\n break;\n case 'date':\n {\n const rawVersion = tags.raw?.['DATE'] ?? tags.raw?.['date'];\n if (rawVersion && typeof rawVersion === 'string') {\n addCommentTag('DATE', rawVersion);\n }\n else {\n addCommentTag('DATE', value.toISOString().slice(0, 10));\n }\n }\n ;\n break;\n case 'comment':\n {\n addCommentTag('COMMENT', value);\n }\n ;\n break;\n case 'lyrics':\n {\n addCommentTag('LYRICS', value);\n }\n ;\n break;\n case 'trackNumber':\n {\n addCommentTag('TRACKNUMBER', value.toString());\n }\n ;\n break;\n case 'tracksTotal':\n {\n addCommentTag('TRACKTOTAL', value.toString());\n }\n ;\n break;\n case 'discNumber':\n {\n addCommentTag('DISCNUMBER', value.toString());\n }\n ;\n break;\n case 'discsTotal':\n {\n addCommentTag('DISCTOTAL', value.toString());\n }\n ;\n break;\n case 'images':\n {\n // For example, in .flac, we put the pictures in a different section,\n // not in the Vorbis comment header.\n if (!writeImages) {\n break;\n }\n for (const image of value) {\n // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8\n const pictureType = image.kind === 'coverFront' ? 3 : image.kind === 'coverBack' ? 4 : 0;\n const encodedMediaType = new Uint8Array(image.mimeType.length);\n for (let i = 0; i < image.mimeType.length; i++) {\n encodedMediaType[i] = image.mimeType.charCodeAt(i);\n }\n const encodedDescription = textEncoder.encode(image.description ?? '');\n const buffer = new Uint8Array(4 // Picture type\n + 4 // MIME type length\n + encodedMediaType.length // MIME type\n + 4 // Description length\n + encodedDescription.length // Description\n + 16 // Width, height, color depth, number of colors\n + 4 // Picture data length\n + image.data.length);\n const view = toDataView(buffer);\n view.setUint32(0, pictureType, false);\n view.setUint32(4, encodedMediaType.length, false);\n buffer.set(encodedMediaType, 8);\n view.setUint32(8 + encodedMediaType.length, encodedDescription.length, false);\n buffer.set(encodedDescription, 12 + encodedMediaType.length);\n // Skip a bunch of fields (width, height, color depth, number of colors)\n view.setUint32(28 + encodedMediaType.length + encodedDescription.length, image.data.length, false);\n buffer.set(image.data, 32 + encodedMediaType.length + encodedDescription.length);\n const encoded = bytesToBase64(buffer);\n addCommentTag('METADATA_BLOCK_PICTURE', encoded);\n }\n }\n ;\n break;\n case 'raw':\n {\n // Handled later\n }\n ;\n break;\n default: assertNever(key);\n }\n }\n if (tags.raw) {\n for (const key in tags.raw) {\n const value = tags.raw[key] ?? tags.raw[key.toLowerCase()];\n if (key === 'vendor' || value == null || writtenTags.has(key)) {\n continue;\n }\n if (typeof value === 'string') {\n addCommentTag(key, value);\n }\n }\n }\n const listLengthBuffer = new Uint8Array(4);\n toDataView(listLengthBuffer).setUint32(0, writtenTags.size, true);\n commentHeaderParts.splice(2, 0, listLengthBuffer); // Insert after the header and vendor section\n // Merge all comment header parts into a single buffer\n const commentHeaderLength = commentHeaderParts.reduce((a, b) => a + b.length, 0);\n const commentHeader = new Uint8Array(commentHeaderLength);\n let pos = 0;\n for (const part of commentHeaderParts) {\n commentHeader.set(part, pos);\n pos += part.length;\n }\n return commentHeader;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class Demuxer {\n constructor(input) {\n this.input = input;\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { determineVideoPacketType } from './codec-data.js';\nimport { customAudioDecoders, customVideoDecoders } from './custom-coder.js';\nimport { EncodedPacketSink } from './media-sink.js';\nimport { assert } from './misc.js';\nimport { EncodedPacket } from './packet.js';\n/**\n * Represents a media track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputTrack {\n /** @internal */\n constructor(input, backing) {\n this.input = input;\n this._backing = backing;\n }\n /** Returns true if and only if this track is a video track. */\n isVideoTrack() {\n return this instanceof InputVideoTrack;\n }\n /** Returns true if and only if this track is an audio track. */\n isAudioTrack() {\n return this instanceof InputAudioTrack;\n }\n /** The unique ID of this track in the input file. */\n get id() {\n return this._backing.getId();\n }\n /**\n * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny\n * and depends entirely on the container format.\n *\n * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec.\n *\n * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`).\n * - For Matroska files, this field returns the value of the `CodecID` element.\n * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk.\n * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`.\n * - In all other cases, this field is `null`.\n */\n get internalCodecId() {\n return this._backing.getInternalCodecId();\n }\n /**\n * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined).\n */\n get languageCode() {\n return this._backing.getLanguageCode();\n }\n /** A user-defined name for this track. */\n get name() {\n return this._backing.getName();\n }\n /**\n * A positive number x such that all timestamps and durations of all packets of this track are\n * integer multiples of 1/x.\n */\n get timeResolution() {\n return this._backing.getTimeResolution();\n }\n /** The track's disposition, i.e. information about its intended usage. */\n get disposition() {\n return this._backing.getDisposition();\n }\n /**\n * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value\n * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples\n * with a negative timestamp should not be presented.\n */\n getFirstTimestamp() {\n return this._backing.getFirstTimestamp();\n }\n /** Returns the end timestamp of the last packet of this track, in seconds. */\n computeDuration() {\n return this._backing.computeDuration();\n }\n /**\n * Computes aggregate packet statistics for this track, such as average packet rate or bitrate.\n *\n * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have\n * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all\n * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the\n * entire file.\n */\n async computePacketStats(targetPacketCount = Infinity) {\n const sink = new EncodedPacketSink(this);\n let startTimestamp = Infinity;\n let endTimestamp = -Infinity;\n let packetCount = 0;\n let totalPacketBytes = 0;\n for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true })) {\n if (packetCount >= targetPacketCount\n // This additional condition is needed to produce correct results with out-of-presentation-order packets\n && packet.timestamp >= endTimestamp) {\n break;\n }\n startTimestamp = Math.min(startTimestamp, packet.timestamp);\n endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);\n packetCount++;\n totalPacketBytes += packet.byteLength;\n }\n return {\n packetCount,\n averagePacketRate: packetCount\n ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n averageBitrate: packetCount\n ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n };\n }\n}\n/**\n * Represents a video track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputVideoTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'video';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The width in pixels of the track's coded samples, before any transformations or rotations. */\n get codedWidth() {\n return this._backing.getCodedWidth();\n }\n /** The height in pixels of the track's coded samples, before any transformations or rotations. */\n get codedHeight() {\n return this._backing.getCodedHeight();\n }\n /** The angle in degrees by which the track's frames should be rotated (clockwise). */\n get rotation() {\n return this._backing.getRotation();\n }\n /** The width in pixels of the track's frames after rotation. */\n get displayWidth() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight();\n }\n /** The height in pixels of the track's frames after rotation. */\n get displayHeight() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth();\n }\n /** Returns the color space of the track's samples. */\n getColorSpace() {\n return this._backing.getColorSpace();\n }\n /** If this method returns true, the track's samples use a high dynamic range (HDR). */\n async hasHighDynamicRange() {\n const colorSpace = await this._backing.getColorSpace();\n return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432'\n || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg'\n || colorSpace.matrix === 'bt2020-ncl';\n }\n /** Checks if this track may contain transparent samples with alpha data. */\n canBeTransparent() {\n return this._backing.canBeTransparent();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the\n * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (typeof VideoDecoder === 'undefined') {\n return false;\n }\n const support = await VideoDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (packet.isMetadataOnly) {\n throw new TypeError('packet must not be metadata-only to determine its type.');\n }\n if (this.codec === null) {\n return null;\n }\n const decoderConfig = await this.getDecoderConfig();\n assert(decoderConfig);\n return determineVideoPacketType(this.codec, decoderConfig, packet.data);\n }\n}\n/**\n * Represents an audio track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputAudioTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'audio';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The number of audio channels in the track. */\n get numberOfChannels() {\n return this._backing.getNumberOfChannels();\n }\n /** The track's audio sample rate in hertz. */\n get sampleRate() {\n return this._backing.getSampleRate();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the\n * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (decoderConfig.codec.startsWith('pcm-')) {\n return true; // Since we decode it ourselves\n }\n else {\n if (typeof AudioDecoder === 'undefined') {\n return false;\n }\n const support = await AudioDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (this.codec === null) {\n return null;\n }\n return 'key'; // No audio codec with delta packets\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/**\n * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomVideoDecoder {\n /** Returns true if and only if the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomAudioDecoder {\n /** Returns true if and only if the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomVideoEncoder {\n /** Returns true if and only if the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomAudioEncoder {\n /** Returns true if and only if the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\nexport const customVideoDecoders = [];\nexport const customAudioDecoders = [];\nexport const customVideoEncoders = [];\nexport const customAudioEncoders = [];\n/**\n * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever\n * possible.\n * @group Custom coders\n * @public\n */\nexport const registerDecoder = (decoder) => {\n if (decoder.prototype instanceof CustomVideoDecoder) {\n const casted = decoder;\n if (customVideoDecoders.includes(casted)) {\n console.warn('Video decoder already registered.');\n return;\n }\n customVideoDecoders.push(casted);\n }\n else if (decoder.prototype instanceof CustomAudioDecoder) {\n const casted = decoder;\n if (customAudioDecoders.includes(casted)) {\n console.warn('Audio decoder already registered.');\n return;\n }\n customAudioDecoders.push(casted);\n }\n else {\n throw new TypeError('Decoder must be a CustomVideoDecoder or CustomAudioDecoder.');\n }\n};\n/**\n * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever\n * possible.\n * @group Custom coders\n * @public\n */\nexport const registerEncoder = (encoder) => {\n if (encoder.prototype instanceof CustomVideoEncoder) {\n const casted = encoder;\n if (customVideoEncoders.includes(casted)) {\n console.warn('Video encoder already registered.');\n return;\n }\n customVideoEncoders.push(casted);\n }\n else if (encoder.prototype instanceof CustomAudioEncoder) {\n const casted = encoder;\n if (customAudioEncoders.includes(casted)) {\n console.warn('Audio encoder already registered.');\n return;\n }\n customAudioEncoders.push(casted);\n }\n else {\n throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n }\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parsePcmCodec, PCM_AUDIO_CODECS } from './codec.js';\nimport { deserializeAvcDecoderConfigurationRecord, determineVideoPacketType, extractHevcNalUnits, extractNalUnitTypeForHevc, HevcNalUnitType, parseAvcSps, } from './codec-data.js';\nimport { customVideoDecoders, customAudioDecoders } from './custom-coder.js';\nimport { InputDisposedError } from './input.js';\nimport { InputAudioTrack, InputTrack, InputVideoTrack } from './input-track.js';\nimport { assert, assertNever, CallSerializer, getInt24, getUint24, insertSorted, isChromium, isFirefox, isNumber, isWebKit, last, mapAsyncGenerator, promiseWithResolvers, toAsyncIterator, toDataView, toUint8Array, validateAnyIterable, } from './misc.js';\nimport { EncodedPacket } from './packet.js';\nimport { fromAlaw, fromUlaw } from './pcm.js';\nimport { AudioSample, clampCropRectangle, validateCropRectangle, VideoSample } from './sample.js';\nconst validatePacketRetrievalOptions = (options) => {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') {\n throw new TypeError('options.metadataOnly, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets !== undefined && typeof options.verifyKeyPackets !== 'boolean') {\n throw new TypeError('options.verifyKeyPackets, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets && options.metadataOnly) {\n throw new TypeError('options.verifyKeyPackets and options.metadataOnly cannot be enabled together.');\n }\n};\nconst validateTimestamp = (timestamp) => {\n if (!isNumber(timestamp)) {\n throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine\n }\n};\nconst maybeFixPacketType = (track, promise, options) => {\n if (options.verifyKeyPackets) {\n return promise.then(async (packet) => {\n if (!packet || packet.type === 'delta') {\n return packet;\n }\n const determinedType = await track.determinePacketType(packet);\n if (determinedType) {\n // @ts-expect-error Technically readonly\n packet.type = determinedType;\n }\n return packet;\n });\n }\n else {\n return promise;\n }\n};\n/**\n * Sink for retrieving encoded packets from an input track.\n * @group Media sinks\n * @public\n */\nexport class EncodedPacketSink {\n /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */\n constructor(track) {\n if (!(track instanceof InputTrack)) {\n throw new TypeError('track must be an InputTrack.');\n }\n this._track = track;\n }\n /**\n * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very\n * likely to be a key packet.\n */\n getFirstPacket(options = {}) {\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getFirstPacket(options), options);\n }\n /**\n * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet\n * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be\n * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp\n * is before the first packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getPacket(timestamp, options), options);\n }\n /**\n * Retrieves the packet following the given packet (in decode order), or null if the given packet is the\n * last packet.\n */\n getNextPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getNextPacket(packet, options), options);\n }\n /**\n * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last\n * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet\n * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's\n * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first\n * key packet in the track.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getKeyPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getKeyPacket(timestamp, options);\n }\n const packet = await this._track._backing.getKeyPacket(timestamp, options);\n if (!packet) {\n return packet;\n }\n assert(packet.type === 'key');\n const determinedType = await this._track.determinePacketType(packet);\n if (determinedType === 'delta') {\n // Try returning the previous key packet (in hopes that it's actually a key packet)\n return this.getKeyPacket(packet.timestamp - 1 / this._track.timeResolution, options);\n }\n return packet;\n }\n /**\n * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last\n * key packet.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n */\n async getNextKeyPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getNextKeyPacket(packet, options);\n }\n const nextPacket = await this._track._backing.getNextKeyPacket(packet, options);\n if (!nextPacket) {\n return nextPacket;\n }\n assert(nextPacket.type === 'key');\n const determinedType = await this._track.determinePacketType(nextPacket);\n if (determinedType === 'delta') {\n // Try returning the next key packet (in hopes that it's actually a key packet)\n return this.getNextKeyPacket(nextPacket, options);\n }\n return nextPacket;\n }\n /**\n * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this\n * method will intelligently preload packets based on the speed of the consumer.\n *\n * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded.\n * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded.\n */\n packets(startPacket, endPacket, options = {}) {\n if (startPacket !== undefined && !(startPacket instanceof EncodedPacket)) {\n throw new TypeError('startPacket must be an EncodedPacket.');\n }\n if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) {\n throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.');\n }\n if (endPacket !== undefined && !(endPacket instanceof EncodedPacket)) {\n throw new TypeError('endPacket must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n const packetQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const timestamps = [];\n // The queue should always be big enough to hold 1 second worth of packets\n const maxQueueSize = () => Math.max(2, timestamps.length);\n // The following is the \"pump\" process that keeps pumping packets into the queue\n (async () => {\n let packet = startPacket ?? await this.getFirstPacket(options);\n while (packet && !terminated && !this._track.input._disposed) {\n if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) {\n break;\n }\n if (packetQueue.length > maxQueueSize()) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n packetQueue.push(packet);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n packet = await this.getNextPacket(packet, options);\n }\n ended = true;\n onQueueNotEmpty();\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (packetQueue.length > 0) {\n const value = packetQueue.shift();\n const now = performance.now();\n timestamps.push(now);\n while (timestamps.length > 0 && now - timestamps[0] >= 1000) {\n timestamps.shift();\n }\n onQueueDequeue();\n return { value, done: false };\n }\n else if (ended) {\n return { value: undefined, done: true };\n }\n else {\n await queueNotEmpty;\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nclass DecoderWrapper {\n constructor(onSample, onError) {\n this.onSample = onSample;\n this.onError = onError;\n }\n}\n/**\n * Base class for decoded media sample sinks.\n * @group Media sinks\n * @public\n */\nexport class BaseMediaSampleSink {\n /** @internal */\n mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) {\n validateTimestamp(startTimestamp);\n validateTimestamp(endTimestamp);\n const sampleQueue = [];\n let firstSampleQueued = false;\n let lastSample = null;\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (sample.timestamp >= endTimestamp) {\n ended = true;\n }\n if (ended) {\n sample.close();\n return;\n }\n if (lastSample) {\n if (sample.timestamp > startTimestamp) {\n // We don't know ahead of time what the first first is. This is because the first first is the\n // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to\n // wait for the first first after the start timestamp, and then we'll know that the previous\n // first was the first first.\n sampleQueue.push(lastSample);\n firstSampleQueued = true;\n }\n else {\n lastSample.close();\n }\n }\n if (sample.timestamp >= startTimestamp) {\n sampleQueue.push(sample);\n firstSampleQueued = true;\n }\n lastSample = firstSampleQueued ? null : sample;\n if (sampleQueue.length > 0) {\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n const keyPacket = await packetSink.getKeyPacket(startTimestamp, { verifyKeyPackets: true })\n ?? await packetSink.getFirstPacket();\n let currentPacket = keyPacket;\n let endPacket = undefined;\n if (endTimestamp < Infinity) {\n // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order\n // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds\n // this end time. However, we can still put a bound on it: Since key frames are by definition never\n // out of order, we can stop at the first key frame after the end timestamp.\n const packet = await packetSink.getPacket(endTimestamp);\n const keyPacket = !packet\n ? null\n : packet.type === 'key' && packet.timestamp === endTimestamp\n ? packet\n : await packetSink.getNextKeyPacket(packet, { verifyKeyPackets: true });\n if (keyPacket) {\n endPacket = keyPacket;\n }\n }\n const packets = packetSink.packets(keyPacket ?? undefined, endPacket);\n await packets.next(); // Skip the start packet as we already have it\n while (currentPacket && !ended && !this._track.input._disposed) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n decoder.decode(currentPacket);\n const packetResult = await packets.next();\n if (packetResult.done) {\n break;\n }\n currentPacket = packetResult.value;\n }\n await packets.return();\n if (!terminated && !this._track.input._disposed) {\n await decoder.flush();\n }\n decoder.close();\n if (!firstSampleQueued && lastSample) {\n sampleQueue.push(lastSample);\n }\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n lastSample?.close();\n for (const sample of sampleQueue) {\n sample.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n ended = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n /** @internal */\n mediaSamplesAtTimestamps(timestamps) {\n validateAnyIterable(timestamps);\n const timestampIterator = toAsyncIterator(timestamps);\n const timestampsOfInterest = [];\n const sampleQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const pushToQueue = (sample) => {\n sampleQueue.push(sample);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n };\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (terminated) {\n sample.close();\n return;\n }\n let sampleUses = 0;\n while (timestampsOfInterest.length > 0\n && sample.timestamp - timestampsOfInterest[0] > -1e-10 // Give it a little epsilon\n ) {\n sampleUses++;\n timestampsOfInterest.shift();\n }\n if (sampleUses > 0) {\n for (let i = 0; i < sampleUses; i++) {\n // Clone the sample if we need to emit it multiple times\n pushToQueue((i < sampleUses - 1 ? sample.clone() : sample));\n }\n }\n else {\n sample.close();\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n let lastPacket = null;\n let lastKeyPacket = null;\n // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts\n // at the last key frame and goes until this sequence number.\n let maxSequenceNumber = -1;\n const decodePackets = async () => {\n assert(lastKeyPacket);\n // Start at the current key packet\n let currentPacket = lastKeyPacket;\n decoder.decode(currentPacket);\n while (currentPacket.sequenceNumber < maxSequenceNumber) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n while (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n }\n if (terminated) {\n break;\n }\n const nextPacket = await packetSink.getNextPacket(currentPacket);\n assert(nextPacket);\n decoder.decode(nextPacket);\n currentPacket = nextPacket;\n }\n maxSequenceNumber = -1;\n };\n const flushDecoder = async () => {\n await decoder.flush();\n // We don't expect this list to have any elements in it anymore, but in case it does, let's emit\n // nulls for every remaining element, then clear it.\n for (let i = 0; i < timestampsOfInterest.length; i++) {\n pushToQueue(null);\n }\n timestampsOfInterest.length = 0;\n };\n for await (const timestamp of timestampIterator) {\n validateTimestamp(timestamp);\n if (terminated || this._track.input._disposed) {\n break;\n }\n const targetPacket = await packetSink.getPacket(timestamp);\n const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp, { verifyKeyPackets: true });\n if (!keyPacket) {\n if (maxSequenceNumber !== -1) {\n await decodePackets();\n await flushDecoder();\n }\n pushToQueue(null);\n lastPacket = null;\n continue;\n }\n // Check if the key packet has changed or if we're going back in time\n if (lastPacket\n && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber\n || targetPacket.timestamp < lastPacket.timestamp)) {\n await decodePackets();\n await flushDecoder(); // Always flush here, improves decoder compatibility\n }\n timestampsOfInterest.push(targetPacket.timestamp);\n maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber);\n lastPacket = targetPacket;\n lastKeyPacket = keyPacket;\n }\n if (!terminated && !this._track.input._disposed) {\n if (maxSequenceNumber !== -1) {\n // We still need to decode packets\n await decodePackets();\n }\n await flushDecoder();\n }\n decoder.close();\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n for (const sample of sampleQueue) {\n sample?.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n assert(value !== undefined);\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nconst computeMaxQueueSize = (decodedSampleQueueSize) => {\n // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up\n // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact,\n // some decoders only start flushing out decoded chunks when the packet queue is large enough.\n return decodedSampleQueueSize === 0 ? 40 : 8;\n};\nclass VideoDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution) {\n super(onSample, onError);\n this.codec = codec;\n this.decoderConfig = decoderConfig;\n this.rotation = rotation;\n this.timeResolution = timeResolution;\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n this.inputTimestamps = []; // Timestamps input into the decoder, sorted.\n this.sampleQueue = []; // Safari-specific thing, check usage.\n this.currentPacketIndex = 0;\n this.raslSkipped = false; // For HEVC stuff\n // Alpha stuff\n this.alphaDecoder = null;\n this.alphaHadKeyframe = false;\n this.colorQueue = [];\n this.alphaQueue = [];\n this.merger = null;\n this.mergerCreationFailed = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n /** Each value is the number of decoded alpha chunks at which a null alpha frame should be added. */\n this.nullAlphaFrameQueue = [];\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false; // For HEVC stuff\n const MatchingCustomDecoder = customVideoDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof VideoSample)) {\n throw new TypeError('The argument passed to onSample must be a VideoSample.');\n }\n this.finalizeAndEmitSample(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n const colorHandler = (frame) => {\n if (this.alphaQueue.length > 0) {\n // Even when no alpha data is present (most of the time), there will be nulls in this queue\n const alphaFrame = this.alphaQueue.shift();\n assert(alphaFrame !== undefined);\n this.mergeAlpha(frame, alphaFrame);\n }\n else {\n this.colorQueue.push(frame);\n }\n };\n if (codec === 'avc' && this.decoderConfig.description && isChromium()) {\n // Chromium has/had a bug with playing interlaced AVC (https://issues.chromium.org/issues/456919096)\n // which can be worked around by requesting that software decoding be used. So, here we peek into the\n // AVC description, if present, and switch to software decoding if we find interlaced content.\n const record = deserializeAvcDecoderConfigurationRecord(toUint8Array(this.decoderConfig.description));\n if (record && record.sequenceParameterSets.length > 0) {\n const sps = parseAvcSps(record.sequenceParameterSets[0]);\n if (sps && sps.frameMbsOnlyFlag === 0) {\n this.decoderConfig = {\n ...this.decoderConfig,\n hardwareAcceleration: 'prefer-software',\n };\n }\n }\n }\n this.decoder = new VideoDecoder({\n output: (frame) => {\n try {\n colorHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(this.decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return Math.max(this.decoder.decodeQueueSize, this.alphaDecoder?.decodeQueueSize ?? 0);\n }\n }\n decode(packet) {\n if (this.codec === 'hevc' && this.currentPacketIndex > 0 && !this.raslSkipped) {\n if (this.hasHevcRaslPicture(packet.data)) {\n return; // Drop\n }\n this.raslSkipped = true;\n }\n this.currentPacketIndex++;\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n if (!isWebKit()) {\n insertSorted(this.inputTimestamps, packet.timestamp, x => x);\n }\n this.decoder.decode(packet.toEncodedVideoChunk());\n this.decodeAlphaData(packet);\n }\n }\n decodeAlphaData(packet) {\n if (!packet.sideData.alpha || this.mergerCreationFailed) {\n // No alpha side data in the packet, most common case\n this.pushNullAlphaFrame();\n return;\n }\n if (!this.merger) {\n try {\n this.merger = new ColorAlphaMerger();\n }\n catch (error) {\n console.error('Due to an error, only color data will be decoded.', error);\n this.mergerCreationFailed = true;\n this.decodeAlphaData(packet); // Go again\n return;\n }\n }\n // Check if we need to set up the alpha decoder\n if (!this.alphaDecoder) {\n const alphaHandler = (frame) => {\n this.alphaDecoderQueueSize--;\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, frame);\n }\n else {\n this.alphaQueue.push(frame);\n }\n // Check if any null frames have been queued for this point\n this.decodedAlphaChunkCount++;\n while (this.nullAlphaFrameQueue.length > 0\n && this.nullAlphaFrameQueue[0] === this.decodedAlphaChunkCount) {\n this.nullAlphaFrameQueue.shift();\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, null);\n }\n else {\n this.alphaQueue.push(null);\n }\n }\n };\n this.alphaDecoder = new VideoDecoder({\n output: (frame) => {\n try {\n alphaHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: this.onError,\n });\n this.alphaDecoder.configure(this.decoderConfig);\n }\n const type = determineVideoPacketType(this.codec, this.decoderConfig, packet.sideData.alpha);\n // Alpha packets might follow a different key frame rhythm than the main packets. Therefore, before we start\n // decoding, we must first find a packet that's actually a key frame. Until then, we treat the image as opaque.\n if (!this.alphaHadKeyframe) {\n this.alphaHadKeyframe = type === 'key';\n }\n if (this.alphaHadKeyframe) {\n // Same RASL skipping logic as for color, unlikely to be hit (since who uses HEVC with separate alpha??) but\n // here for symmetry.\n if (this.codec === 'hevc' && this.currentAlphaPacketIndex > 0 && !this.alphaRaslSkipped) {\n if (this.hasHevcRaslPicture(packet.sideData.alpha)) {\n this.pushNullAlphaFrame();\n return;\n }\n this.alphaRaslSkipped = true;\n }\n this.currentAlphaPacketIndex++;\n this.alphaDecoder.decode(packet.alphaToEncodedVideoChunk(type ?? packet.type));\n this.alphaDecoderQueueSize++;\n }\n else {\n this.pushNullAlphaFrame();\n }\n }\n pushNullAlphaFrame() {\n if (this.alphaDecoderQueueSize === 0) {\n // Easy\n this.alphaQueue.push(null);\n }\n else {\n // There are still alpha chunks being decoded, so pushing `null` immediately would result in out-of-order\n // data and be incorrect. Instead, we need to enqueue a \"null frame\" for when the current decoder workload\n // has finished.\n this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount + this.alphaDecoderQueueSize);\n }\n }\n /**\n * If we're using HEVC, we need to make sure to skip any RASL slices that follow a non-IDR key frame such as\n * CRA_NUT. This is because RASL slices cannot be decoded without data before the CRA_NUT. Browsers behave\n * differently here: Chromium drops the packets, Safari throws a decoder error. Either way, it's not good\n * and causes bugs upstream. So, let's take the dropping into our own hands.\n */\n hasHevcRaslPicture(packetData) {\n const nalUnits = extractHevcNalUnits(packetData, this.decoderConfig);\n return nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return type === HevcNalUnitType.RASL_N || type === HevcNalUnitType.RASL_R;\n });\n }\n /** Handler for the WebCodecs VideoDecoder for ironing out browser differences. */\n sampleHandler(sample) {\n if (isWebKit()) {\n // For correct B-frame handling, we don't just hand over the frames directly but instead add them to\n // a queue, because we want to ensure frames are emitted in presentation order. We flush the queue\n // each time we receive a frame with a timestamp larger than the highest we've seen so far, as we\n // can sure that is not a B-frame. Typically, WebCodecs automatically guarantees that frames are\n // emitted in presentation order, but Safari doesn't always follow this rule.\n if (this.sampleQueue.length > 0 && (sample.timestamp >= last(this.sampleQueue).timestamp)) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n insertSorted(this.sampleQueue, sample, x => x.timestamp);\n }\n else {\n // Assign it the next earliest timestamp from the input. We do this because browsers, by spec, are\n // required to emit decoded frames in presentation order *while* retaining the timestamp of their\n // originating EncodedVideoChunk. For files with B-frames but no out-of-order timestamps (like a\n // missing ctts box, for example), this causes a mismatch. We therefore fix the timestamps and\n // ensure they are sorted by doing this.\n const timestamp = this.inputTimestamps.shift();\n // There's no way we'd have more decoded frames than encoded packets we passed in. Actually, the\n // correspondence should be 1:1.\n assert(timestamp !== undefined);\n sample.setTimestamp(timestamp);\n this.finalizeAndEmitSample(sample);\n }\n }\n finalizeAndEmitSample(sample) {\n // Round the timestamps to the time resolution\n sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution);\n sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution);\n sample.setRotation(this.rotation);\n this.onSample(sample);\n }\n mergeAlpha(color, alpha) {\n if (!alpha) {\n // Nothing needs to be merged\n const finalSample = new VideoSample(color);\n this.sampleHandler(finalSample);\n return;\n }\n assert(this.merger);\n this.merger.update(color, alpha);\n color.close();\n alpha.close();\n const finalFrame = new VideoFrame(this.merger.canvas, {\n timestamp: color.timestamp,\n duration: color.duration ?? undefined,\n });\n const finalSample = new VideoSample(finalFrame);\n this.sampleHandler(finalSample);\n }\n async flush() {\n if (this.customDecoder) {\n await this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n await Promise.all([\n this.decoder.flush(),\n this.alphaDecoder?.flush(),\n ]);\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.alphaHadKeyframe = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n this.nullAlphaFrameQueue.length = 0;\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false;\n }\n if (isWebKit()) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n this.currentPacketIndex = 0;\n this.raslSkipped = false;\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n this.alphaDecoder?.close();\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.merger?.close();\n }\n for (const sample of this.sampleQueue) {\n sample.close();\n }\n this.sampleQueue.length = 0;\n }\n}\n/** Utility class that merges together color and alpha information using simple WebGL 2 shaders. */\nclass ColorAlphaMerger {\n constructor() {\n // Canvas will be resized later\n if (typeof OffscreenCanvas !== 'undefined') {\n // Prefer OffscreenCanvas for Worker environments\n this.canvas = new OffscreenCanvas(300, 150);\n }\n else {\n this.canvas = document.createElement('canvas');\n }\n const gl = this.canvas.getContext('webgl2', {\n premultipliedAlpha: false,\n }); // Casting because of some TypeScript weirdness\n if (!gl) {\n throw new Error('Couldn\\'t acquire WebGL 2 context.');\n }\n this.gl = gl;\n this.program = this.createProgram();\n this.vao = this.createVAO();\n this.colorTexture = this.createTexture();\n this.alphaTexture = this.createTexture();\n this.gl.useProgram(this.program);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_colorTexture'), 0);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_alphaTexture'), 1);\n }\n createProgram() {\n const vertexShader = this.createShader(this.gl.VERTEX_SHADER, `#version 300 es\n\t\t\tin vec2 a_position;\n\t\t\tin vec2 a_texCoord;\n\t\t\tout vec2 v_texCoord;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = vec4(a_position, 0.0, 1.0);\n\t\t\t\tv_texCoord = a_texCoord;\n\t\t\t}\n\t\t`);\n const fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, `#version 300 es\n\t\t\tprecision highp float;\n\t\t\t\n\t\t\tuniform sampler2D u_colorTexture;\n\t\t\tuniform sampler2D u_alphaTexture;\n\t\t\tin vec2 v_texCoord;\n\t\t\tout vec4 fragColor;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tvec3 color = texture(u_colorTexture, v_texCoord).rgb;\n\t\t\t\tfloat alpha = texture(u_alphaTexture, v_texCoord).r;\n\t\t\t\tfragColor = vec4(color, alpha);\n\t\t\t}\n\t\t`);\n const program = this.gl.createProgram();\n this.gl.attachShader(program, vertexShader);\n this.gl.attachShader(program, fragmentShader);\n this.gl.linkProgram(program);\n return program;\n }\n createShader(type, source) {\n const shader = this.gl.createShader(type);\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n return shader;\n }\n createVAO() {\n const vao = this.gl.createVertexArray();\n this.gl.bindVertexArray(vao);\n const vertices = new Float32Array([\n -1, -1, 0, 1,\n 1, -1, 1, 1,\n -1, 1, 0, 0,\n 1, 1, 1, 0,\n ]);\n const buffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, vertices, this.gl.STATIC_DRAW);\n const positionLocation = this.gl.getAttribLocation(this.program, 'a_position');\n const texCoordLocation = this.gl.getAttribLocation(this.program, 'a_texCoord');\n this.gl.enableVertexAttribArray(positionLocation);\n this.gl.vertexAttribPointer(positionLocation, 2, this.gl.FLOAT, false, 16, 0);\n this.gl.enableVertexAttribArray(texCoordLocation);\n this.gl.vertexAttribPointer(texCoordLocation, 2, this.gl.FLOAT, false, 16, 8);\n return vao;\n }\n createTexture() {\n const texture = this.gl.createTexture();\n this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n return texture;\n }\n update(color, alpha) {\n if (color.displayWidth !== this.canvas.width || color.displayHeight !== this.canvas.height) {\n this.canvas.width = color.displayWidth;\n this.canvas.height = color.displayHeight;\n }\n this.gl.activeTexture(this.gl.TEXTURE0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.colorTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, color);\n this.gl.activeTexture(this.gl.TEXTURE1);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.alphaTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, alpha);\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n this.gl.bindVertexArray(this.vao);\n this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n }\n close() {\n this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n this.gl = null;\n }\n}\n/**\n * A sink that retrieves decoded video samples (video frames) from a video track.\n * @group Media sinks\n * @public\n */\nexport class VideoSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack) {\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n super();\n this._track = videoTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This video track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const rotation = this._track.rotation;\n const decoderConfig = await this._track.getDecoderConfig();\n const timeResolution = this._track.timeResolution;\n assert(codec && decoderConfig);\n return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution);\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns\n * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method\n * will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than\n * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation\n * metadata.\n *\n * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise.\n *\n * @group Media sinks\n * @public\n */\nexport class CanvasSink {\n /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack, options = {}) {\n /** @internal */\n this._nextCanvasIndex = 0;\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n if (options && typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.alpha !== undefined && typeof options.alpha !== 'boolean') {\n throw new TypeError('options.alpha, when provided, must be a boolean.');\n }\n if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n throw new TypeError('options.width, when defined, must be a positive integer.');\n }\n if (options.height !== undefined && (!Number.isInteger(options.height) || options.height <= 0)) {\n throw new TypeError('options.height, when defined, must be a positive integer.');\n }\n if (options.fit !== undefined && !['fill', 'contain', 'cover'].includes(options.fit)) {\n throw new TypeError('options.fit, when provided, must be one of \"fill\", \"contain\", or \"cover\".');\n }\n if (options.width !== undefined\n && options.height !== undefined\n && options.fit === undefined) {\n throw new TypeError('When both options.width and options.height are provided, options.fit must also be provided.');\n }\n if (options.rotation !== undefined && ![0, 90, 180, 270].includes(options.rotation)) {\n throw new TypeError('options.rotation, when provided, must be 0, 90, 180 or 270.');\n }\n if (options.crop !== undefined) {\n validateCropRectangle(options.crop, 'options.');\n }\n if (options.poolSize !== undefined\n && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) {\n throw new TypeError('poolSize must be a non-negative integer.');\n }\n const rotation = options.rotation ?? videoTrack.rotation;\n const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n ? [videoTrack.codedWidth, videoTrack.codedHeight]\n : [videoTrack.codedHeight, videoTrack.codedWidth];\n const crop = options.crop;\n if (crop) {\n clampCropRectangle(crop, rotatedWidth, rotatedHeight);\n }\n let [width, height] = crop\n ? [crop.width, crop.height]\n : [rotatedWidth, rotatedHeight];\n const originalAspectRatio = width / height;\n // If width and height aren't defined together, deduce the missing value using the aspect ratio\n if (options.width !== undefined && options.height === undefined) {\n width = options.width;\n height = Math.round(width / originalAspectRatio);\n }\n else if (options.width === undefined && options.height !== undefined) {\n height = options.height;\n width = Math.round(height * originalAspectRatio);\n }\n else if (options.width !== undefined && options.height !== undefined) {\n width = options.width;\n height = options.height;\n }\n this._videoTrack = videoTrack;\n this._alpha = options.alpha ?? false;\n this._width = width;\n this._height = height;\n this._rotation = rotation;\n this._crop = crop;\n this._fit = options.fit ?? 'fill';\n this._videoSampleSink = new VideoSampleSink(videoTrack);\n this._canvasPool = Array.from({ length: options.poolSize ?? 0 }, () => null);\n }\n /** @internal */\n _videoSampleToWrappedCanvas(sample) {\n let canvas = this._canvasPool[this._nextCanvasIndex];\n let canvasIsNew = false;\n if (!canvas) {\n if (typeof document !== 'undefined') {\n // Prefer an HTMLCanvasElement\n canvas = document.createElement('canvas');\n canvas.width = this._width;\n canvas.height = this._height;\n }\n else {\n canvas = new OffscreenCanvas(this._width, this._height);\n }\n if (this._canvasPool.length > 0) {\n this._canvasPool[this._nextCanvasIndex] = canvas;\n }\n canvasIsNew = true;\n }\n if (this._canvasPool.length > 0) {\n this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length;\n }\n const context = canvas.getContext('2d', {\n alpha: this._alpha || isFirefox(), // Firefox has VideoFrame glitches with opaque canvases\n });\n assert(context);\n context.resetTransform();\n if (!canvasIsNew) {\n if (!this._alpha && isFirefox()) {\n context.fillStyle = 'black';\n context.fillRect(0, 0, this._width, this._height);\n }\n else {\n context.clearRect(0, 0, this._width, this._height);\n }\n }\n sample.drawWithFit(context, {\n fit: this._fit,\n rotation: this._rotation,\n crop: this._crop,\n });\n const result = {\n canvas,\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically,\n * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given\n * timestamp. Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getCanvas(timestamp) {\n validateTimestamp(timestamp);\n const sample = await this._videoSampleSink.getSample(timestamp);\n return sample && this._videoSampleToWrappedCanvas(sample);\n }\n /**\n * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This\n * method will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive).\n */\n canvases(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._videoSampleSink.samples(startTimestamp, endTimestamp), sample => this._videoSampleToWrappedCanvas(sample));\n }\n /**\n * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized\n * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is\n * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if\n * no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n canvasesAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._videoSampleSink.samplesAtTimestamps(timestamps), sample => sample && this._videoSampleToWrappedCanvas(sample));\n }\n}\nclass AudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig) {\n super(onSample, onError);\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n const sampleHandler = (sample) => {\n if (this.currentTimestamp === null\n || Math.abs(sample.timestamp - this.currentTimestamp) >= sample.duration) {\n // We need to sync with the sample timestamp again\n this.currentTimestamp = sample.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += sample.duration;\n if (sample.numberOfFrames === 0) {\n // We skip zero-data (empty) AudioSamples. These are sometimes emitted, for example, by Firefox when it\n // decodes Vorbis (at the start).\n sample.close();\n return;\n }\n // Round the timestamp to the sample rate\n const sampleRate = decoderConfig.sampleRate;\n sample.setTimestamp(Math.round(preciseTimestamp * sampleRate) / sampleRate);\n onSample(sample);\n };\n const MatchingCustomDecoder = customAudioDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof AudioSample)) {\n throw new TypeError('The argument passed to onSample must be an AudioSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new AudioDecoder({\n output: (data) => {\n try {\n sampleHandler(new AudioSample(data));\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedAudioChunk());\n }\n }\n flush() {\n if (this.customDecoder) {\n return this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n return this.decoder.flush();\n }\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n }\n}\n// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple\n// decoder that maps any input PCM format into a PCM format supported by the browser.\nclass PcmAudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, decoderConfig) {\n super(onSample, onError);\n this.decoderConfig = decoderConfig;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n assert(PCM_AUDIO_CODECS.includes(decoderConfig.codec));\n this.codec = decoderConfig.codec;\n const { dataType, sampleSize, littleEndian } = parsePcmCodec(this.codec);\n this.inputSampleSize = sampleSize;\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint8(byteOffset) - 2 ** 7;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt8(byteOffset);\n }\n else if (dataType === 'ulaw') {\n this.readInputValue = (view, byteOffset) => fromUlaw(view.getUint8(byteOffset));\n }\n else if (dataType === 'alaw') {\n this.readInputValue = (view, byteOffset) => fromAlaw(view.getUint8(byteOffset));\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 2:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint16(byteOffset, littleEndian) - 2 ** 15;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt16(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 3:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => getUint24(view, byteOffset, littleEndian) - 2 ** 23;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => getInt24(view, byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 4:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint32(byteOffset, littleEndian) - 2 ** 31;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt32(byteOffset, littleEndian);\n }\n else if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat32(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 8:\n {\n if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat64(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'ulaw' || dataType === 'alaw') {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n else {\n this.outputSampleSize = 1;\n this.outputFormat = 'u8';\n this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, value + 2 ** 7);\n }\n }\n ;\n break;\n case 2:\n {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n ;\n break;\n case 3:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 's32';\n // From https://www.w3.org/TR/webcodecs:\n // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are\n // stored in s32, each sample MUST be left-shifted by 8 bits.\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value << 8, true);\n }\n ;\n break;\n case 4:\n {\n this.outputSampleSize = 4;\n if (dataType === 'float') {\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n else {\n this.outputFormat = 's32';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value, true);\n }\n }\n ;\n break;\n case 8:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n ;\n }\n getDecodeQueueSize() {\n return 0;\n }\n decode(packet) {\n const inputView = toDataView(packet.data);\n const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize;\n const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize;\n const outputBuffer = new ArrayBuffer(outputBufferSize);\n const outputView = new DataView(outputBuffer);\n for (let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++) {\n const inputIndex = i * this.inputSampleSize;\n const outputIndex = i * this.outputSampleSize;\n const value = this.readInputValue(inputView, inputIndex);\n this.writeOutputValue(outputView, outputIndex, value);\n }\n const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate;\n if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) {\n // We need to sync with the packet timestamp again\n this.currentTimestamp = packet.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += preciseDuration;\n const audioSample = new AudioSample({\n format: this.outputFormat,\n data: outputBuffer,\n numberOfChannels: this.decoderConfig.numberOfChannels,\n sampleRate: this.decoderConfig.sampleRate,\n numberOfFrames,\n timestamp: preciseTimestamp,\n });\n this.onSample(audioSample);\n }\n async flush() {\n // Do nothing\n }\n close() {\n // Do nothing\n }\n}\n/**\n * Sink for retrieving decoded audio samples from an audio track.\n * @group Media sinks\n * @public\n */\nexport class AudioSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n super();\n this._track = audioTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This audio track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const decoderConfig = await this._track.getDecoderConfig();\n assert(codec && decoderConfig);\n if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {\n return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig);\n }\n else {\n return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig);\n }\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the audio samples of this track in presentation order. This method\n * will intelligently pre-decode a few samples ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no sample is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is\n * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the\n * Web Audio API.\n * @group Media sinks\n * @public\n */\nexport class AudioBufferSink {\n /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n this._audioSampleSink = new AudioSampleSink(audioTrack);\n }\n /** @internal */\n _audioSampleToWrappedArrayBuffer(sample) {\n const result = {\n buffer: sample.toAudioBuffer(),\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getBuffer(timestamp) {\n validateTimestamp(timestamp);\n const data = await this._audioSampleSink.getSample(timestamp);\n return data && this._audioSampleToWrappedArrayBuffer(data);\n }\n /**\n * Creates an async iterator that yields audio buffers of this track in presentation order. This method\n * will intelligently pre-decode a few buffers ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive).\n */\n buffers(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._audioSampleSink.samples(startTimestamp, endTimestamp), data => this._audioSampleToWrappedArrayBuffer(data));\n }\n /**\n * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may\n * yield null if no buffer is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n buffersAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._audioSampleSink.samplesAtTimestamps(timestamps), data => data && this._audioSampleToWrappedArrayBuffer(data));\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { SECOND_TO_MICROSECOND_FACTOR } from './misc.js';\nexport const PLACEHOLDER_DATA = /* #__PURE__ */ new Uint8Array(0);\n/**\n * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's\n * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) and\n * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk), but can also be used\n * standalone.\n * @group Packets\n * @public\n */\nexport class EncodedPacket {\n /** Creates a new {@link EncodedPacket} from raw bytes and timing information. */\n constructor(\n /** The encoded data of this packet. */\n data, \n /** The type of this packet. */\n type, \n /**\n * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps\n * should not be presented.\n */\n timestamp, \n /** The duration of this packet in seconds. */\n duration, \n /**\n * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A\n * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet.\n * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative\n * ordering. Negative sequence numbers mean the sequence number is undefined.\n */\n sequenceNumber = -1, byteLength, sideData) {\n this.data = data;\n this.type = type;\n this.timestamp = timestamp;\n this.duration = duration;\n this.sequenceNumber = sequenceNumber;\n if (data === PLACEHOLDER_DATA && byteLength === undefined) {\n throw new Error('Internal error: byteLength must be explicitly provided when constructing metadata-only packets.');\n }\n if (byteLength === undefined) {\n byteLength = data.byteLength;\n }\n if (!(data instanceof Uint8Array)) {\n throw new TypeError('data must be a Uint8Array.');\n }\n if (type !== 'key' && type !== 'delta') {\n throw new TypeError('type must be either \"key\" or \"delta\".');\n }\n if (!Number.isFinite(timestamp)) {\n throw new TypeError('timestamp must be a number.');\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError('duration must be a non-negative number.');\n }\n if (!Number.isFinite(sequenceNumber)) {\n throw new TypeError('sequenceNumber must be a number.');\n }\n if (!Number.isInteger(byteLength) || byteLength < 0) {\n throw new TypeError('byteLength must be a non-negative integer.');\n }\n if (sideData !== undefined && (typeof sideData !== 'object' || !sideData)) {\n throw new TypeError('sideData, when provided, must be an object.');\n }\n if (sideData?.alpha !== undefined && !(sideData.alpha instanceof Uint8Array)) {\n throw new TypeError('sideData.alpha, when provided, must be a Uint8Array.');\n }\n if (sideData?.alphaByteLength !== undefined\n && (!Number.isInteger(sideData.alphaByteLength) || sideData.alphaByteLength < 0)) {\n throw new TypeError('sideData.alphaByteLength, when provided, must be a non-negative integer.');\n }\n this.byteLength = byteLength;\n this.sideData = sideData ?? {};\n if (this.sideData.alpha && this.sideData.alphaByteLength === undefined) {\n this.sideData.alphaByteLength = this.sideData.alpha.byteLength;\n }\n }\n /**\n * If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. They are the\n * result of retrieving packets with {@link PacketRetrievalOptions.metadataOnly} set to `true`.\n */\n get isMetadataOnly() {\n return this.data === PLACEHOLDER_DATA;\n }\n /** The timestamp of this packet in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of this packet in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n /** Converts this packet to an\n * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the\n * WebCodecs API. */\n toEncodedVideoChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n }\n if (typeof EncodedVideoChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedVideoChunk.');\n }\n return new EncodedVideoChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /**\n * Converts this packet to an\n * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the\n * WebCodecs API, using the alpha side data instead of the color data. Throws if no alpha side data is defined.\n */\n alphaToEncodedVideoChunk(type = this.type) {\n if (!this.sideData.alpha) {\n throw new TypeError('This packet does not contain alpha side data.');\n }\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n }\n if (typeof EncodedVideoChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedVideoChunk.');\n }\n return new EncodedVideoChunk({\n data: this.sideData.alpha,\n type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /** Converts this packet to an\n * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk) for use with the\n * WebCodecs API. */\n toEncodedAudioChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to an audio chunk.');\n }\n if (typeof EncodedAudioChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedAudioChunk.');\n }\n return new EncodedAudioChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /**\n * Creates an {@link EncodedPacket} from an\n * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) or\n * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk). This method is useful\n * for converting chunks from the WebCodecs API to `EncodedPacket` instances.\n */\n static fromEncodedChunk(chunk, sideData) {\n if (!(chunk instanceof EncodedVideoChunk || chunk instanceof EncodedAudioChunk)) {\n throw new TypeError('chunk must be an EncodedVideoChunk or EncodedAudioChunk.');\n }\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n return new EncodedPacket(data, chunk.type, chunk.timestamp / 1e6, (chunk.duration ?? 0) / 1e6, undefined, undefined, sideData);\n }\n /** Clones this packet while optionally updating timing information. */\n clone(options) {\n if (options !== undefined && (typeof options !== 'object' || options === null)) {\n throw new TypeError('options, when provided, must be an object.');\n }\n if (options?.timestamp !== undefined && !Number.isFinite(options.timestamp)) {\n throw new TypeError('options.timestamp, when provided, must be a number.');\n }\n if (options?.duration !== undefined && !Number.isFinite(options.duration)) {\n throw new TypeError('options.duration, when provided, must be a number.');\n }\n return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n// https://github.com/dystopiancode/pcm-g711/blob/master/pcm-g711/g711.c\nexport const toUlaw = (s16) => {\n const MULAW_MAX = 0x1FFF;\n const MULAW_BIAS = 33;\n let number = s16;\n let mask = 0x1000;\n let sign = 0;\n let position = 12;\n let lsb = 0;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n number += MULAW_BIAS;\n if (number > MULAW_MAX) {\n number = MULAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> (position - 4)) & 0x0f;\n return ~(sign | ((position - 5) << 4) | lsb) & 0xFF;\n};\nexport const fromUlaw = (u8) => {\n const MULAW_BIAS = 33;\n let sign = 0;\n let position = 0;\n let number = ~u8;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 5;\n const decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5))) - MULAW_BIAS;\n return (sign === 0) ? decoded : -decoded;\n};\nexport const toAlaw = (s16) => {\n const ALAW_MAX = 0xFFF;\n let mask = 0x800;\n let sign = 0;\n let position = 11;\n let lsb = 0;\n let number = s16;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n if (number > ALAW_MAX) {\n number = ALAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> ((position === 4) ? 1 : (position - 4))) & 0x0f;\n return (sign | ((position - 4) << 4) | lsb) ^ 0x55;\n};\nexport const fromAlaw = (u8) => {\n let sign = 0x00;\n let position = 0;\n let number = u8 ^ 0x55;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 4;\n let decoded = 0;\n if (position !== 4) {\n decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5)));\n }\n else {\n decoded = (number << 1) | 1;\n }\n return (sign === 0) ? decoded : -decoded;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, clamp, isAllowSharedBufferSource, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, isFirefox, polyfillSymbolDispose, } from './misc.js';\npolyfillSymbolDispose();\n// Let's manually handle logging the garbage collection errors that are typically logged by the browser. This way, they\n// also kick for audio samples (which is normally not the case), making sure any incorrect code is quickly caught.\nlet lastVideoGcErrorLog = -Infinity;\nlet lastAudioGcErrorLog = -Infinity;\nlet finalizationRegistry = null;\nif (typeof FinalizationRegistry !== 'undefined') {\n finalizationRegistry = new FinalizationRegistry((value) => {\n const now = Date.now();\n if (value.type === 'video') {\n if (now - lastVideoGcErrorLog >= 1000) {\n // This error is annoying but oh so important\n console.error(`A VideoSample was garbage collected without first being closed. For proper resource management,`\n + ` make sure to call close() on all your VideoSamples as soon as you're done using them.`);\n lastVideoGcErrorLog = now;\n }\n if (typeof VideoFrame !== 'undefined' && value.data instanceof VideoFrame) {\n value.data.close(); // Prevent the browser error since we're logging our own\n }\n }\n else {\n if (now - lastAudioGcErrorLog >= 1000) {\n console.error(`An AudioSample was garbage collected without first being closed. For proper resource management,`\n + ` make sure to call close() on all your AudioSamples as soon as you're done using them.`);\n lastAudioGcErrorLog = now;\n }\n if (typeof AudioData !== 'undefined' && value.data instanceof AudioData) {\n value.data.close();\n }\n }\n });\n}\n/**\n * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's\n * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame), but can also be used standalone.\n * @group Samples\n * @public\n */\nexport class VideoSample {\n /** The width of the frame in pixels after rotation. */\n get displayWidth() {\n return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight;\n }\n /** The height of the frame in pixels after rotation. */\n get displayHeight() {\n return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth;\n }\n /** The presentation timestamp of the frame in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the frame in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n /**\n * Whether this sample uses a pixel format that can hold transparency data. Note that this doesn't necessarily mean\n * that the sample is transparent.\n */\n get hasAlpha() {\n return this.format && this.format.includes('A');\n }\n constructor(data, init) {\n /** @internal */\n this._closed = false;\n if (data instanceof ArrayBuffer\n || (typeof SharedArrayBuffer !== 'undefined' && data instanceof SharedArrayBuffer)\n || ArrayBuffer.isView(data)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (!('format' in init) || typeof init.format !== 'string') {\n throw new TypeError('init.format must be a string.');\n }\n if (!Number.isInteger(init.codedWidth) || init.codedWidth <= 0) {\n throw new TypeError('init.codedWidth must be a positive integer.');\n }\n if (!Number.isInteger(init.codedHeight) || init.codedHeight <= 0) {\n throw new TypeError('init.codedHeight must be a positive integer.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = toUint8Array(data).slice(); // Copy it\n this.format = init.format;\n this.codedWidth = init.codedWidth;\n this.codedHeight = init.codedHeight;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace(init.colorSpace);\n }\n else if (typeof VideoFrame !== 'undefined' && data instanceof VideoFrame) {\n if (init?.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (init?.timestamp !== undefined && !Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp, when provided, must be a number.');\n }\n if (init?.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = data;\n this.format = data.format;\n // Copying the display dimensions here, assuming no innate VideoFrame rotation\n this.codedWidth = data.displayWidth;\n this.codedHeight = data.displayHeight;\n // The VideoFrame's rotation is ignored here. It's still a new field, and I'm not sure of any application\n // where the browser makes use of it. If a case gets found, I'll add it.\n this.rotation = init?.rotation ?? 0;\n this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n this.colorSpace = data.colorSpace;\n }\n else if ((typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement)\n || (typeof SVGImageElement !== 'undefined' && data instanceof SVGImageElement)\n || (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap)\n || (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement)\n || (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement)\n || (typeof OffscreenCanvas !== 'undefined' && data instanceof OffscreenCanvas)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n if (typeof VideoFrame !== 'undefined') {\n return new VideoSample(new VideoFrame(data, {\n timestamp: Math.trunc(init.timestamp * SECOND_TO_MICROSECOND_FACTOR),\n // Drag 0 to undefined\n duration: Math.trunc((init.duration ?? 0) * SECOND_TO_MICROSECOND_FACTOR) || undefined,\n }), init);\n }\n let width = 0;\n let height = 0;\n // Determine the dimensions of the thing\n if ('naturalWidth' in data) {\n width = data.naturalWidth;\n height = data.naturalHeight;\n }\n else if ('videoWidth' in data) {\n width = data.videoWidth;\n height = data.videoHeight;\n }\n else if ('width' in data) {\n width = Number(data.width);\n height = Number(data.height);\n }\n if (!width || !height) {\n throw new TypeError('Could not determine dimensions.');\n }\n const canvas = new OffscreenCanvas(width, height);\n const context = canvas.getContext('2d', {\n alpha: isFirefox(), // Firefox has VideoFrame glitches with opaque canvases\n willReadFrequently: true,\n });\n assert(context);\n // Draw it to a canvas\n context.drawImage(data, 0, 0);\n this._data = canvas;\n this.format = 'RGBX';\n this.codedWidth = width;\n this.codedHeight = height;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace({\n matrix: 'rgb',\n primaries: 'bt709',\n transfer: 'iec61966-2-1',\n fullRange: true,\n });\n }\n else {\n throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.');\n }\n finalizationRegistry?.register(this, { type: 'video', data: this._data }, this);\n }\n /** Clones this video sample. */\n clone() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoSample(this._data.clone(), {\n timestamp: this.timestamp,\n duration: this.duration,\n rotation: this.rotation,\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoSample(this._data.slice(), {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n rotation: this.rotation,\n });\n }\n else {\n return new VideoSample(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n rotation: this.rotation,\n });\n }\n }\n /**\n * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n finalizationRegistry?.unregister(this);\n if (isVideoFrame(this._data)) {\n this._data.close();\n }\n else {\n this._data = null; // GC that shit\n }\n this._closed = true;\n }\n /** Returns the number of bytes required to hold this video sample's pixel data. */\n allocationSize() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return this._data.allocationSize();\n }\n else if (this._data instanceof Uint8Array) {\n return this._data.byteLength;\n }\n else {\n return this.codedWidth * this.codedHeight * 4; // RGBX\n }\n }\n /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */\n async copyTo(destination) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n await this._data.copyTo(destination);\n }\n else if (this._data instanceof Uint8Array) {\n const dest = toUint8Array(destination);\n dest.set(this._data);\n }\n else {\n const canvas = this._data;\n const context = canvas.getContext('2d');\n assert(context);\n const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n const dest = toUint8Array(destination);\n dest.set(imageData.data);\n }\n }\n /**\n * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this\n * method *must* be closed separately from this video sample.\n */\n toVideoFrame() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration || undefined, // Drag 0 duration to undefined, glitches some codecs\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoFrame(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration || undefined,\n colorSpace: this.colorSpace,\n });\n }\n else {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration || undefined,\n });\n }\n }\n draw(context, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) {\n let sx = 0;\n let sy = 0;\n let sWidth = this.displayWidth;\n let sHeight = this.displayHeight;\n let dx = 0;\n let dy = 0;\n let dWidth = this.displayWidth;\n let dHeight = this.displayHeight;\n if (arg5 !== undefined) {\n sx = arg1;\n sy = arg2;\n sWidth = arg3;\n sHeight = arg4;\n dx = arg5;\n dy = arg6;\n if (arg7 !== undefined) {\n dWidth = arg7;\n dHeight = arg8;\n }\n else {\n dWidth = sWidth;\n dHeight = sHeight;\n }\n }\n else {\n dx = arg1;\n dy = arg2;\n if (arg3 !== undefined) {\n dWidth = arg3;\n dHeight = arg4;\n }\n }\n if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n && context instanceof OffscreenCanvasRenderingContext2D))) {\n throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n }\n if (!Number.isFinite(sx)) {\n throw new TypeError('sx must be a number.');\n }\n if (!Number.isFinite(sy)) {\n throw new TypeError('sy must be a number.');\n }\n if (!Number.isFinite(sWidth) || sWidth < 0) {\n throw new TypeError('sWidth must be a non-negative number.');\n }\n if (!Number.isFinite(sHeight) || sHeight < 0) {\n throw new TypeError('sHeight must be a non-negative number.');\n }\n if (!Number.isFinite(dx)) {\n throw new TypeError('dx must be a number.');\n }\n if (!Number.isFinite(dy)) {\n throw new TypeError('dy must be a number.');\n }\n if (!Number.isFinite(dWidth) || dWidth < 0) {\n throw new TypeError('dWidth must be a non-negative number.');\n }\n if (!Number.isFinite(dHeight) || dHeight < 0) {\n throw new TypeError('dHeight must be a non-negative number.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n ({ sx, sy, sWidth, sHeight } = this._rotateSourceRegion(sx, sy, sWidth, sHeight, this.rotation));\n const source = this.toCanvasImageSource();\n context.save();\n const centerX = dx + dWidth / 2;\n const centerY = dy + dHeight / 2;\n context.translate(centerX, centerY);\n context.rotate(this.rotation * Math.PI / 180);\n const aspectRatioChange = this.rotation % 180 === 0 ? 1 : dWidth / dHeight;\n // Scale to compensate for aspect ratio changes when rotated\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.drawImage(source, sx, sy, sWidth, sHeight, -dWidth / 2, -dHeight / 2, dWidth, dHeight);\n context.restore();\n }\n /**\n * Draws the sample in the middle of the canvas corresponding to the context with the specified fit behavior.\n */\n drawWithFit(context, options) {\n if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n && context instanceof OffscreenCanvasRenderingContext2D))) {\n throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!['fill', 'contain', 'cover'].includes(options.fit)) {\n throw new TypeError('options.fit must be \\'fill\\', \\'contain\\', or \\'cover\\'.');\n }\n if (options.rotation !== undefined && ![0, 90, 180, 270].includes(options.rotation)) {\n throw new TypeError('options.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (options.crop !== undefined) {\n validateCropRectangle(options.crop, 'options.');\n }\n const canvasWidth = context.canvas.width;\n const canvasHeight = context.canvas.height;\n const rotation = options.rotation ?? this.rotation;\n const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n ? [this.codedWidth, this.codedHeight]\n : [this.codedHeight, this.codedWidth];\n if (options.crop) {\n clampCropRectangle(options.crop, rotatedWidth, rotatedHeight);\n }\n // These variables specify where the final sample will be drawn on the canvas\n let dx;\n let dy;\n let newWidth;\n let newHeight;\n const { sx, sy, sWidth, sHeight } = this._rotateSourceRegion(options.crop?.left ?? 0, options.crop?.top ?? 0, options.crop?.width ?? rotatedWidth, options.crop?.height ?? rotatedHeight, rotation);\n if (options.fit === 'fill') {\n dx = 0;\n dy = 0;\n newWidth = canvasWidth;\n newHeight = canvasHeight;\n }\n else {\n const [sampleWidth, sampleHeight] = options.crop\n ? [options.crop.width, options.crop.height]\n : [rotatedWidth, rotatedHeight];\n const scale = options.fit === 'contain'\n ? Math.min(canvasWidth / sampleWidth, canvasHeight / sampleHeight)\n : Math.max(canvasWidth / sampleWidth, canvasHeight / sampleHeight);\n newWidth = sampleWidth * scale;\n newHeight = sampleHeight * scale;\n dx = (canvasWidth - newWidth) / 2;\n dy = (canvasHeight - newHeight) / 2;\n }\n context.save();\n const aspectRatioChange = rotation % 180 === 0 ? 1 : newWidth / newHeight;\n context.translate(canvasWidth / 2, canvasHeight / 2);\n context.rotate(rotation * Math.PI / 180);\n // This aspect ratio compensation is done so that we can draw the sample with the intended dimensions and\n // don't need to think about how those dimensions change after the rotation\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.translate(-canvasWidth / 2, -canvasHeight / 2);\n // Important that we don't use .draw() here since that would take rotation into account, but we wanna handle it\n // ourselves here\n context.drawImage(this.toCanvasImageSource(), sx, sy, sWidth, sHeight, dx, dy, newWidth, newHeight);\n context.restore();\n }\n /** @internal */\n _rotateSourceRegion(sx, sy, sWidth, sHeight, rotation) {\n // The provided sx,sy,sWidth,sHeight refer to the final rotated image, but that's not actually how the image is\n // stored. Therefore, we must map these back onto the original, pre-rotation image.\n if (rotation === 90) {\n [sx, sy, sWidth, sHeight] = [\n sy,\n this.codedHeight - sx - sWidth,\n sHeight,\n sWidth,\n ];\n }\n else if (rotation === 180) {\n [sx, sy] = [\n this.codedWidth - sx - sWidth,\n this.codedHeight - sy - sHeight,\n ];\n }\n else if (rotation === 270) {\n [sx, sy, sWidth, sHeight] = [\n this.codedWidth - sy - sHeight,\n sx,\n sHeight,\n sWidth,\n ];\n }\n return { sx, sy, sWidth, sHeight };\n }\n /**\n * Converts this video sample to a\n * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource) for drawing to a canvas.\n *\n * You must use the value returned by this method immediately, as any VideoFrame created internally will\n * automatically be closed in the next microtask.\n */\n toCanvasImageSource() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (this._data instanceof Uint8Array) {\n // Requires VideoFrame to be defined\n const videoFrame = this.toVideoFrame();\n queueMicrotask(() => videoFrame.close()); // Let's automatically close the frame in the next microtask\n return videoFrame;\n }\n else {\n return this._data;\n }\n }\n /** Sets the rotation metadata of this video sample. */\n setRotation(newRotation) {\n if (![0, 90, 180, 270].includes(newRotation)) {\n throw new TypeError('newRotation must be 0, 90, 180, or 270.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.rotation = newRotation;\n }\n /** Sets the presentation timestamp of this video sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n /** Sets the duration of this video sample, in seconds. */\n setDuration(newDuration) {\n if (!Number.isFinite(newDuration) || newDuration < 0) {\n throw new TypeError('newDuration must be a non-negative number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.duration = newDuration;\n }\n /** Calls `.close()`. */\n [Symbol.dispose]() {\n this.close();\n }\n}\nconst isVideoFrame = (x) => {\n return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nexport const clampCropRectangle = (crop, outerWidth, outerHeight) => {\n crop.left = Math.min(crop.left, outerWidth);\n crop.top = Math.min(crop.top, outerHeight);\n crop.width = Math.min(crop.width, outerWidth - crop.left);\n crop.height = Math.min(crop.height, outerHeight - crop.top);\n assert(crop.width >= 0);\n assert(crop.height >= 0);\n};\nexport const validateCropRectangle = (crop, prefix) => {\n if (!crop || typeof crop !== 'object') {\n throw new TypeError(prefix + 'crop, when provided, must be an object.');\n }\n if (!Number.isInteger(crop.left) || crop.left < 0) {\n throw new TypeError(prefix + 'crop.left must be a non-negative integer.');\n }\n if (!Number.isInteger(crop.top) || crop.top < 0) {\n throw new TypeError(prefix + 'crop.top must be a non-negative integer.');\n }\n if (!Number.isInteger(crop.width) || crop.width < 0) {\n throw new TypeError(prefix + 'crop.width must be a non-negative integer.');\n }\n if (!Number.isInteger(crop.height) || crop.height < 0) {\n throw new TypeError(prefix + 'crop.height must be a non-negative integer.');\n }\n};\nconst AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\n/**\n * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's\n * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData), but can also be used standalone.\n * @group Samples\n * @public\n */\nexport class AudioSample {\n /** The presentation timestamp of the sample in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the sample in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n /**\n * Creates a new {@link AudioSample}, either from an existing\n * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in\n * {@link AudioSampleInit}.\n */\n constructor(init) {\n /** @internal */\n this._closed = false;\n if (isAudioData(init)) {\n if (init.format === null) {\n throw new TypeError('AudioData with null format is not supported.');\n }\n this._data = init;\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = init.numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp / 1e6;\n this.duration = init.numberOfFrames / init.sampleRate;\n }\n else {\n if (!init || typeof init !== 'object') {\n throw new TypeError('Invalid AudioDataInit: must be an object.');\n }\n if (!AUDIO_SAMPLE_FORMATS.has(init.format)) {\n throw new TypeError('Invalid AudioDataInit: invalid format.');\n }\n if (!Number.isFinite(init.sampleRate) || init.sampleRate <= 0) {\n throw new TypeError('Invalid AudioDataInit: sampleRate must be > 0.');\n }\n if (!Number.isInteger(init.numberOfChannels) || init.numberOfChannels === 0) {\n throw new TypeError('Invalid AudioDataInit: numberOfChannels must be an integer > 0.');\n }\n if (!Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n const numberOfFrames = init.data.byteLength / (getBytesPerSample(init.format) * init.numberOfChannels);\n if (!Number.isInteger(numberOfFrames)) {\n throw new TypeError('Invalid AudioDataInit: data size is not a multiple of frame size.');\n }\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp;\n this.duration = numberOfFrames / init.sampleRate;\n let dataBuffer;\n if (init.data instanceof ArrayBuffer) {\n dataBuffer = new Uint8Array(init.data);\n }\n else if (ArrayBuffer.isView(init.data)) {\n dataBuffer = new Uint8Array(init.data.buffer, init.data.byteOffset, init.data.byteLength);\n }\n else {\n throw new TypeError('Invalid AudioDataInit: data is not a BufferSource.');\n }\n const expectedSize = this.numberOfFrames * this.numberOfChannels * getBytesPerSample(this.format);\n if (dataBuffer.byteLength < expectedSize) {\n throw new TypeError('Invalid AudioDataInit: insufficient data size.');\n }\n this._data = dataBuffer;\n }\n finalizationRegistry?.register(this, { type: 'audio', data: this._data }, this);\n }\n /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */\n allocationSize(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const destFormat = options.format ?? this.format;\n const frameOffset = options.frameOffset ?? 0;\n if (frameOffset >= this.numberOfFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = options.frameCount !== undefined ? options.frameCount : (this.numberOfFrames - frameOffset);\n if (copyFrameCount > (this.numberOfFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const bytesPerSample = getBytesPerSample(destFormat);\n const isPlanar = formatIsPlanar(destFormat);\n if (isPlanar && options.planeIndex >= this.numberOfChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!isPlanar && options.planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const elementCount = isPlanar ? copyFrameCount : copyFrameCount * this.numberOfChannels;\n return elementCount * bytesPerSample;\n }\n /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */\n copyTo(destination, options) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\n const destFormat = format ?? this.format;\n if (!destFormat)\n throw new Error('Destination format not determined');\n const numFrames = this.numberOfFrames;\n const numChannels = this.numberOfChannels;\n const frameOffset = optFrameOffset ?? 0;\n if (frameOffset >= numFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = optFrameCount !== undefined ? optFrameCount : (numFrames - frameOffset);\n if (copyFrameCount > (numFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const destBytesPerSample = getBytesPerSample(destFormat);\n const destIsPlanar = formatIsPlanar(destFormat);\n if (destIsPlanar && planeIndex >= numChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!destIsPlanar && planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const destElementCount = destIsPlanar ? copyFrameCount : copyFrameCount * numChannels;\n const requiredSize = destElementCount * destBytesPerSample;\n if (destination.byteLength < requiredSize) {\n throw new RangeError('Destination buffer is too small');\n }\n const destView = toDataView(destination);\n const writeFn = getWriteFunction(destFormat);\n if (isAudioData(this._data)) {\n if (destIsPlanar) {\n if (destFormat === 'f32-planar') {\n // Simple, since the browser must support f32-planar, we can just delegate here\n this._data.copyTo(destination, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n }\n else {\n // Allocate temporary buffer for f32-planar data\n const tempBuffer = new ArrayBuffer(copyFrameCount * 4);\n const tempArray = new Float32Array(tempBuffer);\n this._data.copyTo(tempArray, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n // Convert each f32 sample to destination format\n const tempView = new DataView(tempBuffer);\n for (let i = 0; i < copyFrameCount; i++) {\n const destOffset = i * destBytesPerSample;\n const sample = tempView.getFloat32(i * 4, true);\n writeFn(destView, destOffset, sample);\n }\n }\n }\n else {\n // Destination is interleaved.\n // Allocate a temporary Float32Array to hold one channel's worth of data.\n const numCh = numChannels;\n const temp = new Float32Array(copyFrameCount);\n for (let ch = 0; ch < numCh; ch++) {\n this._data.copyTo(temp, {\n planeIndex: ch,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n for (let i = 0; i < copyFrameCount; i++) {\n const destIndex = i * numCh + ch;\n const destOffset = destIndex * destBytesPerSample;\n writeFn(destView, destOffset, temp[i]);\n }\n }\n }\n }\n else {\n const uint8Data = this._data;\n const srcView = toDataView(uint8Data);\n const srcFormat = this.format;\n const readFn = getReadFunction(srcFormat);\n const srcBytesPerSample = getBytesPerSample(srcFormat);\n const srcIsPlanar = formatIsPlanar(srcFormat);\n for (let i = 0; i < copyFrameCount; i++) {\n if (destIsPlanar) {\n const destOffset = i * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (planeIndex * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + planeIndex) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n else {\n for (let ch = 0; ch < numChannels; ch++) {\n const destIndex = i * numChannels + ch;\n const destOffset = destIndex * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (ch * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + ch) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n }\n }\n }\n }\n /** Clones this audio sample. */\n clone() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n const sample = new AudioSample(this._data.clone());\n sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy)\n return sample;\n }\n else {\n return new AudioSample({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.timestamp,\n data: this._data,\n });\n }\n }\n /**\n * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n finalizationRegistry?.unregister(this);\n if (isAudioData(this._data)) {\n this._data.close();\n }\n else {\n this._data = new Uint8Array(0);\n }\n this._closed = true;\n }\n /**\n * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this\n * method *must* be closed separately from this audio sample.\n */\n toAudioData() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n if (this._data.timestamp === this.microsecondTimestamp) {\n // Timestamp matches, let's just return the data (but cloned)\n return this._data.clone();\n }\n else {\n // It's impossible to simply change an AudioData's timestamp, so we'll need to create a new one\n if (formatIsPlanar(this.format)) {\n const size = this.allocationSize({ planeIndex: 0, format: this.format });\n const data = new ArrayBuffer(size * this.numberOfChannels);\n // We gotta read out each plane individually\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(new Uint8Array(data, i * size, size), { planeIndex: i, format: this.format });\n }\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n else {\n const data = new ArrayBuffer(this.allocationSize({ planeIndex: 0, format: this.format }));\n this.copyTo(data, { planeIndex: 0, format: this.format });\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n }\n }\n else {\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data: this._data.buffer instanceof ArrayBuffer\n ? this._data.buffer\n : this._data.slice(), // In the case of SharedArrayBuffer, convert to ArrayBuffer\n });\n }\n }\n /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */\n toAudioBuffer() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const audioBuffer = new AudioBuffer({\n numberOfChannels: this.numberOfChannels,\n length: this.numberOfFrames,\n sampleRate: this.sampleRate,\n });\n const dataBytes = new Float32Array(this.allocationSize({ planeIndex: 0, format: 'f32-planar' }) / 4);\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(dataBytes, { planeIndex: i, format: 'f32-planar' });\n audioBuffer.copyToChannel(dataBytes, i);\n }\n return audioBuffer;\n }\n /** Sets the presentation timestamp of this audio sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n /** Calls `.close()`. */\n [Symbol.dispose]() {\n this.close();\n }\n /** @internal */\n static *_fromAudioBuffer(audioBuffer, timestamp) {\n if (!(audioBuffer instanceof AudioBuffer)) {\n throw new TypeError('audioBuffer must be an AudioBuffer.');\n }\n const MAX_FLOAT_COUNT = 48000 * 5; // 5 seconds of mono 48 kHz audio per sample\n const numberOfChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const totalFrames = audioBuffer.length;\n const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels);\n let currentRelativeFrame = 0;\n let remainingFrames = totalFrames;\n // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays\n while (remainingFrames > 0) {\n const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames);\n const chunkData = new Float32Array(numberOfChannels * framesToCopy);\n for (let channel = 0; channel < numberOfChannels; channel++) {\n audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame);\n }\n yield new AudioSample({\n format: 'f32-planar',\n sampleRate,\n numberOfFrames: framesToCopy,\n numberOfChannels,\n timestamp: timestamp + currentRelativeFrame / sampleRate,\n data: chunkData,\n });\n currentRelativeFrame += framesToCopy;\n remainingFrames -= framesToCopy;\n }\n }\n /**\n * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly\n * one sample, but may create multiple if the AudioBuffer is exceedingly large.\n */\n static fromAudioBuffer(audioBuffer, timestamp) {\n if (!(audioBuffer instanceof AudioBuffer)) {\n throw new TypeError('audioBuffer must be an AudioBuffer.');\n }\n const MAX_FLOAT_COUNT = 48000 * 5; // 5 seconds of mono 48 kHz audio per sample\n const numberOfChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const totalFrames = audioBuffer.length;\n const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels);\n let currentRelativeFrame = 0;\n let remainingFrames = totalFrames;\n const result = [];\n // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays\n while (remainingFrames > 0) {\n const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames);\n const chunkData = new Float32Array(numberOfChannels * framesToCopy);\n for (let channel = 0; channel < numberOfChannels; channel++) {\n audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame);\n }\n const audioSample = new AudioSample({\n format: 'f32-planar',\n sampleRate,\n numberOfFrames: framesToCopy,\n numberOfChannels,\n timestamp: timestamp + currentRelativeFrame / sampleRate,\n data: chunkData,\n });\n result.push(audioSample);\n currentRelativeFrame += framesToCopy;\n remainingFrames -= framesToCopy;\n }\n return result;\n }\n}\nconst getBytesPerSample = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return 1;\n case 's16':\n case 's16-planar':\n return 2;\n case 's32':\n case 's32-planar':\n return 4;\n case 'f32':\n case 'f32-planar':\n return 4;\n default:\n throw new Error('Unknown AudioSampleFormat');\n }\n};\nconst formatIsPlanar = (format) => {\n switch (format) {\n case 'u8-planar':\n case 's16-planar':\n case 's32-planar':\n case 'f32-planar':\n return true;\n default:\n return false;\n }\n};\nconst getReadFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset) => (view.getUint8(offset) - 128) / 128;\n case 's16':\n case 's16-planar':\n return (view, offset) => view.getInt16(offset, true) / 32768;\n case 's32':\n case 's32-planar':\n return (view, offset) => view.getInt32(offset, true) / 2147483648;\n case 'f32':\n case 'f32-planar':\n return (view, offset) => view.getFloat32(offset, true);\n }\n};\nconst getWriteFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset, value) => view.setUint8(offset, clamp((value + 1) * 127.5, 0, 255));\n case 's16':\n case 's16-planar':\n return (view, offset, value) => view.setInt16(offset, clamp(Math.round(value * 32767), -32768, 32767), true);\n case 's32':\n case 's32-planar':\n return (view, offset, value) => view.setInt32(offset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), true);\n case 'f32':\n case 'f32-planar':\n return (view, offset, value) => view.setFloat32(offset, value, true);\n }\n};\nconst isAudioData = (x) => {\n return typeof AudioData !== 'undefined' && x instanceof AudioData;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildIsobmffMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isQuickTime ? 'quicktime' : 'mp4');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { RichImageData } from '../metadata.js';\nimport { textDecoder } from '../misc.js';\nimport { readAscii, readBytes, readI32Be, readU16Be, readU32Be, readU64Be, readU8 } from '../reader.js';\nexport const MIN_BOX_HEADER_SIZE = 8;\nexport const MAX_BOX_HEADER_SIZE = 16;\nexport const readBoxHeader = (slice) => {\n let totalSize = readU32Be(slice);\n const name = readAscii(slice, 4);\n let headerSize = 8;\n const hasLargeSize = totalSize === 1;\n if (hasLargeSize) {\n totalSize = readU64Be(slice);\n headerSize = 16;\n }\n const contentSize = totalSize - headerSize;\n if (contentSize < 0) {\n return null; // Hardly a box is it\n }\n return { name, totalSize, headerSize, contentSize };\n};\nexport const readFixed_16_16 = (slice) => {\n return readI32Be(slice) / 0x10000;\n};\nexport const readFixed_2_30 = (slice) => {\n return readI32Be(slice) / 0x40000000;\n};\nexport const readIsomVariableInteger = (slice) => {\n let result = 0;\n for (let i = 0; i < 4; i++) {\n result <<= 7;\n const nextByte = readU8(slice);\n result |= nextByte & 0x7f;\n if ((nextByte & 0x80) === 0) {\n break;\n }\n }\n return result;\n};\nexport const readMetadataStringShort = (slice) => {\n let stringLength = readU16Be(slice);\n slice.skip(2); // Language\n stringLength = Math.min(stringLength, slice.remainingLength);\n return textDecoder.decode(readBytes(slice, stringLength));\n};\nexport const readDataBox = (slice) => {\n const header = readBoxHeader(slice);\n if (!header || header.name !== 'data') {\n return null;\n }\n if (slice.remainingLength < 8) {\n // Box is too small\n return null;\n }\n const typeIndicator = readU32Be(slice);\n slice.skip(4); // Locale indicator\n const data = readBytes(slice, header.contentSize - 8);\n switch (typeIndicator) {\n case 1: return textDecoder.decode(data); // UTF-8\n case 2: return new TextDecoder('utf-16be').decode(data); // UTF-16-BE\n case 13: return new RichImageData(data, 'image/jpeg');\n case 14: return new RichImageData(data, 'image/png');\n case 27: return new RichImageData(data, 'image/bmp');\n default: return data;\n }\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/**\n * Image data with additional metadata.\n *\n * @group Metadata tags\n * @public\n */\nexport class RichImageData {\n /** Creates a new {@link RichImageData}. */\n constructor(\n /** The raw image data. */\n data, \n /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */\n mimeType) {\n this.data = data;\n this.mimeType = mimeType;\n if (!(data instanceof Uint8Array)) {\n throw new TypeError('data must be a Uint8Array.');\n }\n if (typeof mimeType !== 'string') {\n throw new TypeError('mimeType must be a string.');\n }\n }\n}\n/**\n * A file attached to a media file.\n *\n * @group Metadata tags\n * @public\n */\nexport class AttachedFile {\n /** Creates a new {@link AttachedFile}. */\n constructor(\n /** The raw file data. */\n data, \n /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */\n mimeType, \n /** The name of the file. */\n name, \n /** A description of the file. */\n description) {\n this.data = data;\n this.mimeType = mimeType;\n this.name = name;\n this.description = description;\n if (!(data instanceof Uint8Array)) {\n throw new TypeError('data must be a Uint8Array.');\n }\n if (mimeType !== undefined && typeof mimeType !== 'string') {\n throw new TypeError('mimeType, when provided, must be a string.');\n }\n if (name !== undefined && typeof name !== 'string') {\n throw new TypeError('name, when provided, must be a string.');\n }\n if (description !== undefined && typeof description !== 'string') {\n throw new TypeError('description, when provided, must be a string.');\n }\n }\n}\n;\nexport const validateMetadataTags = (tags) => {\n if (!tags || typeof tags !== 'object') {\n throw new TypeError('tags must be an object.');\n }\n if (tags.title !== undefined && typeof tags.title !== 'string') {\n throw new TypeError('tags.title, when provided, must be a string.');\n }\n if (tags.description !== undefined && typeof tags.description !== 'string') {\n throw new TypeError('tags.description, when provided, must be a string.');\n }\n if (tags.artist !== undefined && typeof tags.artist !== 'string') {\n throw new TypeError('tags.artist, when provided, must be a string.');\n }\n if (tags.album !== undefined && typeof tags.album !== 'string') {\n throw new TypeError('tags.album, when provided, must be a string.');\n }\n if (tags.albumArtist !== undefined && typeof tags.albumArtist !== 'string') {\n throw new TypeError('tags.albumArtist, when provided, must be a string.');\n }\n if (tags.trackNumber !== undefined && (!Number.isInteger(tags.trackNumber) || tags.trackNumber <= 0)) {\n throw new TypeError('tags.trackNumber, when provided, must be a positive integer.');\n }\n if (tags.tracksTotal !== undefined\n && (!Number.isInteger(tags.tracksTotal) || tags.tracksTotal <= 0)) {\n throw new TypeError('tags.tracksTotal, when provided, must be a positive integer.');\n }\n if (tags.discNumber !== undefined && (!Number.isInteger(tags.discNumber) || tags.discNumber <= 0)) {\n throw new TypeError('tags.discNumber, when provided, must be a positive integer.');\n }\n if (tags.discsTotal !== undefined\n && (!Number.isInteger(tags.discsTotal) || tags.discsTotal <= 0)) {\n throw new TypeError('tags.discsTotal, when provided, must be a positive integer.');\n }\n if (tags.genre !== undefined && typeof tags.genre !== 'string') {\n throw new TypeError('tags.genre, when provided, must be a string.');\n }\n if (tags.date !== undefined && (!(tags.date instanceof Date) || Number.isNaN(tags.date.getTime()))) {\n throw new TypeError('tags.date, when provided, must be a valid Date.');\n }\n if (tags.lyrics !== undefined && typeof tags.lyrics !== 'string') {\n throw new TypeError('tags.lyrics, when provided, must be a string.');\n }\n if (tags.images !== undefined) {\n if (!Array.isArray(tags.images)) {\n throw new TypeError('tags.images, when provided, must be an array.');\n }\n for (const image of tags.images) {\n if (!image || typeof image !== 'object') {\n throw new TypeError('Each image in tags.images must be an object.');\n }\n if (!(image.data instanceof Uint8Array)) {\n throw new TypeError('Each image.data must be a Uint8Array.');\n }\n if (typeof image.mimeType !== 'string') {\n throw new TypeError('Each image.mimeType must be a string.');\n }\n if (!['coverFront', 'coverBack', 'unknown'].includes(image.kind)) {\n throw new TypeError('Each image.kind must be \\'coverFront\\', \\'coverBack\\', or \\'unknown\\'.');\n }\n }\n }\n if (tags.comment !== undefined && typeof tags.comment !== 'string') {\n throw new TypeError('tags.comment, when provided, must be a string.');\n }\n if (tags.raw !== undefined) {\n if (!tags.raw || typeof tags.raw !== 'object') {\n throw new TypeError('tags.raw, when provided, must be an object.');\n }\n for (const value of Object.values(tags.raw)) {\n if (value !== null\n && typeof value !== 'string'\n && !(value instanceof Uint8Array)\n && !(value instanceof RichImageData)\n && !(value instanceof AttachedFile)) {\n throw new TypeError('Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.');\n }\n }\n }\n};\nexport const metadataTagsAreEmpty = (tags) => {\n return tags.title === undefined\n && tags.description === undefined\n && tags.artist === undefined\n && tags.album === undefined\n && tags.albumArtist === undefined\n && tags.trackNumber === undefined\n && tags.tracksTotal === undefined\n && tags.discNumber === undefined\n && tags.discsTotal === undefined\n && tags.genre === undefined\n && tags.date === undefined\n && tags.lyrics === undefined\n && (!tags.images || tags.images.length === 0)\n && tags.comment === undefined\n && (tags.raw === undefined || Object.keys(tags.raw).length === 0);\n};\nexport const DEFAULT_TRACK_DISPOSITION = {\n default: true,\n forced: false,\n original: false,\n commentary: false,\n hearingImpaired: false,\n visuallyImpaired: false,\n};\nexport const validateTrackDisposition = (disposition) => {\n if (!disposition || typeof disposition !== 'object') {\n throw new TypeError('disposition must be an object.');\n }\n if (disposition.default !== undefined && typeof disposition.default !== 'boolean') {\n throw new TypeError('disposition.default must be a boolean.');\n }\n if (disposition.forced !== undefined && typeof disposition.forced !== 'boolean') {\n throw new TypeError('disposition.forced must be a boolean.');\n }\n if (disposition.original !== undefined && typeof disposition.original !== 'boolean') {\n throw new TypeError('disposition.original must be a boolean.');\n }\n if (disposition.commentary !== undefined && typeof disposition.commentary !== 'boolean') {\n throw new TypeError('disposition.commentary must be a boolean.');\n }\n if (disposition.hearingImpaired !== undefined && typeof disposition.hearingImpaired !== 'boolean') {\n throw new TypeError('disposition.hearingImpaired must be a boolean.');\n }\n if (disposition.visuallyImpaired !== undefined && typeof disposition.visuallyImpaired !== 'boolean') {\n throw new TypeError('disposition.visuallyImpaired must be a boolean.');\n }\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { InputDisposedError } from './input.js';\nimport { assert, clamp, getUint24, toDataView } from './misc.js';\nexport class Reader {\n constructor(source) {\n this.source = source;\n }\n requestSlice(start, length) {\n if (this.source._disposed) {\n throw new InputDisposedError();\n }\n if (this.fileSize !== null && start + length > this.fileSize) {\n return null;\n }\n const end = start + length;\n const result = this.source._read(start, end);\n if (result instanceof Promise) {\n return result.then((x) => {\n if (!x) {\n return null;\n }\n return new FileSlice(x.bytes, x.view, x.offset, start, end);\n });\n }\n else {\n if (!result) {\n return null;\n }\n return new FileSlice(result.bytes, result.view, result.offset, start, end);\n }\n }\n requestSliceRange(start, minLength, maxLength) {\n if (this.source._disposed) {\n throw new InputDisposedError();\n }\n if (this.fileSize !== null) {\n return this.requestSlice(start, clamp(this.fileSize - start, minLength, maxLength));\n }\n else {\n const promisedAttempt = this.requestSlice(start, maxLength);\n const handleAttempt = (attempt) => {\n if (attempt) {\n return attempt;\n }\n const handleFileSize = (fileSize) => {\n assert(fileSize !== null); // The slice couldn't fit, meaning we must know the file size now\n return this.requestSlice(start, clamp(fileSize - start, minLength, maxLength));\n };\n const promisedFileSize = this.source._retrieveSize();\n if (promisedFileSize instanceof Promise) {\n return promisedFileSize.then(handleFileSize);\n }\n else {\n return handleFileSize(promisedFileSize);\n }\n };\n if (promisedAttempt instanceof Promise) {\n return promisedAttempt.then(handleAttempt);\n }\n else {\n return handleAttempt(promisedAttempt);\n }\n }\n }\n}\nexport class FileSlice {\n constructor(\n /** The underlying bytes backing this slice. Avoid using this directly and prefer reader functions instead. */\n bytes, \n /** A view into the bytes backing this slice. Avoid using this directly and prefer reader functions instead. */\n view, \n /** The offset in \"file bytes\" at which `bytes` begins in the file. */\n offset, \n /** The offset in \"file bytes\" where this slice begins. */\n start, \n /** The offset in \"file bytes\" where this slice ends (exclusive). */\n end) {\n this.bytes = bytes;\n this.view = view;\n this.offset = offset;\n this.start = start;\n this.end = end;\n this.bufferPos = start - offset;\n }\n static tempFromBytes(bytes) {\n return new FileSlice(bytes, toDataView(bytes), 0, 0, bytes.length);\n }\n get length() {\n return this.end - this.start;\n }\n get filePos() {\n return this.offset + this.bufferPos;\n }\n set filePos(value) {\n this.bufferPos = value - this.offset;\n }\n /** The number of bytes left from the current pos to the end of the slice. */\n get remainingLength() {\n return Math.max(this.end - this.filePos, 0);\n }\n skip(byteCount) {\n this.bufferPos += byteCount;\n }\n /** Creates a new subslice of this slice whose byte range must be contained within this slice. */\n slice(filePos, length = this.end - filePos) {\n if (filePos < this.start || filePos + length > this.end) {\n throw new RangeError('Slicing outside of original slice.');\n }\n return new FileSlice(this.bytes, this.view, this.offset, filePos, filePos + length);\n }\n}\nconst checkIsInRange = (slice, bytesToRead) => {\n if (slice.filePos < slice.start || slice.filePos + bytesToRead > slice.end) {\n throw new RangeError(`Tried reading [${slice.filePos}, ${slice.filePos + bytesToRead}), but slice is`\n + ` [${slice.start}, ${slice.end}). This is likely an internal error, please report it alongside the file`\n + ` that caused it.`);\n }\n};\nexport const readBytes = (slice, length) => {\n checkIsInRange(slice, length);\n const bytes = slice.bytes.subarray(slice.bufferPos, slice.bufferPos + length);\n slice.bufferPos += length;\n return bytes;\n};\nexport const readU8 = (slice) => {\n checkIsInRange(slice, 1);\n return slice.view.getUint8(slice.bufferPos++);\n};\nexport const readU16 = (slice, littleEndian) => {\n checkIsInRange(slice, 2);\n const value = slice.view.getUint16(slice.bufferPos, littleEndian);\n slice.bufferPos += 2;\n return value;\n};\nexport const readU16Be = (slice) => {\n checkIsInRange(slice, 2);\n const value = slice.view.getUint16(slice.bufferPos, false);\n slice.bufferPos += 2;\n return value;\n};\nexport const readU24Be = (slice) => {\n checkIsInRange(slice, 3);\n const value = getUint24(slice.view, slice.bufferPos, false);\n slice.bufferPos += 3;\n return value;\n};\nexport const readI16Be = (slice) => {\n checkIsInRange(slice, 2);\n const value = slice.view.getInt16(slice.bufferPos, false);\n slice.bufferPos += 2;\n return value;\n};\nexport const readU32 = (slice, littleEndian) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getUint32(slice.bufferPos, littleEndian);\n slice.bufferPos += 4;\n return value;\n};\nexport const readU32Be = (slice) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getUint32(slice.bufferPos, false);\n slice.bufferPos += 4;\n return value;\n};\nexport const readU32Le = (slice) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getUint32(slice.bufferPos, true);\n slice.bufferPos += 4;\n return value;\n};\nexport const readI32Be = (slice) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getInt32(slice.bufferPos, false);\n slice.bufferPos += 4;\n return value;\n};\nexport const readI32Le = (slice) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getInt32(slice.bufferPos, true);\n slice.bufferPos += 4;\n return value;\n};\nexport const readU64 = (slice, littleEndian) => {\n let low;\n let high;\n if (littleEndian) {\n low = readU32(slice, true);\n high = readU32(slice, true);\n }\n else {\n high = readU32(slice, false);\n low = readU32(slice, false);\n }\n return high * 0x100000000 + low;\n};\nexport const readU64Be = (slice) => {\n const high = readU32Be(slice);\n const low = readU32Be(slice);\n return high * 0x100000000 + low;\n};\nexport const readI64Be = (slice) => {\n const high = readI32Be(slice);\n const low = readU32Be(slice);\n return high * 0x100000000 + low;\n};\nexport const readI64Le = (slice) => {\n const low = readU32Le(slice);\n const high = readI32Le(slice);\n return high * 0x100000000 + low;\n};\nexport const readF32Be = (slice) => {\n checkIsInRange(slice, 4);\n const value = slice.view.getFloat32(slice.bufferPos, false);\n slice.bufferPos += 4;\n return value;\n};\nexport const readF64Be = (slice) => {\n checkIsInRange(slice, 8);\n const value = slice.view.getFloat64(slice.bufferPos, false);\n slice.bufferPos += 8;\n return value;\n};\nexport const readAscii = (slice, length) => {\n checkIsInRange(slice, length);\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(slice.bytes[slice.bufferPos++]);\n }\n return str;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assertNever, textDecoder, textEncoder } from '../misc.js';\nimport { readBytes, readF32Be, readF64Be, readU8 } from '../reader.js';\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat32 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat64 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLSignedInt {\n constructor(value) {\n this.value = value;\n }\n}\nexport class EBMLUnicodeString {\n constructor(value) {\n this.value = value;\n }\n}\n/** Defines some of the EBML IDs used by Matroska files. */\nexport var EBMLId;\n(function (EBMLId) {\n EBMLId[EBMLId[\"EBML\"] = 440786851] = \"EBML\";\n EBMLId[EBMLId[\"EBMLVersion\"] = 17030] = \"EBMLVersion\";\n EBMLId[EBMLId[\"EBMLReadVersion\"] = 17143] = \"EBMLReadVersion\";\n EBMLId[EBMLId[\"EBMLMaxIDLength\"] = 17138] = \"EBMLMaxIDLength\";\n EBMLId[EBMLId[\"EBMLMaxSizeLength\"] = 17139] = \"EBMLMaxSizeLength\";\n EBMLId[EBMLId[\"DocType\"] = 17026] = \"DocType\";\n EBMLId[EBMLId[\"DocTypeVersion\"] = 17031] = \"DocTypeVersion\";\n EBMLId[EBMLId[\"DocTypeReadVersion\"] = 17029] = \"DocTypeReadVersion\";\n EBMLId[EBMLId[\"Void\"] = 236] = \"Void\";\n EBMLId[EBMLId[\"Segment\"] = 408125543] = \"Segment\";\n EBMLId[EBMLId[\"SeekHead\"] = 290298740] = \"SeekHead\";\n EBMLId[EBMLId[\"Seek\"] = 19899] = \"Seek\";\n EBMLId[EBMLId[\"SeekID\"] = 21419] = \"SeekID\";\n EBMLId[EBMLId[\"SeekPosition\"] = 21420] = \"SeekPosition\";\n EBMLId[EBMLId[\"Duration\"] = 17545] = \"Duration\";\n EBMLId[EBMLId[\"Info\"] = 357149030] = \"Info\";\n EBMLId[EBMLId[\"TimestampScale\"] = 2807729] = \"TimestampScale\";\n EBMLId[EBMLId[\"MuxingApp\"] = 19840] = \"MuxingApp\";\n EBMLId[EBMLId[\"WritingApp\"] = 22337] = \"WritingApp\";\n EBMLId[EBMLId[\"Tracks\"] = 374648427] = \"Tracks\";\n EBMLId[EBMLId[\"TrackEntry\"] = 174] = \"TrackEntry\";\n EBMLId[EBMLId[\"TrackNumber\"] = 215] = \"TrackNumber\";\n EBMLId[EBMLId[\"TrackUID\"] = 29637] = \"TrackUID\";\n EBMLId[EBMLId[\"TrackType\"] = 131] = \"TrackType\";\n EBMLId[EBMLId[\"FlagEnabled\"] = 185] = \"FlagEnabled\";\n EBMLId[EBMLId[\"FlagDefault\"] = 136] = \"FlagDefault\";\n EBMLId[EBMLId[\"FlagForced\"] = 21930] = \"FlagForced\";\n EBMLId[EBMLId[\"FlagOriginal\"] = 21934] = \"FlagOriginal\";\n EBMLId[EBMLId[\"FlagHearingImpaired\"] = 21931] = \"FlagHearingImpaired\";\n EBMLId[EBMLId[\"FlagVisualImpaired\"] = 21932] = \"FlagVisualImpaired\";\n EBMLId[EBMLId[\"FlagCommentary\"] = 21935] = \"FlagCommentary\";\n EBMLId[EBMLId[\"FlagLacing\"] = 156] = \"FlagLacing\";\n EBMLId[EBMLId[\"Name\"] = 21358] = \"Name\";\n EBMLId[EBMLId[\"Language\"] = 2274716] = \"Language\";\n EBMLId[EBMLId[\"LanguageBCP47\"] = 2274717] = \"LanguageBCP47\";\n EBMLId[EBMLId[\"CodecID\"] = 134] = \"CodecID\";\n EBMLId[EBMLId[\"CodecPrivate\"] = 25506] = \"CodecPrivate\";\n EBMLId[EBMLId[\"CodecDelay\"] = 22186] = \"CodecDelay\";\n EBMLId[EBMLId[\"SeekPreRoll\"] = 22203] = \"SeekPreRoll\";\n EBMLId[EBMLId[\"DefaultDuration\"] = 2352003] = \"DefaultDuration\";\n EBMLId[EBMLId[\"Video\"] = 224] = \"Video\";\n EBMLId[EBMLId[\"PixelWidth\"] = 176] = \"PixelWidth\";\n EBMLId[EBMLId[\"PixelHeight\"] = 186] = \"PixelHeight\";\n EBMLId[EBMLId[\"AlphaMode\"] = 21440] = \"AlphaMode\";\n EBMLId[EBMLId[\"Audio\"] = 225] = \"Audio\";\n EBMLId[EBMLId[\"SamplingFrequency\"] = 181] = \"SamplingFrequency\";\n EBMLId[EBMLId[\"Channels\"] = 159] = \"Channels\";\n EBMLId[EBMLId[\"BitDepth\"] = 25188] = \"BitDepth\";\n EBMLId[EBMLId[\"SimpleBlock\"] = 163] = \"SimpleBlock\";\n EBMLId[EBMLId[\"BlockGroup\"] = 160] = \"BlockGroup\";\n EBMLId[EBMLId[\"Block\"] = 161] = \"Block\";\n EBMLId[EBMLId[\"BlockAdditions\"] = 30113] = \"BlockAdditions\";\n EBMLId[EBMLId[\"BlockMore\"] = 166] = \"BlockMore\";\n EBMLId[EBMLId[\"BlockAdditional\"] = 165] = \"BlockAdditional\";\n EBMLId[EBMLId[\"BlockAddID\"] = 238] = \"BlockAddID\";\n EBMLId[EBMLId[\"BlockDuration\"] = 155] = \"BlockDuration\";\n EBMLId[EBMLId[\"ReferenceBlock\"] = 251] = \"ReferenceBlock\";\n EBMLId[EBMLId[\"Cluster\"] = 524531317] = \"Cluster\";\n EBMLId[EBMLId[\"Timestamp\"] = 231] = \"Timestamp\";\n EBMLId[EBMLId[\"Cues\"] = 475249515] = \"Cues\";\n EBMLId[EBMLId[\"CuePoint\"] = 187] = \"CuePoint\";\n EBMLId[EBMLId[\"CueTime\"] = 179] = \"CueTime\";\n EBMLId[EBMLId[\"CueTrackPositions\"] = 183] = \"CueTrackPositions\";\n EBMLId[EBMLId[\"CueTrack\"] = 247] = \"CueTrack\";\n EBMLId[EBMLId[\"CueClusterPosition\"] = 241] = \"CueClusterPosition\";\n EBMLId[EBMLId[\"Colour\"] = 21936] = \"Colour\";\n EBMLId[EBMLId[\"MatrixCoefficients\"] = 21937] = \"MatrixCoefficients\";\n EBMLId[EBMLId[\"TransferCharacteristics\"] = 21946] = \"TransferCharacteristics\";\n EBMLId[EBMLId[\"Primaries\"] = 21947] = \"Primaries\";\n EBMLId[EBMLId[\"Range\"] = 21945] = \"Range\";\n EBMLId[EBMLId[\"Projection\"] = 30320] = \"Projection\";\n EBMLId[EBMLId[\"ProjectionType\"] = 30321] = \"ProjectionType\";\n EBMLId[EBMLId[\"ProjectionPoseRoll\"] = 30325] = \"ProjectionPoseRoll\";\n EBMLId[EBMLId[\"Attachments\"] = 423732329] = \"Attachments\";\n EBMLId[EBMLId[\"AttachedFile\"] = 24999] = \"AttachedFile\";\n EBMLId[EBMLId[\"FileDescription\"] = 18046] = \"FileDescription\";\n EBMLId[EBMLId[\"FileName\"] = 18030] = \"FileName\";\n EBMLId[EBMLId[\"FileMediaType\"] = 18016] = \"FileMediaType\";\n EBMLId[EBMLId[\"FileData\"] = 18012] = \"FileData\";\n EBMLId[EBMLId[\"FileUID\"] = 18094] = \"FileUID\";\n EBMLId[EBMLId[\"Chapters\"] = 272869232] = \"Chapters\";\n EBMLId[EBMLId[\"Tags\"] = 307544935] = \"Tags\";\n EBMLId[EBMLId[\"Tag\"] = 29555] = \"Tag\";\n EBMLId[EBMLId[\"Targets\"] = 25536] = \"Targets\";\n EBMLId[EBMLId[\"TargetTypeValue\"] = 26826] = \"TargetTypeValue\";\n EBMLId[EBMLId[\"TargetType\"] = 25546] = \"TargetType\";\n EBMLId[EBMLId[\"TagTrackUID\"] = 25541] = \"TagTrackUID\";\n EBMLId[EBMLId[\"TagEditionUID\"] = 25545] = \"TagEditionUID\";\n EBMLId[EBMLId[\"TagChapterUID\"] = 25540] = \"TagChapterUID\";\n EBMLId[EBMLId[\"TagAttachmentUID\"] = 25542] = \"TagAttachmentUID\";\n EBMLId[EBMLId[\"SimpleTag\"] = 26568] = \"SimpleTag\";\n EBMLId[EBMLId[\"TagName\"] = 17827] = \"TagName\";\n EBMLId[EBMLId[\"TagLanguage\"] = 17530] = \"TagLanguage\";\n EBMLId[EBMLId[\"TagString\"] = 17543] = \"TagString\";\n EBMLId[EBMLId[\"TagBinary\"] = 17541] = \"TagBinary\";\n EBMLId[EBMLId[\"ContentEncodings\"] = 28032] = \"ContentEncodings\";\n EBMLId[EBMLId[\"ContentEncoding\"] = 25152] = \"ContentEncoding\";\n EBMLId[EBMLId[\"ContentEncodingOrder\"] = 20529] = \"ContentEncodingOrder\";\n EBMLId[EBMLId[\"ContentEncodingScope\"] = 20530] = \"ContentEncodingScope\";\n EBMLId[EBMLId[\"ContentCompression\"] = 20532] = \"ContentCompression\";\n EBMLId[EBMLId[\"ContentCompAlgo\"] = 16980] = \"ContentCompAlgo\";\n EBMLId[EBMLId[\"ContentCompSettings\"] = 16981] = \"ContentCompSettings\";\n EBMLId[EBMLId[\"ContentEncryption\"] = 20533] = \"ContentEncryption\";\n})(EBMLId || (EBMLId = {}));\nexport const LEVEL_0_EBML_IDS = [\n EBMLId.EBML,\n EBMLId.Segment,\n];\n// All the stuff that can appear in a segment, basically\nexport const LEVEL_1_EBML_IDS = [\n EBMLId.SeekHead,\n EBMLId.Info,\n EBMLId.Cluster,\n EBMLId.Tracks,\n EBMLId.Cues,\n EBMLId.Attachments,\n EBMLId.Chapters,\n EBMLId.Tags,\n];\nexport const LEVEL_0_AND_1_EBML_IDS = [\n ...LEVEL_0_EBML_IDS,\n ...LEVEL_1_EBML_IDS,\n];\nexport const measureUnsignedInt = (value) => {\n if (value < (1 << 8)) {\n return 1;\n }\n else if (value < (1 << 16)) {\n return 2;\n }\n else if (value < (1 << 24)) {\n return 3;\n }\n else if (value < 2 ** 32) {\n return 4;\n }\n else if (value < 2 ** 40) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureUnsignedBigInt = (value) => {\n if (value < (1n << 8n)) {\n return 1;\n }\n else if (value < (1n << 16n)) {\n return 2;\n }\n else if (value < (1n << 24n)) {\n return 3;\n }\n else if (value < (1n << 32n)) {\n return 4;\n }\n else if (value < (1n << 40n)) {\n return 5;\n }\n else if (value < (1n << 48n)) {\n return 6;\n }\n else if (value < (1n << 56n)) {\n return 7;\n }\n else {\n return 8;\n }\n};\nexport const measureSignedInt = (value) => {\n if (value >= -(1 << 6) && value < (1 << 6)) {\n return 1;\n }\n else if (value >= -(1 << 13) && value < (1 << 13)) {\n return 2;\n }\n else if (value >= -(1 << 20) && value < (1 << 20)) {\n return 3;\n }\n else if (value >= -(1 << 27) && value < (1 << 27)) {\n return 4;\n }\n else if (value >= -(2 ** 34) && value < 2 ** 34) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureVarInt = (value) => {\n if (value < (1 << 7) - 1) {\n /** Top bit is set, leaving 7 bits to hold the integer, but we can't store\n * 127 because \"all bits set to one\" is a reserved value. Same thing for the\n * other cases below:\n */\n return 1;\n }\n else if (value < (1 << 14) - 1) {\n return 2;\n }\n else if (value < (1 << 21) - 1) {\n return 3;\n }\n else if (value < (1 << 28) - 1) {\n return 4;\n }\n else if (value < 2 ** 35 - 1) {\n return 5;\n }\n else if (value < 2 ** 42 - 1) {\n return 6;\n }\n else {\n throw new Error('EBML varint size not supported ' + value);\n }\n};\nexport class EBMLWriter {\n constructor(writer) {\n this.writer = writer;\n this.helper = new Uint8Array(8);\n this.helperView = new DataView(this.helper.buffer);\n /**\n * Stores the position from the start of the file to where EBML elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = new WeakMap();\n /** Same as offsets, but stores position where the element's data starts (after ID and size fields). */\n this.dataOffsets = new WeakMap();\n }\n writeByte(value) {\n this.helperView.setUint8(0, value);\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeFloat32(value) {\n this.helperView.setFloat32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeFloat64(value) {\n this.helperView.setFloat64(0, value, false);\n this.writer.write(this.helper);\n }\n writeUnsignedInt(value, width = measureUnsignedInt(value)) {\n let pos = 0;\n // Each case falls through:\n switch (width) {\n case 6:\n // Need to use division to access >32 bits of floating point var\n this.helperView.setUint8(pos++, (value / 2 ** 40) | 0);\n // eslint-disable-next-line no-fallthrough\n case 5:\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n // eslint-disable-next-line no-fallthrough\n case 4:\n this.helperView.setUint8(pos++, value >> 24);\n // eslint-disable-next-line no-fallthrough\n case 3:\n this.helperView.setUint8(pos++, value >> 16);\n // eslint-disable-next-line no-fallthrough\n case 2:\n this.helperView.setUint8(pos++, value >> 8);\n // eslint-disable-next-line no-fallthrough\n case 1:\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad unsigned int size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n writeUnsignedBigInt(value, width = measureUnsignedBigInt(value)) {\n let pos = 0;\n for (let i = width - 1; i >= 0; i--) {\n this.helperView.setUint8(pos++, Number((value >> BigInt(i * 8)) & 0xffn));\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n writeSignedInt(value, width = measureSignedInt(value)) {\n if (value < 0) {\n // Two's complement stuff\n value += 2 ** (width * 8);\n }\n this.writeUnsignedInt(value, width);\n }\n writeVarInt(value, width = measureVarInt(value)) {\n let pos = 0;\n switch (width) {\n case 1:\n this.helperView.setUint8(pos++, (1 << 7) | value);\n break;\n case 2:\n this.helperView.setUint8(pos++, (1 << 6) | (value >> 8));\n this.helperView.setUint8(pos++, value);\n break;\n case 3:\n this.helperView.setUint8(pos++, (1 << 5) | (value >> 16));\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 4:\n this.helperView.setUint8(pos++, (1 << 4) | (value >> 24));\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 5:\n /**\n * JavaScript converts its doubles to 32-bit integers for bitwise\n * operations, so we need to do a division by 2^32 instead of a\n * right-shift of 32 to retain those top 3 bits\n */\n this.helperView.setUint8(pos++, (1 << 3) | ((value / 2 ** 32) & 0x7));\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 6:\n this.helperView.setUint8(pos++, (1 << 2) | ((value / 2 ** 40) & 0x3));\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad EBML varint size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n writeAsciiString(str) {\n this.writer.write(new Uint8Array(str.split('').map(x => x.charCodeAt(0))));\n }\n writeEBML(data) {\n if (data === null)\n return;\n if (data instanceof Uint8Array) {\n this.writer.write(data);\n }\n else if (Array.isArray(data)) {\n for (const elem of data) {\n this.writeEBML(elem);\n }\n }\n else {\n this.offsets.set(data, this.writer.getPos());\n this.writeUnsignedInt(data.id); // ID field\n if (Array.isArray(data.data)) {\n const sizePos = this.writer.getPos();\n const sizeSize = data.size === -1 ? 1 : (data.size ?? 4);\n if (data.size === -1) {\n // Write the reserved all-one-bits marker for unknown/unbounded size.\n this.writeByte(0xff);\n }\n else {\n this.writer.seek(this.writer.getPos() + sizeSize);\n }\n const startPos = this.writer.getPos();\n this.dataOffsets.set(data, startPos);\n this.writeEBML(data.data);\n if (data.size !== -1) {\n const size = this.writer.getPos() - startPos;\n const endPos = this.writer.getPos();\n this.writer.seek(sizePos);\n this.writeVarInt(size, sizeSize);\n this.writer.seek(endPos);\n }\n }\n else if (typeof data.data === 'number') {\n const size = data.size ?? measureUnsignedInt(data.data);\n this.writeVarInt(size);\n this.writeUnsignedInt(data.data, size);\n }\n else if (typeof data.data === 'bigint') {\n const size = data.size ?? measureUnsignedBigInt(data.data);\n this.writeVarInt(size);\n this.writeUnsignedBigInt(data.data, size);\n }\n else if (typeof data.data === 'string') {\n this.writeVarInt(data.data.length);\n this.writeAsciiString(data.data);\n }\n else if (data.data instanceof Uint8Array) {\n this.writeVarInt(data.data.byteLength, data.size);\n this.writer.write(data.data);\n }\n else if (data.data instanceof EBMLFloat32) {\n this.writeVarInt(4);\n this.writeFloat32(data.data.value);\n }\n else if (data.data instanceof EBMLFloat64) {\n this.writeVarInt(8);\n this.writeFloat64(data.data.value);\n }\n else if (data.data instanceof EBMLSignedInt) {\n const size = data.size ?? measureSignedInt(data.data.value);\n this.writeVarInt(size);\n this.writeSignedInt(data.data.value, size);\n }\n else if (data.data instanceof EBMLUnicodeString) {\n const bytes = textEncoder.encode(data.data.value);\n this.writeVarInt(bytes.length);\n this.writer.write(bytes);\n }\n else {\n assertNever(data.data);\n }\n }\n }\n}\nexport const MAX_VAR_INT_SIZE = 8;\nexport const MIN_HEADER_SIZE = 2; // 1-byte ID and 1-byte size\nexport const MAX_HEADER_SIZE = 2 * MAX_VAR_INT_SIZE; // 8-byte ID and 8-byte size\nexport const readVarIntSize = (slice) => {\n const firstByte = readU8(slice);\n slice.skip(-1);\n if (firstByte === 0) {\n return null; // Invalid VINT\n }\n let width = 1;\n let mask = 0x80;\n while ((firstByte & mask) === 0) {\n width++;\n mask >>= 1;\n }\n return width;\n};\nexport const readVarInt = (slice) => {\n // Read the first byte to determine the width of the variable-length integer\n const firstByte = readU8(slice);\n if (firstByte === 0) {\n return null; // Invalid VINT\n }\n // Find the position of VINT_MARKER, which determines the width\n let width = 1;\n let mask = 1 << 7;\n while ((firstByte & mask) === 0) {\n width++;\n mask >>= 1;\n }\n // First byte's value needs the marker bit cleared\n let value = firstByte & (mask - 1);\n // Read remaining bytes\n for (let i = 1; i < width; i++) {\n value *= 1 << 8;\n value += readU8(slice);\n }\n return value;\n};\nexport const readUnsignedInt = (slice, width) => {\n if (width < 1 || width > 8) {\n throw new Error('Bad unsigned int size ' + width);\n }\n let value = 0;\n // Read bytes from most significant to least significant\n for (let i = 0; i < width; i++) {\n value *= 1 << 8;\n value += readU8(slice);\n }\n return value;\n};\nexport const readUnsignedBigInt = (slice, width) => {\n if (width < 1) {\n throw new Error('Bad unsigned int size ' + width);\n }\n let value = 0n;\n for (let i = 0; i < width; i++) {\n value <<= 8n;\n value += BigInt(readU8(slice));\n }\n return value;\n};\nexport const readSignedInt = (slice, width) => {\n let value = readUnsignedInt(slice, width);\n // If the highest bit is set, convert from two's complement\n if (value & (1 << (width * 8 - 1))) {\n value -= 2 ** (width * 8);\n }\n return value;\n};\nexport const readElementId = (slice) => {\n const size = readVarIntSize(slice);\n if (size === null) {\n return null;\n }\n const id = readUnsignedInt(slice, size);\n return id;\n};\nexport const readElementSize = (slice) => {\n let size = readU8(slice);\n if (size === 0xff) {\n size = null;\n }\n else {\n slice.skip(-1);\n size = readVarInt(slice);\n // In some (livestreamed) files, this is the value of the size field. While this technically is just a very\n // large number, it is intended to behave like the reserved size 0xFF, meaning the size is undefined. We\n // catch the number here. Note that it cannot be perfectly represented as a double, but the comparison works\n // nonetheless.\n // eslint-disable-next-line no-loss-of-precision\n if (size === 0x00ffffffffffffff) {\n size = null;\n }\n }\n return size;\n};\nexport const readElementHeader = (slice) => {\n const id = readElementId(slice);\n if (id === null) {\n return null;\n }\n const size = readElementSize(slice);\n return { id, size };\n};\nexport const readAsciiString = (slice, length) => {\n const bytes = readBytes(slice, length);\n // Actual string length might be shorter due to null terminators\n let strLength = 0;\n while (strLength < length && bytes[strLength] !== 0) {\n strLength += 1;\n }\n return String.fromCharCode(...bytes.subarray(0, strLength));\n};\nexport const readUnicodeString = (slice, length) => {\n const bytes = readBytes(slice, length);\n // Actual string length might be shorter due to null terminators\n let strLength = 0;\n while (strLength < length && bytes[strLength] !== 0) {\n strLength += 1;\n }\n return textDecoder.decode(bytes.subarray(0, strLength));\n};\nexport const readFloat = (slice, width) => {\n if (width === 0) {\n return 0;\n }\n if (width !== 4 && width !== 8) {\n throw new Error('Bad float size ' + width);\n }\n return width === 4 ? readF32Be(slice) : readF64Be(slice);\n};\n/** Returns the byte offset in the file of the next element with a matching ID. */\nexport const searchForNextElementId = async (reader, startPos, ids, until) => {\n const idsSet = new Set(ids);\n let currentPos = startPos;\n while (until === null || currentPos < until) {\n let slice = reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementHeader = readElementHeader(slice);\n if (!elementHeader) {\n break;\n }\n if (idsSet.has(elementHeader.id)) {\n return { pos: currentPos, found: true };\n }\n assertDefinedSize(elementHeader.size);\n currentPos = slice.filePos + elementHeader.size;\n }\n return { pos: (until !== null && until > currentPos) ? until : currentPos, found: false };\n};\n/** Searches for the next occurrence of an element ID using a naive byte-wise search. */\nexport const resync = async (reader, startPos, ids, until) => {\n const CHUNK_SIZE = 2 ** 16; // So we don't need to grab thousands of slices\n const idsSet = new Set(ids);\n let currentPos = startPos;\n while (currentPos < until) {\n let slice = reader.requestSliceRange(currentPos, 0, Math.min(CHUNK_SIZE, until - currentPos));\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n if (slice.length < MAX_VAR_INT_SIZE)\n break;\n for (let i = 0; i < slice.length - MAX_VAR_INT_SIZE; i++) {\n slice.filePos = currentPos;\n const elementId = readElementId(slice);\n if (elementId !== null && idsSet.has(elementId)) {\n return currentPos;\n }\n currentPos++;\n }\n }\n return null;\n};\nexport const CODEC_STRING_MAP = {\n 'avc': 'V_MPEG4/ISO/AVC',\n 'hevc': 'V_MPEGH/ISO/HEVC',\n 'vp8': 'V_VP8',\n 'vp9': 'V_VP9',\n 'av1': 'V_AV1',\n 'aac': 'A_AAC',\n 'mp3': 'A_MPEG/L3',\n 'opus': 'A_OPUS',\n 'vorbis': 'A_VORBIS',\n 'flac': 'A_FLAC',\n 'pcm-u8': 'A_PCM/INT/LIT',\n 'pcm-s16': 'A_PCM/INT/LIT',\n 'pcm-s16be': 'A_PCM/INT/BIG',\n 'pcm-s24': 'A_PCM/INT/LIT',\n 'pcm-s24be': 'A_PCM/INT/BIG',\n 'pcm-s32': 'A_PCM/INT/LIT',\n 'pcm-s32be': 'A_PCM/INT/BIG',\n 'pcm-f32': 'A_PCM/FLOAT/IEEE',\n 'pcm-f64': 'A_PCM/FLOAT/IEEE',\n 'webvtt': 'S_TEXT/WEBVTT',\n};\nexport function assertDefinedSize(size) {\n if (size === null) {\n throw new Error('Undefined element size is used in a place where it is not supported.');\n }\n}\n;\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAv1CodecInfoFromPacket, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, extractVp9CodecInfoFromPacket, } from '../codec-data.js';\nimport { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { AttachedFile, DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, binarySearchLessOrEqual, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundIfAlmostInteger, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { assertDefinedSize, CODEC_STRING_MAP, EBMLId, LEVEL_0_AND_1_EBML_IDS, LEVEL_1_EBML_IDS, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readUnicodeString, readElementHeader, readElementId, readFloat, readUnsignedInt, readVarInt, resync, searchForNextElementId, readUnsignedBigInt, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nimport { FileSlice, readBytes, readI16Be, readU8 } from '../reader.js';\nvar BlockLacing;\n(function (BlockLacing) {\n BlockLacing[BlockLacing[\"None\"] = 0] = \"None\";\n BlockLacing[BlockLacing[\"Xiph\"] = 1] = \"Xiph\";\n BlockLacing[BlockLacing[\"FixedSize\"] = 2] = \"FixedSize\";\n BlockLacing[BlockLacing[\"Ebml\"] = 3] = \"Ebml\";\n})(BlockLacing || (BlockLacing = {}));\nvar ContentEncodingScope;\n(function (ContentEncodingScope) {\n ContentEncodingScope[ContentEncodingScope[\"Block\"] = 1] = \"Block\";\n ContentEncodingScope[ContentEncodingScope[\"Private\"] = 2] = \"Private\";\n ContentEncodingScope[ContentEncodingScope[\"Next\"] = 4] = \"Next\";\n})(ContentEncodingScope || (ContentEncodingScope = {}));\nvar ContentCompAlgo;\n(function (ContentCompAlgo) {\n ContentCompAlgo[ContentCompAlgo[\"Zlib\"] = 0] = \"Zlib\";\n ContentCompAlgo[ContentCompAlgo[\"Bzlib\"] = 1] = \"Bzlib\";\n ContentCompAlgo[ContentCompAlgo[\"lzo1x\"] = 2] = \"lzo1x\";\n ContentCompAlgo[ContentCompAlgo[\"HeaderStripping\"] = 3] = \"HeaderStripping\";\n})(ContentCompAlgo || (ContentCompAlgo = {}));\nconst METADATA_ELEMENTS = [\n { id: EBMLId.SeekHead, flag: 'seekHeadSeen' },\n { id: EBMLId.Info, flag: 'infoSeen' },\n { id: EBMLId.Tracks, flag: 'tracksSeen' },\n { id: EBMLId.Cues, flag: 'cuesSeen' },\n];\nconst MAX_RESYNC_LENGTH = 10 * 2 ** 20; // 10 MiB\nexport class MatroskaDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.readMetadataPromise = null;\n this.segments = [];\n this.currentSegment = null;\n this.currentTrack = null;\n this.currentCluster = null;\n this.currentBlock = null;\n this.currentBlockAdditional = null;\n this.currentCueTime = null;\n this.currentDecodingInstruction = null;\n this.currentTagTargetIsMovie = true;\n this.currentSimpleTagName = null;\n this.currentAttachedFile = null;\n this.isWebM = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack));\n }\n async getMimeType() {\n await this.readMetadata();\n const tracks = await this.getTracks();\n const codecStrings = await Promise.all(tracks.map(x => x.getCodecParameterString()));\n return buildMatroskaMimeType({\n isWebM: this.isWebM,\n hasVideo: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video')),\n hasAudio: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio')),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n // Load metadata tags from each segment lazily (only once)\n for (const segment of this.segments) {\n if (!segment.metadataTagsCollected) {\n if (this.reader.fileSize !== null) {\n await this.loadSegmentMetadata(segment);\n }\n else {\n // The seeking would be too crazy, let's not\n }\n segment.metadataTagsCollected = true;\n }\n }\n // This is kinda handwavy, and how we handle multiple segments isn't suuuuper well-defined anyway; so we just\n // shallow-merge metadata tags from all (usually just one) segments.\n let metadataTags = {};\n for (const segment of this.segments) {\n metadataTags = { ...metadataTags, ...segment.metadataTags };\n }\n return metadataTags;\n }\n readMetadata() {\n return this.readMetadataPromise ??= (async () => {\n let currentPos = 0;\n // Loop over all top-level elements in the file\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const header = readElementHeader(slice);\n if (!header) {\n break; // Zero padding at the end of the file triggers this, for example\n }\n const id = header.id;\n let size = header.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.EBML) {\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n this.readContiguousElements(slice);\n }\n else if (id === EBMLId.Segment) { // Segment found!\n await this.readSegment(dataStartPos, size);\n if (size === null) {\n // Segment sizes can be undefined (common in livestreamed files), so assume this is the last\n // and only segment\n break;\n }\n if (this.reader.fileSize === null) {\n break; // Stop at the first segment\n }\n }\n else if (id === EBMLId.Cluster) {\n if (this.reader.fileSize === null) {\n break; // Shouldn't be reached anyway, since we stop at the first segment\n }\n // Clusters are not a top-level element in Matroska, but some files contain a Segment whose size\n // doesn't contain any of the clusters that follow it. In the case, we apply the following logic: if\n // we find a top-level cluster, attribute it to the previous segment.\n if (size === null) {\n // Just in case this is one of those weird sizeless clusters, let's do our best and still try to\n // determine its size.\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, this.reader.fileSize);\n size = nextElementPos.pos - dataStartPos;\n }\n const lastSegment = last(this.segments);\n if (lastSegment) {\n // Extend the previous segment's size\n lastSegment.elementEndPos = dataStartPos + size;\n }\n }\n assertDefinedSize(size);\n currentPos = dataStartPos + size;\n }\n })();\n }\n async readSegment(segmentDataStart, dataSize) {\n this.currentSegment = {\n seekHeadSeen: false,\n infoSeen: false,\n tracksSeen: false,\n cuesSeen: false,\n tagsSeen: false,\n attachmentsSeen: false,\n timestampScale: -1,\n timestampFactor: -1,\n duration: -1,\n seekEntries: [],\n tracks: [],\n cuePoints: [],\n dataStartPos: segmentDataStart,\n elementEndPos: dataSize === null\n ? null // Assume it goes until the end of the file\n : segmentDataStart + dataSize,\n clusterSeekStartPos: segmentDataStart,\n lastReadCluster: null,\n metadataTags: {},\n metadataTagsCollected: false,\n };\n this.segments.push(this.currentSegment);\n let currentPos = segmentDataStart;\n while (this.currentSegment.elementEndPos === null || currentPos < this.currentSegment.elementEndPos) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementStartPos = currentPos;\n const header = readElementHeader(slice);\n if (!header || (!LEVEL_1_EBML_IDS.includes(header.id) && header.id !== EBMLId.Void)) {\n // Potential junk. Let's try to resync\n const nextPos = await resync(this.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(this.currentSegment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n const metadataElementIndex = METADATA_ELEMENTS.findIndex(x => x.id === id);\n if (metadataElementIndex !== -1) {\n const field = METADATA_ELEMENTS[metadataElementIndex].flag;\n this.currentSegment[field] = true;\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Tags || id === EBMLId.Attachments) {\n // Metadata found at the beginning of the segment, great, let's parse it\n if (id === EBMLId.Tags) {\n this.currentSegment.tagsSeen = true;\n }\n else {\n this.currentSegment.attachmentsSeen = true;\n }\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Cluster) {\n this.currentSegment.clusterSeekStartPos = elementStartPos;\n break; // Stop at the first cluster\n }\n if (size === null) {\n break;\n }\n else {\n currentPos = dataStartPos + size;\n }\n }\n // Sort the seek entries by file position so reading them exhibits a sequential pattern\n this.currentSegment.seekEntries.sort((a, b) => a.segmentPosition - b.segmentPosition);\n if (this.reader.fileSize !== null) {\n // Use the seek head to read missing metadata elements\n for (const seekEntry of this.currentSegment.seekEntries) {\n const target = METADATA_ELEMENTS.find(x => x.id === seekEntry.id);\n if (!target) {\n continue;\n }\n if (this.currentSegment[target.flag])\n continue;\n let slice = this.reader.requestSliceRange(segmentDataStart + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header)\n continue;\n const { id, size } = header;\n if (id !== target.id)\n continue;\n assertDefinedSize(size);\n this.currentSegment[target.flag] = true;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n continue;\n this.readContiguousElements(dataSlice);\n }\n }\n if (this.currentSegment.timestampScale === -1) {\n // TimestampScale element is missing. Technically an invalid file, but let's default to the typical value,\n // which is 1e6.\n this.currentSegment.timestampScale = 1e6;\n this.currentSegment.timestampFactor = 1e9 / 1e6;\n }\n // Put default tracks first\n this.currentSegment.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n // Now, let's distribute the cue points to the tracks\n const idToTrack = new Map(this.currentSegment.tracks.map(x => [x.id, x]));\n // Assign cue points to their respective tracks\n for (const cuePoint of this.currentSegment.cuePoints) {\n const track = idToTrack.get(cuePoint.trackId);\n if (track) {\n track.cuePoints.push(cuePoint);\n }\n }\n for (const track of this.currentSegment.tracks) {\n // Sort cue points by time\n track.cuePoints.sort((a, b) => a.time - b.time);\n // Remove multiple cue points for the same time\n for (let i = 0; i < track.cuePoints.length - 1; i++) {\n const cuePoint1 = track.cuePoints[i];\n const cuePoint2 = track.cuePoints[i + 1];\n if (cuePoint1.time === cuePoint2.time) {\n track.cuePoints.splice(i + 1, 1);\n i--;\n }\n }\n }\n let trackWithMostCuePoints = null;\n let maxCuePointCount = -Infinity;\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length > maxCuePointCount) {\n maxCuePointCount = track.cuePoints.length;\n trackWithMostCuePoints = track;\n }\n }\n // For every track that has received 0 cue points (can happen, often only the video track receives cue points),\n // we still want to have better seeking. Therefore, let's give it the cue points of the track with the most cue\n // points, which should provide us with the most fine-grained seeking.\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length === 0) {\n track.cuePoints = trackWithMostCuePoints.cuePoints;\n }\n }\n this.currentSegment = null;\n }\n async readCluster(startPos, segment) {\n if (segment.lastReadCluster?.elementStartPos === startPos) {\n return segment.lastReadCluster;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const elementStartPos = startPos;\n const elementHeader = readElementHeader(headerSlice);\n assert(elementHeader);\n const id = elementHeader.id;\n assert(id === EBMLId.Cluster);\n let size = elementHeader.size;\n const dataStartPos = headerSlice.filePos;\n if (size === null) {\n // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of\n // it, so we have no other choice but to iterate over the EBML structure until we find an element at level\n // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2).\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n // Load the entire cluster\n let dataSlice = this.reader.requestSlice(dataStartPos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n const cluster = {\n segment,\n elementStartPos,\n elementEndPos: dataStartPos + size,\n dataStartPos,\n timestamp: -1,\n trackData: new Map(),\n };\n this.currentCluster = cluster;\n if (dataSlice) {\n // Read the children of the cluster, stopping early at level 0 or 1 EBML elements. We do this because some\n // clusters have incorrect sizes that are too large\n const endPos = this.readContiguousElements(dataSlice, LEVEL_0_AND_1_EBML_IDS);\n cluster.elementEndPos = endPos;\n }\n for (const [, trackData] of cluster.trackData) {\n const track = trackData.track;\n // This must hold, as track datas only get created if a block for that track is encountered\n assert(trackData.blocks.length > 0);\n let hasLacedBlocks = false;\n for (let i = 0; i < trackData.blocks.length; i++) {\n const block = trackData.blocks[i];\n block.timestamp += cluster.timestamp;\n hasLacedBlocks ||= block.lacing !== BlockLacing.None;\n }\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentBlock = trackData.blocks[currentEntry.blockIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentBlock.timestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update block durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp;\n }\n else if (currentBlock.duration === 0) {\n if (track.defaultDuration != null) {\n if (currentBlock.lacing === BlockLacing.None) {\n currentBlock.duration = track.defaultDuration;\n }\n else {\n // Handled by the lace resolution code\n }\n }\n }\n }\n if (hasLacedBlocks) {\n // Perform lace resolution. Here, we expand each laced block into multiple blocks where each contains\n // one frame of the lace. We do this after determining block timestamps so we can properly distribute\n // the block's duration across the laced frames.\n this.expandLacedBlocks(trackData.blocks, track);\n // Recompute since blocks have changed\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n }\n const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex];\n const lastBlock = trackData.blocks[last(trackData.presentationTimestamps).blockIndex];\n trackData.startTimestamp = firstBlock.timestamp;\n trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration;\n // Let's remember that a cluster with a given timestamp is here, speeding up future lookups if no cues exist\n const insertionIndex = binarySearchLessOrEqual(track.clusterPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || track.clusterPositionCache[insertionIndex].elementStartPos !== elementStartPos) {\n track.clusterPositionCache.splice(insertionIndex + 1, 0, {\n elementStartPos: cluster.elementStartPos,\n startTimestamp: trackData.startTimestamp,\n });\n }\n }\n segment.lastReadCluster = cluster;\n return cluster;\n }\n getTrackDataInCluster(cluster, trackNumber) {\n let trackData = cluster.trackData.get(trackNumber);\n if (!trackData) {\n const track = cluster.segment.tracks.find(x => x.id === trackNumber);\n if (!track) {\n return null;\n }\n trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n blocks: [],\n presentationTimestamps: [],\n };\n cluster.trackData.set(trackNumber, trackData);\n }\n return trackData;\n }\n expandLacedBlocks(blocks, track) {\n // https://www.matroska.org/technical/notes.html#block-lacing\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const originalBlock = blocks[blockIndex];\n if (originalBlock.lacing === BlockLacing.None) {\n continue;\n }\n // Decode the block data if it hasn't been decoded yet (needed for lacing expansion)\n if (!originalBlock.decoded) {\n originalBlock.data = this.decodeBlockData(track, originalBlock.data);\n originalBlock.decoded = true;\n }\n const slice = FileSlice.tempFromBytes(originalBlock.data);\n const frameSizes = [];\n const frameCount = readU8(slice) + 1;\n switch (originalBlock.lacing) {\n case BlockLacing.Xiph:\n {\n let totalUsedSize = 0;\n // Xiph lacing, just like in Ogg\n for (let i = 0; i < frameCount - 1; i++) {\n let frameSize = 0;\n while (slice.bufferPos < slice.length) {\n const value = readU8(slice);\n frameSize += value;\n if (value < 255) {\n frameSizes.push(frameSize);\n totalUsedSize += frameSize;\n break;\n }\n }\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n case BlockLacing.FixedSize:\n {\n // Fixed size lacing: all frames have same size\n const totalDataSize = slice.length - 1; // Minus the frame count byte\n const frameSize = Math.floor(totalDataSize / frameCount);\n for (let i = 0; i < frameCount; i++) {\n frameSizes.push(frameSize);\n }\n }\n ;\n break;\n case BlockLacing.Ebml:\n {\n // EBML lacing: first size absolute, subsequent ones are coded as signed differences from the last\n const firstResult = readVarInt(slice);\n assert(firstResult !== null); // Assume it's not an invalid VINT\n let currentSize = firstResult;\n frameSizes.push(currentSize);\n let totalUsedSize = currentSize;\n for (let i = 1; i < frameCount - 1; i++) {\n const startPos = slice.bufferPos;\n const diffResult = readVarInt(slice);\n assert(diffResult !== null);\n const unsignedDiff = diffResult;\n const width = slice.bufferPos - startPos;\n const bias = (1 << (width * 7 - 1)) - 1; // Typo-corrected version of 2^((7*n)-1)^-1\n const diff = unsignedDiff - bias;\n currentSize += diff;\n frameSizes.push(currentSize);\n totalUsedSize += currentSize;\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n default: assert(false);\n }\n assert(frameSizes.length === frameCount);\n blocks.splice(blockIndex, 1); // Remove the original block\n const blockDuration = originalBlock.duration || frameCount * (track.defaultDuration ?? 0);\n // Now, let's insert each frame as its own block\n for (let i = 0; i < frameCount; i++) {\n const frameSize = frameSizes[i];\n const frameData = readBytes(slice, frameSize);\n // Distribute timestamps evenly across the block duration\n const frameTimestamp = originalBlock.timestamp + (blockDuration * i / frameCount);\n const frameDuration = blockDuration / frameCount;\n blocks.splice(blockIndex + i, 0, {\n timestamp: frameTimestamp,\n duration: frameDuration,\n isKeyFrame: originalBlock.isKeyFrame,\n data: frameData,\n lacing: BlockLacing.None,\n decoded: true,\n mainAdditional: originalBlock.mainAdditional,\n });\n }\n blockIndex += frameCount; // Skip the blocks we just added\n blockIndex--;\n }\n }\n async loadSegmentMetadata(segment) {\n for (const seekEntry of segment.seekEntries) {\n if (seekEntry.id === EBMLId.Tags && !segment.tagsSeen) {\n // We need to load the tags\n }\n else if (seekEntry.id === EBMLId.Attachments && !segment.attachmentsSeen) {\n // We need to load the attachments\n }\n else {\n continue;\n }\n let slice = this.reader.requestSliceRange(segment.dataStartPos + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header || header.id !== seekEntry.id)\n continue;\n const { size } = header;\n assertDefinedSize(size);\n assert(!this.currentSegment);\n this.currentSegment = segment;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (dataSlice) {\n this.readContiguousElements(dataSlice);\n }\n this.currentSegment = null;\n // Mark as seen\n if (seekEntry.id === EBMLId.Tags) {\n segment.tagsSeen = true;\n }\n else if (seekEntry.id === EBMLId.Attachments) {\n segment.attachmentsSeen = true;\n }\n }\n }\n readContiguousElements(slice, stopIds) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_HEADER_SIZE) {\n const startPos = slice.filePos;\n const foundElement = this.traverseElement(slice, stopIds);\n if (!foundElement) {\n return startPos;\n }\n }\n return slice.filePos;\n }\n traverseElement(slice, stopIds) {\n const header = readElementHeader(slice);\n if (!header) {\n return false;\n }\n if (stopIds && stopIds.includes(header.id)) {\n return false;\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n assertDefinedSize(size);\n switch (id) {\n case EBMLId.DocType:\n {\n this.isWebM = readAsciiString(slice, size) === 'webm';\n }\n ;\n break;\n case EBMLId.Seek:\n {\n if (!this.currentSegment)\n break;\n const seekEntry = { id: -1, segmentPosition: -1 };\n this.currentSegment.seekEntries.push(seekEntry);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) {\n this.currentSegment.seekEntries.pop();\n }\n }\n ;\n break;\n case EBMLId.SeekID:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SeekPosition:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.segmentPosition = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TimestampScale:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.timestampScale = readUnsignedInt(slice, size);\n this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale;\n }\n ;\n break;\n case EBMLId.Duration:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.duration = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.TrackEntry:\n {\n if (!this.currentSegment)\n break;\n this.currentTrack = {\n id: -1,\n segment: this.currentSegment,\n demuxer: this,\n clusterPositionCache: [],\n cuePoints: [],\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n inputTrack: null,\n codecId: null,\n codecPrivate: null,\n defaultDuration: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n decodingInstructions: [],\n info: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentTrack.decodingInstructions.some((instruction) => {\n return instruction.data?.type !== 'decompress'\n || instruction.scope !== ContentEncodingScope.Block\n || instruction.data.algorithm !== ContentCompAlgo.HeaderStripping;\n })) {\n console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`);\n this.currentTrack = null;\n }\n if (this.currentTrack\n && this.currentTrack.id !== -1\n && this.currentTrack.codecId\n && this.currentTrack.info) {\n const slashIndex = this.currentTrack.codecId.indexOf('/');\n const codecIdWithoutSuffix = slashIndex === -1\n ? this.currentTrack.codecId\n : this.currentTrack.codecId.slice(0, slashIndex);\n if (this.currentTrack.info.type === 'video'\n && this.currentTrack.info.width !== -1\n && this.currentTrack.info.height !== -1) {\n if (this.currentTrack.codecId === CODEC_STRING_MAP.avc) {\n this.currentTrack.info.codec = 'avc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.hevc) {\n this.currentTrack.info.codec = 'hevc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp8) {\n this.currentTrack.info.codec = 'vp8';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp9) {\n this.currentTrack.info.codec = 'vp9';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.av1) {\n this.currentTrack.info.codec = 'av1';\n }\n const videoTrack = this.currentTrack;\n const inputTrack = new InputVideoTrack(this.input, new MatroskaVideoTrackBacking(videoTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n else if (this.currentTrack.info.type === 'audio'\n && this.currentTrack.info.numberOfChannels !== -1\n && this.currentTrack.info.sampleRate !== -1) {\n if (codecIdWithoutSuffix === CODEC_STRING_MAP.aac) {\n this.currentTrack.info.codec = 'aac';\n this.currentTrack.info.aacCodecInfo = {\n isMpeg2: this.currentTrack.codecId.includes('MPEG2'),\n };\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.mp3) {\n this.currentTrack.info.codec = 'mp3';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.opus) {\n this.currentTrack.info.codec = 'opus';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n this.currentTrack.info.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vorbis) {\n this.currentTrack.info.codec = 'vorbis';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {\n this.currentTrack.info.codec = 'flac';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16be';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24be';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32be';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') {\n if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-f32';\n }\n else if (this.currentTrack.info.bitDepth === 64) {\n this.currentTrack.info.codec = 'pcm-f64';\n }\n }\n const audioTrack = this.currentTrack;\n const inputTrack = new InputAudioTrack(this.input, new MatroskaAudioTrackBacking(audioTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case EBMLId.TrackNumber:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TrackType:\n {\n if (!this.currentTrack)\n break;\n const type = readUnsignedInt(slice, size);\n if (type === 1) {\n this.currentTrack.info = {\n type: 'video',\n width: -1,\n height: -1,\n rotation: 0,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n alphaMode: false,\n };\n }\n else if (type === 2) {\n this.currentTrack.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n bitDepth: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case EBMLId.FlagEnabled:\n {\n if (!this.currentTrack)\n break;\n const enabled = readUnsignedInt(slice, size);\n if (!enabled) {\n this.currentSegment.tracks.pop();\n this.currentTrack = null;\n }\n }\n ;\n break;\n case EBMLId.FlagDefault:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.default = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagForced:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.forced = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagOriginal:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.original = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagHearingImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.hearingImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagVisualImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.visuallyImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagCommentary:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.commentary = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CodecID:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecId = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.CodecPrivate:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecPrivate = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.DefaultDuration:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.defaultDuration\n = this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9;\n }\n ;\n break;\n case EBMLId.Name:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.name = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.Language:\n {\n if (!this.currentTrack)\n break;\n if (this.currentTrack.languageCode !== UNDETERMINED_LANGUAGE) {\n // LanguageBCP47 was present, which takes precedence\n break;\n }\n this.currentTrack.languageCode = readAsciiString(slice, size);\n if (!isIso639Dash2LanguageCode(this.currentTrack.languageCode)) {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.LanguageBCP47:\n {\n if (!this.currentTrack)\n break;\n const bcp47 = readAsciiString(slice, size);\n const languageSubtag = bcp47.split('-')[0];\n if (languageSubtag) {\n // Technically invalid, for now: The language subtag might be a language code from ISO 639-1,\n // ISO 639-2, ISO 639-3, ISO 639-5 or some other thing (source: Wikipedia). But, `languageCode` is\n // documented as ISO 639-2. Changing the definition would be a breaking change. This will get\n // cleaned up in the future by defining languageCode to be BCP 47 instead.\n this.currentTrack.languageCode = languageSubtag;\n }\n else {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.Video:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.PixelWidth:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.width = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.PixelHeight:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.height = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.AlphaMode:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.alphaMode = readUnsignedInt(slice, size) === 1;\n }\n ;\n break;\n case EBMLId.Colour:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.colorSpace = {};\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.MatrixCoefficients:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const matrixCoefficients = readUnsignedInt(slice, size);\n const mapped = MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients] ?? null;\n this.currentTrack.info.colorSpace.matrix = mapped;\n }\n ;\n break;\n case EBMLId.Range:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n this.currentTrack.info.colorSpace.fullRange = readUnsignedInt(slice, size) === 2;\n }\n ;\n break;\n case EBMLId.TransferCharacteristics:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const transferCharacteristics = readUnsignedInt(slice, size);\n const mapped = TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics] ?? null;\n this.currentTrack.info.colorSpace.transfer = mapped;\n }\n ;\n break;\n case EBMLId.Primaries:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const primaries = readUnsignedInt(slice, size);\n const mapped = COLOR_PRIMARIES_MAP_INVERSE[primaries] ?? null;\n this.currentTrack.info.colorSpace.primaries = mapped;\n }\n ;\n break;\n case EBMLId.Projection:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ProjectionPoseRoll:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n const rotation = readFloat(slice, size);\n const flippedRotation = -rotation; // Convert counter-clockwise to clockwise\n try {\n this.currentTrack.info.rotation = normalizeRotation(flippedRotation);\n }\n catch {\n // It wasn't a valid rotation\n }\n }\n ;\n break;\n case EBMLId.Audio:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.SamplingFrequency:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.sampleRate = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.Channels:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.numberOfChannels = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BitDepth:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.bitDepth = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CuePoint:\n {\n if (!this.currentSegment)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentCueTime = null;\n }\n ;\n break;\n case EBMLId.CueTime:\n {\n this.currentCueTime = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueTrackPositions:\n {\n if (this.currentCueTime === null)\n break;\n assert(this.currentSegment);\n const cuePoint = { time: this.currentCueTime, trackId: -1, clusterPosition: -1 };\n this.currentSegment.cuePoints.push(cuePoint);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) {\n this.currentSegment.cuePoints.pop();\n }\n }\n ;\n break;\n case EBMLId.CueTrack:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n lastCuePoint.trackId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueClusterPosition:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n assert(this.currentSegment);\n lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.Timestamp:\n {\n if (!this.currentCluster)\n break;\n this.currentCluster.timestamp = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SimpleBlock:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break; // Not a track we care about\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n let isKeyFrame = !!(flags & 0x80);\n if (trackData.track.info?.type === 'audio' && trackData.track.info.codec) {\n // Some files don't mark their audio packets as key packets (I'm looking at you, Firefox). But, we\n // can fix this in most cases: if we recognize the codec of the track, then we know every packet is\n // necessarily a key packet, no matter what the container says.\n // https://github.com/Vanilagy/mediabunny/issues/192\n isKeyFrame = true;\n }\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n trackData.blocks.push({\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n });\n }\n ;\n break;\n case EBMLId.BlockGroup:\n {\n if (!this.currentCluster)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentBlock = null;\n }\n ;\n break;\n case EBMLId.Block:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break;\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n this.currentBlock = {\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame: true,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n };\n trackData.blocks.push(this.currentBlock);\n }\n ;\n break;\n case EBMLId.BlockAdditions:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.BlockMore:\n {\n if (!this.currentBlock)\n break;\n this.currentBlockAdditional = {\n addId: 1,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentBlockAdditional.data && this.currentBlockAdditional.addId === 1) {\n this.currentBlock.mainAdditional = this.currentBlockAdditional.data;\n }\n this.currentBlockAdditional = null;\n }\n ;\n break;\n case EBMLId.BlockAdditional:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.data = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.BlockAddID:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.addId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BlockDuration:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.duration = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ReferenceBlock:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.isKeyFrame = false;\n // We ignore the actual value here, we just use the reference as an indicator for \"not a key frame\".\n // This is in line with FFmpeg's behavior.\n }\n ;\n break;\n case EBMLId.Tag:\n {\n this.currentTagTargetIsMovie = true;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.Targets:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TargetTypeValue:\n {\n const targetTypeValue = readUnsignedInt(slice, size);\n if (targetTypeValue !== 50) {\n this.currentTagTargetIsMovie = false;\n }\n }\n ;\n break;\n case EBMLId.TagTrackUID:\n case EBMLId.TagEditionUID:\n case EBMLId.TagChapterUID:\n case EBMLId.TagAttachmentUID:\n {\n this.currentTagTargetIsMovie = false;\n }\n ;\n break;\n case EBMLId.SimpleTag:\n {\n if (!this.currentTagTargetIsMovie)\n break;\n this.currentSimpleTagName = null;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TagName:\n {\n this.currentSimpleTagName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.TagString:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readUnicodeString(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.TagBinary:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readBytes(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.AttachedFile:\n {\n if (!this.currentSegment)\n break;\n this.currentAttachedFile = {\n fileUid: null,\n fileName: null,\n fileMediaType: null,\n fileData: null,\n fileDescription: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n const tags = this.currentSegment.metadataTags;\n if (this.currentAttachedFile.fileUid && this.currentAttachedFile.fileData) {\n // All attached files get surfaced in the `raw` metadata tags\n tags.raw ??= {};\n tags.raw[this.currentAttachedFile.fileUid.toString()] = new AttachedFile(this.currentAttachedFile.fileData, this.currentAttachedFile.fileMediaType ?? undefined, this.currentAttachedFile.fileName ?? undefined, this.currentAttachedFile.fileDescription ?? undefined);\n }\n // Only process image attachments\n if (this.currentAttachedFile.fileMediaType?.startsWith('image/') && this.currentAttachedFile.fileData) {\n const fileName = this.currentAttachedFile.fileName;\n let kind = 'unknown';\n if (fileName) {\n const lowerName = fileName.toLowerCase();\n if (lowerName.startsWith('cover.')) {\n kind = 'coverFront';\n }\n else if (lowerName.startsWith('back.')) {\n kind = 'coverBack';\n }\n }\n tags.images ??= [];\n tags.images.push({\n data: this.currentAttachedFile.fileData,\n mimeType: this.currentAttachedFile.fileMediaType,\n kind,\n name: this.currentAttachedFile.fileName ?? undefined,\n description: this.currentAttachedFile.fileDescription ?? undefined,\n });\n }\n this.currentAttachedFile = null;\n }\n ;\n break;\n case EBMLId.FileUID:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileUid = readUnsignedBigInt(slice, size);\n }\n ;\n break;\n case EBMLId.FileName:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.FileMediaType:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileMediaType = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.FileData:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileData = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.FileDescription:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileDescription = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodings:\n {\n if (!this.currentTrack)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n // \"**MUST** start with the `ContentEncoding` with the highest `ContentEncodingOrder`\"\n this.currentTrack.decodingInstructions.sort((a, b) => b.order - a.order);\n }\n ;\n break;\n case EBMLId.ContentEncoding:\n {\n this.currentDecodingInstruction = {\n order: 0,\n scope: ContentEncodingScope.Block,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentDecodingInstruction.data) {\n this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction);\n }\n this.currentDecodingInstruction = null;\n }\n ;\n break;\n case EBMLId.ContentEncodingOrder:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.order = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodingScope:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.scope = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompression:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decompress',\n algorithm: ContentCompAlgo.Zlib,\n settings: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ContentCompAlgo:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.algorithm = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompSettings:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.settings = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncryption:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decrypt',\n };\n }\n ;\n break;\n }\n slice.filePos = dataStartPos + size;\n return true;\n }\n decodeBlockData(track, rawData) {\n assert(track.decodingInstructions.length > 0); // This method shouldn't be called otherwise\n let currentData = rawData;\n for (const instruction of track.decodingInstructions) {\n assert(instruction.data);\n switch (instruction.data.type) {\n case 'decompress':\n {\n switch (instruction.data.algorithm) {\n case ContentCompAlgo.HeaderStripping:\n {\n if (instruction.data.settings && instruction.data.settings.length > 0) {\n const prefix = instruction.data.settings;\n const newData = new Uint8Array(prefix.length + currentData.length);\n newData.set(prefix, 0);\n newData.set(currentData, prefix.length);\n currentData = newData;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n return currentData;\n }\n processTagValue(name, value) {\n if (!this.currentSegment?.metadataTags)\n return;\n const metadataTags = this.currentSegment.metadataTags;\n metadataTags.raw ??= {};\n metadataTags.raw[name] ??= value;\n if (typeof value === 'string') {\n switch (name.toLowerCase()) {\n case 'title':\n {\n metadataTags.title ??= value;\n }\n ;\n break;\n case 'description':\n {\n metadataTags.description ??= value;\n }\n ;\n break;\n case 'artist':\n {\n metadataTags.artist ??= value;\n }\n ;\n break;\n case 'album':\n {\n metadataTags.album ??= value;\n }\n ;\n break;\n case 'album_artist':\n {\n metadataTags.albumArtist ??= value;\n }\n ;\n break;\n case 'genre':\n {\n metadataTags.genre ??= value;\n }\n ;\n break;\n case 'comment':\n {\n metadataTags.comment ??= value;\n }\n ;\n break;\n case 'lyrics':\n {\n metadataTags.lyrics ??= value;\n }\n ;\n break;\n case 'date':\n {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n metadataTags.date ??= date;\n }\n }\n ;\n break;\n case 'track_number':\n case 'part_number':\n {\n const parts = value.split('/');\n const trackNum = Number.parseInt(parts[0], 10);\n const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(trackNum) && trackNum > 0) {\n metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'disc_number':\n case 'disc':\n {\n const discParts = value.split('/');\n const discNum = Number.parseInt(discParts[0], 10);\n const discsTotal = discParts[1] && Number.parseInt(discParts[1], 10);\n if (Number.isInteger(discNum) && discNum > 0) {\n metadataTags.discNumber ??= discNum;\n }\n if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n metadataTags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n }\n }\n }\n}\nclass MatroskaTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToClusterLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.codecId;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n getTimeResolution() {\n return this.internalTrack.segment.timestampFactor;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async getFirstPacket(options) {\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n intoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.segment.timestampFactor);\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.timestamp);\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (locationInCluster.blockIndex + 1 < trackData.blocks.length) {\n // We can simply take the next block in the cluster\n return {\n blockIndex: locationInCluster.blockIndex + 1,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const block = trackData.blocks[x.blockIndex];\n return block.isKeyFrame && x.timestamp <= timestampInTimescale;\n });\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.blocks.findIndex((x, i) => x.isKeyFrame && i > locationInCluster.blockIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the cluster\n return {\n blockIndex: nextKeyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.blocks.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n blockIndex: keyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async fetchPacketInCluster(cluster, blockIndex, options) {\n if (blockIndex === -1) {\n return null;\n }\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[blockIndex];\n assert(block);\n // Perform lazy decoding if needed\n if (!block.decoded) {\n block.data = this.internalTrack.demuxer.decodeBlockData(this.internalTrack, block.data);\n block.decoded = true;\n }\n const data = options.metadataOnly ? PLACEHOLDER_DATA : block.data;\n const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor;\n const duration = block.duration / this.internalTrack.segment.timestampFactor;\n const sideData = {};\n if (block.mainAdditional && this.internalTrack.info?.type === 'video' && this.internalTrack.info.alphaMode) {\n sideData.alpha = options.metadataOnly ? PLACEHOLDER_DATA : block.mainAdditional;\n sideData.alphaByteLength = block.mainAdditional.byteLength;\n }\n const packet = new EncodedPacket(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength, sideData);\n this.packetToClusterLocation.set(packet, { cluster, blockIndex });\n return packet;\n }\n /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */\n async performClusterLookup(\n // The cluster where we start looking\n startCluster, \n // This function returns the best-matching block in a given cluster\n getMatchInCluster, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct block will not come after it\n latestTimestamp, options) {\n const { demuxer, segment } = this.internalTrack;\n let currentCluster = null;\n let bestCluster = null;\n let bestBlockIndex = -1;\n if (startCluster) {\n const { blockIndex, correctBlockFound } = getMatchInCluster(startCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(startCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = startCluster;\n bestBlockIndex = blockIndex;\n }\n }\n // Search for a cue point; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct cluster (or at least nearby).\n const cuePointIndex = binarySearchLessOrEqual(this.internalTrack.cuePoints, searchTimestamp, x => x.time);\n const cuePoint = cuePointIndex !== -1\n ? this.internalTrack.cuePoints[cuePointIndex]\n : null;\n // Also check the position cache\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.clusterPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.clusterPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(cuePoint?.clusterPosition ?? 0, positionCacheEntry?.elementStartPos ?? 0) || null;\n let currentPos;\n if (!startCluster) {\n currentPos = lookupEntryPosition ?? segment.clusterSeekStartPos;\n }\n else {\n if (lookupEntryPosition === null || startCluster.elementStartPos >= lookupEntryPosition) {\n currentPos = startCluster.elementEndPos;\n currentCluster = startCluster;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (segment.elementEndPos === null || currentPos <= segment.elementEndPos - MIN_HEADER_SIZE) {\n if (currentCluster) {\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementStartPos = currentPos;\n const elementHeader = readElementHeader(slice);\n if (!elementHeader\n || (!LEVEL_1_EBML_IDS.includes(elementHeader.id) && elementHeader.id !== EBMLId.Void)) {\n // There's an element here that shouldn't be here. Might be garbage. In this case, let's\n // try and resync to the next valid element.\n const nextPos = await resync(demuxer.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(segment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.Cluster) {\n currentCluster = await demuxer.readCluster(elementStartPos, segment);\n // readCluster computes the proper size even if it's undefined in the header, so let's use that instead\n size = currentCluster.elementEndPos - dataStartPos;\n const { blockIndex, correctBlockFound } = getMatchInCluster(currentCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(currentCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = currentCluster;\n bestBlockIndex = blockIndex;\n }\n }\n if (size === null) {\n // Undefined element size (can happen in livestreamed files). In this case, we need to do some\n // searching to determine the actual size of the element.\n assert(id !== EBMLId.Cluster); // Undefined cluster sizes are fixed further up\n // Search for the next element at level 0 or 1\n const nextElementPos = await searchForNextElementId(demuxer.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n const endPos = dataStartPos + size;\n if (segment.elementEndPos === null) {\n // Check the next element. If it's a new segment, we know this segment ends here. The new\n // segment is just ignored, since we're likely in a livestreamed file and thus only care about\n // the first segment.\n let slice = demuxer.reader.requestSliceRange(endPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementId = readElementId(slice);\n if (elementId === EBMLId.Segment) {\n segment.elementEndPos = endPos; // We now know the segment's size\n break;\n }\n }\n currentPos = endPos;\n }\n // Catch faulty cue points\n if (cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) {\n // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this\n // case, let's search again but using the cue point before that.\n const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1];\n assert(!previousCuePoint || previousCuePoint.time < cuePoint.time);\n const newSearchTimestamp = previousCuePoint?.time ?? -Infinity;\n return this.performClusterLookup(null, getMatchInCluster, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestCluster) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInCluster(bestCluster, bestBlockIndex, options);\n }\n return null;\n }\n}\nclass MatroskaVideoTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.info.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return this.internalTrack.info.alphaMode;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n let firstPacket = null;\n const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9'\n || this.internalTrack.info.codec === 'av1'\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription)\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription);\n if (needsPacketForAdditionalInfo) {\n firstPacket = await this.getFirstPacket({});\n }\n return {\n codec: extractVideoCodecString({\n width: this.internalTrack.info.width,\n height: this.internalTrack.info.height,\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n colorSpace: this.internalTrack.info.colorSpace,\n avcType: 1, // We don't know better (or do we?) so just assume 'avc1'\n avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket\n ? extractAvcDecoderConfigurationRecord(firstPacket.data)\n : null,\n hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket\n ? extractHevcDecoderConfigurationRecord(firstPacket.data)\n : null,\n vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket\n ? extractVp9CodecInfoFromPacket(firstPacket.data)\n : null,\n av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket\n ? extractAv1CodecInfoFromPacket(firstPacket.data)\n : null,\n }),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass MatroskaAudioTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString({\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n aacCodecInfo: this.internalTrack.info.aacCodecInfo,\n }),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildMatroskaMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isWebM ? 'webm' : 'x-matroska');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings.filter(Boolean))];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { getXingOffset, INFO, XING } from '../../shared/mp3-misc.js';\nimport { ID3_V1_TAG_SIZE, ID3_V2_HEADER_SIZE, parseId3V1Tag, parseId3V2Tag, readId3V2Header, } from '../id3.js';\nimport { readNextFrameHeader } from './mp3-reader.js';\nimport { readAscii, readBytes, readU32Be } from '../reader.js';\nexport class Mp3Demuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataTags = null;\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n if (!this.firstFrameHeader) {\n throw new Error('No valid MP3 frame found.');\n }\n this.tracks = [new InputAudioTrack(this.input, new Mp3AudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n if (this.lastLoadedPos === 0) {\n // Let's skip all ID3v2 tags at the start of the file\n while (true) {\n let slice = this.reader.requestSlice(this.lastLoadedPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n this.lastLoadedPos = slice.filePos + id3V2Header.size;\n }\n }\n const result = await readNextFrameHeader(this.reader, this.lastLoadedPos, this.reader.fileSize);\n if (!result) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = result.header;\n this.lastLoadedPos = result.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short\n const xingOffset = getXingOffset(header.mpegVersionId, header.channel);\n let slice = this.reader.requestSlice(result.startPos + xingOffset, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n const word = readU32Be(slice);\n const isXing = word === XING || word === INFO;\n if (isXing) {\n // There's no actual audio data in this frame, so let's skip it\n return;\n }\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n if (header.sampleRate !== this.firstFrameHeader.sampleRate) {\n console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${header.sampleRate} Hz.`\n + ` Might be a bug, so please report this file.`);\n }\n const sampleDuration = header.audioSamplesInFrame / this.firstFrameHeader.sampleRate;\n const sample = {\n timestamp: this.nextTimestampInSamples / this.firstFrameHeader.sampleRate,\n duration: sampleDuration,\n dataStart: result.startPos,\n dataSize: header.totalSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += header.audioSamplesInFrame;\n return;\n }\n async getMimeType() {\n return 'audio/mpeg';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n const release = await this.readingMutex.acquire();\n try {\n await this.readMetadata();\n if (this.metadataTags) {\n return this.metadataTags;\n }\n this.metadataTags = {};\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let headerSlice = this.reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n break;\n const id3V2Header = readId3V2Header(headerSlice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n let contentSlice = this.reader.requestSlice(headerSlice.filePos, id3V2Header.size);\n if (contentSlice instanceof Promise)\n contentSlice = await contentSlice;\n if (!contentSlice)\n break;\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n currentPos = headerSlice.filePos + id3V2Header.size;\n }\n if (!id3V2HeaderFound && this.reader.fileSize !== null && this.reader.fileSize >= ID3_V1_TAG_SIZE) {\n // Try reading an ID3v1 tag at the end of the file\n let slice = this.reader.requestSlice(this.reader.fileSize - ID3_V1_TAG_SIZE, ID3_V1_TAG_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const tag = readAscii(slice, 3);\n if (tag === 'TAG') {\n parseId3V1Tag(slice, this.metadataTags);\n }\n }\n return this.metadataTags;\n }\n finally {\n release();\n }\n }\n}\nclass Mp3AudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'mp3';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n return {\n codec: 'mp3',\n numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2,\n sampleRate: this.demuxer.firstFrameHeader.sampleRate,\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const FRAME_HEADER_SIZE = 4;\nexport const SAMPLING_RATES = [44100, 48000, 32000];\nexport const KILOBIT_RATES = [\n // lowSamplingFrequency === 0\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1, // layer 1\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1, // layer = 2\n -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1, // layer = 3\n // lowSamplingFrequency === 1\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 1\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 2\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1, // layer = 3\n];\n/** 'Xing' */\nexport const XING = 0x58696e67;\n/** 'Info' */\nexport const INFO = 0x496e666f;\nexport const computeMp3FrameSize = (lowSamplingFrequency, layer, bitrate, sampleRate, padding) => {\n if (layer === 0) {\n return 0; // Not expected that this is hit\n }\n else if (layer === 1) {\n return Math.floor(144 * bitrate / (sampleRate << lowSamplingFrequency)) + padding;\n }\n else if (layer === 2) {\n return Math.floor(144 * bitrate / sampleRate) + padding;\n }\n else { // layer === 3\n return (Math.floor(12 * bitrate / sampleRate) + padding) * 4;\n }\n};\nexport const getXingOffset = (mpegVersionId, channel) => {\n return mpegVersionId === 3\n ? (channel === 3 ? 21 : 36)\n : (channel === 3 ? 13 : 21);\n};\nexport const readFrameHeader = (word, remainingBytes) => {\n const firstByte = word >>> 24;\n const secondByte = (word >>> 16) & 0xff;\n const thirdByte = (word >>> 8) & 0xff;\n const fourthByte = word & 0xff;\n if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) {\n return {\n header: null,\n bytesAdvanced: 4,\n };\n }\n if (firstByte !== 0xff) {\n return { header: null, bytesAdvanced: 1 };\n }\n if ((secondByte & 0xe0) !== 0xe0) {\n return { header: null, bytesAdvanced: 1 };\n }\n let lowSamplingFrequency = 0;\n let mpeg25 = 0;\n if (secondByte & (1 << 4)) {\n lowSamplingFrequency = (secondByte & (1 << 3)) ? 0 : 1;\n }\n else {\n lowSamplingFrequency = 1;\n mpeg25 = 1;\n }\n const mpegVersionId = (secondByte >> 3) & 0x3;\n const layer = (secondByte >> 1) & 0x3;\n const bitrateIndex = (thirdByte >> 4) & 0xf;\n const frequencyIndex = ((thirdByte >> 2) & 0x3) % 3;\n const padding = (thirdByte >> 1) & 0x1;\n const channel = (fourthByte >> 6) & 0x3;\n const modeExtension = (fourthByte >> 4) & 0x3;\n const copyright = (fourthByte >> 3) & 0x1;\n const original = (fourthByte >> 2) & 0x1;\n const emphasis = fourthByte & 0x3;\n const kilobitRate = KILOBIT_RATES[lowSamplingFrequency * 16 * 4 + layer * 16 + bitrateIndex];\n if (kilobitRate === -1) {\n return { header: null, bytesAdvanced: 1 };\n }\n const bitrate = kilobitRate * 1000;\n const sampleRate = SAMPLING_RATES[frequencyIndex] >> (lowSamplingFrequency + mpeg25);\n const frameLength = computeMp3FrameSize(lowSamplingFrequency, layer, bitrate, sampleRate, padding);\n if (remainingBytes !== null && remainingBytes < frameLength) {\n // The frame doesn't fit into the rest of the file\n return { header: null, bytesAdvanced: 1 };\n }\n let audioSamplesInFrame;\n if (mpegVersionId === 3) {\n audioSamplesInFrame = layer === 3 ? 384 : 1152;\n }\n else {\n if (layer === 3) {\n audioSamplesInFrame = 384;\n }\n else if (layer === 2) {\n audioSamplesInFrame = 1152;\n }\n else {\n audioSamplesInFrame = 576;\n }\n }\n return {\n header: {\n totalSize: frameLength,\n mpegVersionId,\n layer,\n bitrate,\n frequencyIndex,\n sampleRate,\n channel,\n modeExtension,\n copyright,\n original,\n emphasis,\n audioSamplesInFrame,\n },\n bytesAdvanced: 1,\n };\n};\nexport const encodeSynchsafe = (unsynchsafed) => {\n let mask = 0x7f;\n let synchsafed = 0;\n let unsynchsafedRest = unsynchsafed;\n while ((mask ^ 0x7fffffff) !== 0) {\n synchsafed = unsynchsafedRest & ~mask;\n synchsafed <<= 1;\n synchsafed |= unsynchsafedRest & mask;\n mask = ((mask + 1) << 8) - 1;\n unsynchsafedRest = synchsafed;\n }\n return synchsafed;\n};\nexport const decodeSynchsafe = (synchsafed) => {\n let mask = 0x7f000000;\n let unsynchsafed = 0;\n while (mask !== 0) {\n unsynchsafed >>= 1;\n unsynchsafed |= synchsafed & mask;\n mask >>= 8;\n }\n return unsynchsafed;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { decodeSynchsafe, encodeSynchsafe } from '../shared/mp3-misc.js';\nimport { coalesceIndex, textDecoder, textEncoder, isIso88591Compatible, assertNever, keyValueIterator, toDataView, } from './misc.js';\nimport { readAscii, readBytes, readU32Be, readU8 } from './reader.js';\nexport var Id3V2HeaderFlags;\n(function (Id3V2HeaderFlags) {\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Unsynchronisation\"] = 128] = \"Unsynchronisation\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExtendedHeader\"] = 64] = \"ExtendedHeader\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExperimentalIndicator\"] = 32] = \"ExperimentalIndicator\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Footer\"] = 16] = \"Footer\";\n})(Id3V2HeaderFlags || (Id3V2HeaderFlags = {}));\nexport var Id3V2TextEncoding;\n(function (Id3V2TextEncoding) {\n Id3V2TextEncoding[Id3V2TextEncoding[\"ISO_8859_1\"] = 0] = \"ISO_8859_1\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_WITH_BOM\"] = 1] = \"UTF_16_WITH_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_BE_NO_BOM\"] = 2] = \"UTF_16_BE_NO_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_8\"] = 3] = \"UTF_8\";\n})(Id3V2TextEncoding || (Id3V2TextEncoding = {}));\nexport const ID3_V1_TAG_SIZE = 128;\nexport const ID3_V2_HEADER_SIZE = 10;\nexport const ID3_V1_GENRES = [\n 'Blues', 'Classic rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-hop', 'Jazz',\n 'Metal', 'New age', 'Oldies', 'Other', 'Pop', 'Rhythm and blues', 'Rap', 'Reggae', 'Rock',\n 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death metal', 'Pranks', 'Soundtrack',\n 'Euro-techno', 'Ambient', 'Trip-hop', 'Vocal', 'Jazz & funk', 'Fusion', 'Trance', 'Classical',\n 'Instrumental', 'Acid', 'House', 'Game', 'Sound clip', 'Gospel', 'Noise', 'Alternative rock',\n 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental pop', 'Instrumental rock',\n 'Ethnic', 'Gothic', 'Darkwave', 'Techno-industrial', 'Electronic', 'Pop-folk', 'Eurodance',\n 'Dream', 'Southern rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian rap', 'Pop/funk',\n 'Jungle music', 'Native US', 'Cabaret', 'New wave', 'Psychedelic', 'Rave', 'Showtunes',\n 'Trailer', 'Lo-fi', 'Tribal', 'Acid punk', 'Acid jazz', 'Polka', 'Retro', 'Musical',\n 'Rock \\'n\\' roll', 'Hard rock', 'Folk', 'Folk rock', 'National folk', 'Swing', 'Fast fusion',\n 'Bebop', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic rock',\n 'Progressive rock', 'Psychedelic rock', 'Symphonic rock', 'Slow rock', 'Big band', 'Chorus',\n 'Easy listening', 'Acoustic', 'Humour', 'Speech', 'Chanson', 'Opera', 'Chamber music',\n 'Sonata', 'Symphony', 'Booty bass', 'Primus', 'Porn groove', 'Satire', 'Slow jam', 'Club',\n 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power ballad', 'Rhythmic Soul', 'Freestyle', 'Duet',\n 'Punk rock', 'Drum solo', 'A cappella', 'Euro-house', 'Dance hall', 'Goa music', 'Drum & bass',\n 'Club-house', 'Hardcore techno', 'Terror', 'Indie', 'Britpop', 'Negerpunk', 'Polsk punk',\n 'Beat', 'Christian gangsta rap', 'Heavy metal', 'Black metal', 'Crossover',\n 'Contemporary Christian', 'Christian rock', 'Merengue', 'Salsa', 'Thrash metal', 'Anime',\n 'Jpop', 'Synthpop', 'Christmas', 'Art rock', 'Baroque', 'Bhangra', 'Big beat', 'Breakbeat',\n 'Chillout', 'Downtempo', 'Dub', 'EBM', 'Eclectic', 'Electro', 'Electroclash', 'Emo',\n 'Experimental', 'Garage', 'Global', 'IDM', 'Illbient', 'Industro-Goth', 'Jam Band',\n 'Krautrock', 'Leftfield', 'Lounge', 'Math rock', 'New romantic', 'Nu-breakz', 'Post-punk',\n 'Post-rock', 'Psytrance', 'Shoegaze', 'Space rock', 'Trop rock', 'World music', 'Neoclassical',\n 'Audiobook', 'Audio theatre', 'Neue Deutsche Welle', 'Podcast', 'Indie rock', 'G-Funk',\n 'Dubstep', 'Garage rock', 'Psybient',\n];\nexport const parseId3V1Tag = (slice, tags) => {\n const startPos = slice.filePos;\n tags.raw ??= {};\n tags.raw['TAG'] ??= readBytes(slice, ID3_V1_TAG_SIZE - 3); // Dump the whole tag into the raw metadata\n slice.filePos = startPos;\n const title = readId3V1String(slice, 30);\n if (title)\n tags.title ??= title;\n const artist = readId3V1String(slice, 30);\n if (artist)\n tags.artist ??= artist;\n const album = readId3V1String(slice, 30);\n if (album)\n tags.album ??= album;\n const yearText = readId3V1String(slice, 4);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year) && year > 0) {\n tags.date ??= new Date(year, 0, 1);\n }\n const commentBytes = readBytes(slice, 30);\n let comment;\n // Check for the ID3v1.1 track number format:\n // The 29th byte (index 28) is a null terminator, and the 30th byte is the track number.\n if (commentBytes[28] === 0 && commentBytes[29] !== 0) {\n const trackNum = commentBytes[29];\n if (trackNum > 0) {\n tags.trackNumber ??= trackNum;\n }\n slice.skip(-30);\n comment = readId3V1String(slice, 28);\n slice.skip(2);\n }\n else {\n slice.skip(-30);\n comment = readId3V1String(slice, 30);\n }\n if (comment)\n tags.comment ??= comment;\n const genreIndex = readU8(slice);\n if (genreIndex < ID3_V1_GENRES.length) {\n tags.genre ??= ID3_V1_GENRES[genreIndex];\n }\n};\nexport const readId3V1String = (slice, length) => {\n const bytes = readBytes(slice, length);\n const endIndex = coalesceIndex(bytes.indexOf(0), bytes.length);\n const relevantBytes = bytes.subarray(0, endIndex);\n // Decode as ISO-8859-1\n let str = '';\n for (let i = 0; i < relevantBytes.length; i++) {\n str += String.fromCharCode(relevantBytes[i]);\n }\n return str.trimEnd(); // String also may be padded with spaces\n};\nexport const readId3V2Header = (slice) => {\n const startPos = slice.filePos;\n const tag = readAscii(slice, 3);\n const majorVersion = readU8(slice);\n const revision = readU8(slice);\n const flags = readU8(slice);\n const sizeRaw = readU32Be(slice);\n if (tag !== 'ID3' || majorVersion === 0xff || revision === 0xff || (sizeRaw & 0x80808080) !== 0) {\n slice.filePos = startPos;\n return null;\n }\n const size = decodeSynchsafe(sizeRaw);\n return { majorVersion, revision, flags, size };\n};\nexport const parseId3V2Tag = (slice, header, tags) => {\n // https://id3.org/id3v2.3.0\n if (![2, 3, 4].includes(header.majorVersion)) {\n console.warn(`Unsupported ID3v2 major version: ${header.majorVersion}`);\n return;\n }\n const bytes = readBytes(slice, header.size);\n const reader = new Id3V2Reader(header, bytes);\n if (header.flags & Id3V2HeaderFlags.Footer) {\n reader.removeFooter();\n }\n if ((header.flags & Id3V2HeaderFlags.Unsynchronisation) && header.majorVersion === 3) {\n reader.ununsynchronizeAll();\n }\n if (header.flags & Id3V2HeaderFlags.ExtendedHeader) {\n const extendedHeaderSize = reader.readU32();\n if (header.majorVersion === 3) {\n reader.pos += extendedHeaderSize; // The extended header size excludes itself\n }\n else {\n reader.pos += extendedHeaderSize - 4; // The extended header size includes itself\n }\n }\n while (reader.pos <= reader.bytes.length - reader.frameHeaderSize()) {\n const frame = reader.readId3V2Frame();\n if (!frame) {\n break;\n }\n const frameStartPos = reader.pos;\n const frameEndPos = reader.pos + frame.size;\n let frameEncrypted = false;\n let frameCompressed = false;\n let frameUnsynchronized = false;\n if (header.majorVersion === 3) {\n frameEncrypted = !!(frame.flags & (1 << 6));\n frameCompressed = !!(frame.flags & (1 << 7));\n }\n else if (header.majorVersion === 4) {\n frameEncrypted = !!(frame.flags & (1 << 2));\n frameCompressed = !!(frame.flags & (1 << 3));\n frameUnsynchronized = !!(frame.flags & (1 << 1))\n || !!(header.flags & Id3V2HeaderFlags.Unsynchronisation);\n }\n if (frameEncrypted) {\n console.warn(`Skipping encrypted ID3v2 frame ${frame.id}`);\n reader.pos = frameEndPos;\n continue;\n }\n if (frameCompressed) {\n console.warn(`Skipping compressed ID3v2 frame ${frame.id}`); // Maybe someday? Idk\n reader.pos = frameEndPos;\n continue;\n }\n if (frameUnsynchronized) {\n reader.ununsynchronizeRegion(reader.pos, frameEndPos);\n }\n tags.raw ??= {};\n if (frame.id[0] === 'T') {\n // It's a text frame, let's decode as text\n tags.raw[frame.id] ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n else {\n // For the others, let's just get the bytes\n tags.raw[frame.id] ??= reader.readBytes(frame.size);\n }\n reader.pos = frameStartPos;\n switch (frame.id) {\n case 'TIT2':\n case 'TT2':\n {\n tags.title ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TIT3':\n case 'TT3':\n {\n tags.description ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE1':\n case 'TP1':\n {\n tags.artist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TALB':\n case 'TAL':\n {\n tags.album ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE2':\n case 'TP2':\n {\n tags.albumArtist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TRCK':\n case 'TRK':\n {\n const trackText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = trackText.split('/');\n const trackNum = Number.parseInt(parts[0], 10);\n const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(trackNum) && trackNum > 0) {\n tags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n tags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'TPOS':\n case 'TPA':\n {\n const discText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = discText.split('/');\n const discNum = Number.parseInt(parts[0], 10);\n const discsTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(discNum) && discNum > 0) {\n tags.discNumber ??= discNum;\n }\n if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n tags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n case 'TCON':\n case 'TCO':\n {\n const genreText = reader.readId3V2EncodingAndText(frameEndPos);\n let match = /^\\((\\d+)\\)/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[1]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n match = /^\\d+$/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[0]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n tags.genre ??= genreText;\n }\n ;\n break;\n case 'TDRC':\n case 'TDAT':\n {\n const dateText = reader.readId3V2EncodingAndText(frameEndPos);\n const date = new Date(dateText);\n if (!Number.isNaN(date.getTime())) {\n tags.date ??= date;\n }\n }\n ;\n break;\n case 'TYER':\n case 'TYE':\n {\n const yearText = reader.readId3V2EncodingAndText(frameEndPos);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year)) {\n tags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'USLT':\n case 'ULT':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.lyrics ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'COMM':\n case 'COM':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.comment ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'APIC':\n case 'PIC':\n {\n const encoding = reader.readId3V2TextEncoding();\n let mimeType;\n if (header.majorVersion === 2) {\n const imageFormat = reader.readAscii(3);\n mimeType = imageFormat === 'PNG'\n ? 'image/png'\n : imageFormat === 'JPG'\n ? 'image/jpeg'\n : 'image/*';\n }\n else {\n mimeType = reader.readId3V2Text(encoding, frameEndPos);\n }\n const pictureType = reader.readU8();\n const description = reader.readId3V2Text(encoding, frameEndPos).trimEnd(); // Trim ending spaces\n const imageDataSize = frameEndPos - reader.pos;\n if (imageDataSize >= 0) {\n const imageData = reader.readBytes(imageDataSize);\n if (!tags.images)\n tags.images = [];\n tags.images.push({\n data: imageData,\n mimeType,\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n }\n }\n ;\n break;\n default:\n {\n reader.pos += frame.size;\n }\n ;\n break;\n }\n reader.pos = frameEndPos;\n }\n};\n// https://id3.org/id3v2.3.0\nexport class Id3V2Reader {\n constructor(header, bytes) {\n this.header = header;\n this.bytes = bytes;\n this.pos = 0;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n frameHeaderSize() {\n return this.header.majorVersion === 2 ? 6 : 10;\n }\n ununsynchronizeAll() {\n const newBytes = [];\n for (let i = 0; i < this.bytes.length; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== this.bytes.length - 1) {\n const value2 = this.bytes[i];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n this.bytes = new Uint8Array(newBytes);\n this.view = new DataView(this.bytes.buffer);\n }\n ununsynchronizeRegion(start, end) {\n const newBytes = [];\n for (let i = start; i < end; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== end - 1) {\n const value2 = this.bytes[i + 1];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n const before = this.bytes.subarray(0, start);\n const after = this.bytes.subarray(end);\n this.bytes = new Uint8Array(before.length + newBytes.length + after.length);\n this.bytes.set(before, 0);\n this.bytes.set(newBytes, before.length);\n this.bytes.set(after, before.length + newBytes.length);\n this.view = new DataView(this.bytes.buffer);\n }\n removeFooter() {\n this.bytes = this.bytes.subarray(0, this.bytes.length - ID3_V2_HEADER_SIZE);\n this.view = new DataView(this.bytes.buffer);\n }\n readBytes(length) {\n const slice = this.bytes.subarray(this.pos, this.pos + length);\n this.pos += length;\n return slice;\n }\n readU8() {\n const value = this.view.getUint8(this.pos);\n this.pos += 1;\n return value;\n }\n readU16() {\n const value = this.view.getUint16(this.pos, false);\n this.pos += 2;\n return value;\n }\n readU24() {\n const high = this.view.getUint16(this.pos, false);\n const low = this.view.getUint8(this.pos + 1);\n this.pos += 3;\n return high * 0x100 + low;\n }\n readU32() {\n const value = this.view.getUint32(this.pos, false);\n this.pos += 4;\n return value;\n }\n readAscii(length) {\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(this.view.getUint8(this.pos + i));\n }\n this.pos += length;\n return str;\n }\n readId3V2Frame() {\n if (this.header.majorVersion === 2) {\n const id = this.readAscii(3);\n if (id === '\\x00\\x00\\x00') {\n return null;\n }\n const size = this.readU24();\n return { id, size, flags: 0 };\n }\n else {\n const id = this.readAscii(4);\n if (id === '\\x00\\x00\\x00\\x00') {\n // We've landed in the padding section\n return null;\n }\n const sizeRaw = this.readU32();\n let size = this.header.majorVersion === 4\n ? decodeSynchsafe(sizeRaw)\n : sizeRaw;\n const flags = this.readU16();\n const headerEndPos = this.pos;\n // Some files may have incorrectly synchsafed/unsynchsafed sizes. To validate which interpretation is valid,\n // we validate a size by skipping ahead and seeing if we land at a valid frame header (or at the end of the\n // tag.\n const isSizeValid = (size) => {\n const nextPos = this.pos + size;\n if (nextPos > this.bytes.length) {\n return false;\n }\n if (nextPos <= this.bytes.length - this.frameHeaderSize()) {\n this.pos += size;\n const nextId = this.readAscii(4);\n if (nextId !== '\\x00\\x00\\x00\\x00' && !/[0-9A-Z]{4}/.test(nextId)) {\n return false;\n }\n }\n return true;\n };\n if (!isSizeValid(size)) {\n // Flip the synchsafing, and try if this one makes more sense\n const otherSize = this.header.majorVersion === 4\n ? sizeRaw\n : decodeSynchsafe(sizeRaw);\n if (isSizeValid(otherSize)) {\n size = otherSize;\n }\n }\n this.pos = headerEndPos;\n return { id, size, flags };\n }\n }\n readId3V2TextEncoding() {\n const number = this.readU8();\n if (number > 3) {\n throw new Error(`Unsupported text encoding: ${number}`);\n }\n return number;\n }\n readId3V2Text(encoding, until) {\n const startPos = this.pos;\n const data = this.readBytes(until - this.pos);\n switch (encoding) {\n case Id3V2TextEncoding.ISO_8859_1: {\n let str = '';\n for (let i = 0; i < data.length; i++) {\n const value = data[i];\n if (value === 0) {\n this.pos = startPos + i + 1;\n break;\n }\n str += String.fromCharCode(value);\n }\n return str;\n }\n case Id3V2TextEncoding.UTF_16_WITH_BOM: {\n if (data[0] === 0xff && data[1] === 0xfe) {\n const decoder = new TextDecoder('utf-16le');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else if (data[0] === 0xfe && data[1] === 0xff) {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else {\n // Treat it like UTF-8, some files do this\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n case Id3V2TextEncoding.UTF_16_BE_NO_BOM: {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(0, endIndex));\n }\n case Id3V2TextEncoding.UTF_8: {\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n }\n readId3V2EncodingAndText(until) {\n if (this.pos >= until) {\n return '';\n }\n const encoding = this.readId3V2TextEncoding();\n return this.readId3V2Text(encoding, until);\n }\n}\nexport class Id3V2Writer {\n constructor(writer) {\n this.helper = new Uint8Array(8);\n this.helperView = toDataView(this.helper);\n this.writer = writer;\n }\n writeId3V2Tag(metadata) {\n const tagStartPos = this.writer.getPos();\n // Write ID3v2.4 header\n this.writeAscii('ID3');\n this.writeU8(0x04); // Version 2.4\n this.writeU8(0x00); // Revision 0\n this.writeU8(0x00); // Flags\n this.writeSynchsafeU32(0); // Size placeholder\n const framesStartPos = this.writer.getPos();\n const writtenTags = new Set();\n // Write all metadata frames\n for (const { key, value } of keyValueIterator(metadata)) {\n switch (key) {\n case 'title':\n {\n this.writeId3V2TextFrame('TIT2', value);\n writtenTags.add('TIT2');\n }\n ;\n break;\n case 'description':\n {\n this.writeId3V2TextFrame('TIT3', value);\n writtenTags.add('TIT3');\n }\n ;\n break;\n case 'artist':\n {\n this.writeId3V2TextFrame('TPE1', value);\n writtenTags.add('TPE1');\n }\n ;\n break;\n case 'album':\n {\n this.writeId3V2TextFrame('TALB', value);\n writtenTags.add('TALB');\n }\n ;\n break;\n case 'albumArtist':\n {\n this.writeId3V2TextFrame('TPE2', value);\n writtenTags.add('TPE2');\n }\n ;\n break;\n case 'trackNumber':\n {\n const string = metadata.tracksTotal !== undefined\n ? `${value}/${metadata.tracksTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TRCK', string);\n writtenTags.add('TRCK');\n }\n ;\n break;\n case 'discNumber':\n {\n const string = metadata.discsTotal !== undefined\n ? `${value}/${metadata.discsTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TPOS', string);\n writtenTags.add('TPOS');\n }\n ;\n break;\n case 'genre':\n {\n this.writeId3V2TextFrame('TCON', value);\n writtenTags.add('TCON');\n }\n ;\n break;\n case 'date':\n {\n this.writeId3V2TextFrame('TDRC', value.toISOString().slice(0, 10));\n writtenTags.add('TDRC');\n }\n ;\n break;\n case 'lyrics':\n {\n this.writeId3V2LyricsFrame(value);\n writtenTags.add('USLT');\n }\n ;\n break;\n case 'comment':\n {\n this.writeId3V2CommentFrame(value);\n writtenTags.add('COMM');\n }\n ;\n break;\n case 'images':\n {\n const pictureTypeMap = { coverFront: 0x03, coverBack: 0x04, unknown: 0x00 };\n for (const image of value) {\n const pictureType = pictureTypeMap[image.kind] ?? 0x00;\n const description = image.description ?? '';\n this.writeId3V2ApicFrame(image.mimeType, pictureType, description, image.data);\n }\n }\n ;\n break;\n case 'tracksTotal':\n case 'discsTotal':\n {\n // Handled with trackNumber and discNumber respectively\n }\n ;\n break;\n case 'raw':\n {\n // Handled later\n }\n ;\n break;\n default: {\n assertNever(key);\n }\n }\n }\n if (metadata.raw) {\n for (const key in metadata.raw) {\n const value = metadata.raw[key];\n if (value == null || key.length !== 4 || writtenTags.has(key)) {\n continue;\n }\n let bytes;\n if (typeof value === 'string') {\n const encoded = textEncoder.encode(value);\n bytes = new Uint8Array(encoded.byteLength + 2);\n bytes[0] = Id3V2TextEncoding.UTF_8;\n bytes.set(encoded, 1);\n // Last byte is the null terminator\n }\n else if (value instanceof Uint8Array) {\n bytes = value;\n }\n else {\n continue;\n }\n this.writeAscii(key);\n this.writeSynchsafeU32(bytes.byteLength);\n this.writeU16(0x0000);\n this.writer.write(bytes);\n }\n }\n const framesEndPos = this.writer.getPos();\n const framesSize = framesEndPos - framesStartPos;\n // Update the size field in the header (synchsafe)\n this.writer.seek(tagStartPos + 6); // Skip 'ID3' + version + revision + flags\n this.writeSynchsafeU32(framesSize);\n this.writer.seek(framesEndPos);\n return framesSize + 10; // +10 for the header size\n }\n writeU8(value) {\n this.helper[0] = value;\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeU16(value) {\n this.helperView.setUint16(0, value, false);\n this.writer.write(this.helper.subarray(0, 2));\n }\n writeU32(value) {\n this.helperView.setUint32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n this.helper[i] = text.charCodeAt(i);\n }\n this.writer.write(this.helper.subarray(0, text.length));\n }\n writeSynchsafeU32(value) {\n this.writeU32(encodeSynchsafe(value));\n }\n writeIsoString(text) {\n const bytes = new Uint8Array(text.length + 1);\n for (let i = 0; i < text.length; i++) {\n bytes[i] = text.charCodeAt(i);\n }\n bytes[text.length] = 0x00;\n this.writer.write(bytes);\n }\n writeUtf8String(text) {\n const utf8Data = textEncoder.encode(text);\n this.writer.write(utf8Data);\n this.writeU8(0x00);\n }\n writeId3V2TextFrame(frameId, text) {\n const useIso88591 = isIso88591Compatible(text);\n const textDataLength = useIso88591 ? text.length : textEncoder.encode(text).byteLength;\n const frameSize = 1 + textDataLength + 1;\n this.writeAscii(frameId);\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(text);\n }\n else {\n this.writeUtf8String(text);\n }\n }\n writeId3V2LyricsFrame(lyrics) {\n const useIso88591 = isIso88591Compatible(lyrics);\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + lyrics.length + 1;\n this.writeAscii('USLT');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeAscii('und');\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(lyrics);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(lyrics);\n }\n }\n writeId3V2CommentFrame(comment) {\n const useIso88591 = isIso88591Compatible(comment);\n const textDataLength = useIso88591 ? comment.length : textEncoder.encode(comment).byteLength;\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + textDataLength + 1;\n this.writeAscii('COMM');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeU8(0x75); // 'u'\n this.writeU8(0x6E); // 'n'\n this.writeU8(0x64); // 'd'\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(comment);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(comment);\n }\n }\n writeId3V2ApicFrame(mimeType, pictureType, description, imageData) {\n const useIso88591 = isIso88591Compatible(mimeType) && isIso88591Compatible(description);\n const descriptionDataLength = useIso88591\n ? description.length\n : textEncoder.encode(description).byteLength;\n const frameSize = 1 + mimeType.length + 1 + 1 + descriptionDataLength + 1 + imageData.byteLength;\n this.writeAscii('APIC');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(mimeType);\n }\n else {\n this.writeUtf8String(mimeType);\n }\n this.writeU8(pictureType);\n if (useIso88591) {\n this.writeIsoString(description);\n }\n else {\n this.writeUtf8String(description);\n }\n this.writer.write(imageData);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { FRAME_HEADER_SIZE, readFrameHeader } from '../../shared/mp3-misc.js';\nimport { readU32Be } from '../reader.js';\nexport const readNextFrameHeader = async (reader, startPos, until) => {\n let currentPos = startPos;\n while (until === null || currentPos < until) {\n let slice = reader.requestSlice(currentPos, FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const word = readU32Be(slice);\n const result = readFrameHeader(word, reader.fileSize !== null ? reader.fileSize - currentPos : null);\n if (result.header) {\n return { header: result.header, startPos: currentPos };\n }\n currentPos += result.bytesAdvanced;\n }\n return null;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { OPUS_SAMPLE_RATE } from '../codec.js';\nimport { parseModesFromVorbisSetupPacket, parseOpusIdentificationHeader, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, findLast, last, roundIfAlmostInteger, toDataView, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { buildOggMimeType, computeOggPageCrc, extractSampleMetadata } from './ogg-misc.js';\nimport { findNextPageHeader, MAX_PAGE_HEADER_SIZE, MAX_PAGE_SIZE, MIN_PAGE_HEADER_SIZE, readPageHeader, } from './ogg-reader.js';\nexport class OggDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.bitstreams = [];\n this.tracks = [];\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const page = readPageHeader(slice);\n if (!page) {\n break;\n }\n const isBos = !!(page.headerType & 0x02);\n if (!isBos) {\n // All bos pages for all bitstreams are required to be at the start, so if the page is not bos then\n // we know we've seen all bitstreams (minus chaining)\n break;\n }\n this.bitstreams.push({\n serialNumber: page.serialNumber,\n bosPage: page,\n description: null,\n numberOfChannels: -1,\n sampleRate: -1,\n codecInfo: {\n codec: null,\n vorbisInfo: null,\n opusInfo: null,\n },\n lastMetadataPacket: null,\n });\n currentPos = page.headerStartPos + page.totalSize;\n }\n for (const bitstream of this.bitstreams) {\n const firstPacket = await this.readPacket(bitstream.bosPage, 0);\n if (!firstPacket) {\n continue;\n }\n if (\n // Check for Vorbis\n firstPacket.data.byteLength >= 7\n && firstPacket.data[0] === 0x01 // Packet type 1 = identification header\n && firstPacket.data[1] === 0x76 // 'v'\n && firstPacket.data[2] === 0x6f // 'o'\n && firstPacket.data[3] === 0x72 // 'r'\n && firstPacket.data[4] === 0x62 // 'b'\n && firstPacket.data[5] === 0x69 // 'i'\n && firstPacket.data[6] === 0x73 // 's'\n ) {\n await this.readVorbisMetadata(firstPacket, bitstream);\n }\n else if (\n // Check for Opus\n firstPacket.data.byteLength >= 8\n && firstPacket.data[0] === 0x4f // 'O'\n && firstPacket.data[1] === 0x70 // 'p'\n && firstPacket.data[2] === 0x75 // 'u'\n && firstPacket.data[3] === 0x73 // 's'\n && firstPacket.data[4] === 0x48 // 'H'\n && firstPacket.data[5] === 0x65 // 'e'\n && firstPacket.data[6] === 0x61 // 'a'\n && firstPacket.data[7] === 0x64 // 'd'\n ) {\n await this.readOpusMetadata(firstPacket, bitstream);\n }\n if (bitstream.codecInfo.codec !== null) {\n this.tracks.push(new InputAudioTrack(this.input, new OggAudioTrackBacking(bitstream, this)));\n }\n }\n })();\n }\n async readVorbisMetadata(firstPacket, bitstream) {\n let nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n nextPacketPosition = await this.findNextPacketStart(secondPacket);\n if (!nextPacketPosition) {\n return;\n }\n const thirdPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!thirdPacket) {\n return;\n }\n if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) {\n return;\n }\n const lacingValues = [];\n const addBytesToSegmentTable = (bytes) => {\n while (true) {\n lacingValues.push(Math.min(255, bytes));\n if (bytes < 255) {\n break;\n }\n bytes -= 255;\n }\n };\n addBytesToSegmentTable(firstPacket.data.length);\n addBytesToSegmentTable(secondPacket.data.length);\n // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain\n const description = new Uint8Array(1 + lacingValues.length\n + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length);\n description[0] = 2; // Num entries in the segment table\n description.set(lacingValues, 1);\n description.set(firstPacket.data, 1 + lacingValues.length);\n description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length);\n description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length);\n bitstream.codecInfo.codec = 'vorbis';\n bitstream.description = description;\n bitstream.lastMetadataPacket = thirdPacket;\n const view = toDataView(firstPacket.data);\n bitstream.numberOfChannels = view.getUint8(11);\n bitstream.sampleRate = view.getUint32(12, true);\n const blockSizeByte = view.getUint8(28);\n bitstream.codecInfo.vorbisInfo = {\n blocksizes: [\n 1 << (blockSizeByte & 0xf),\n 1 << (blockSizeByte >> 4),\n ],\n modeBlockflags: parseModesFromVorbisSetupPacket(thirdPacket.data).modeBlockflags,\n };\n readVorbisComments(secondPacket.data.subarray(7), this.metadataTags); // Skip header type and 'vorbis'\n }\n async readOpusMetadata(firstPacket, bitstream) {\n // From https://datatracker.ietf.org/doc/html/rfc7845#section-5:\n // \"An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a\n // comment header.\"\n const nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n bitstream.codecInfo.codec = 'opus';\n bitstream.description = firstPacket.data;\n bitstream.lastMetadataPacket = secondPacket;\n const header = parseOpusIdentificationHeader(firstPacket.data);\n bitstream.numberOfChannels = header.outputChannelCount;\n bitstream.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n bitstream.codecInfo.opusInfo = {\n preSkip: header.preSkip,\n };\n readVorbisComments(secondPacket.data.subarray(8), this.metadataTags); // Skip 'OpusTags'\n }\n async readPacket(startPage, startSegmentIndex) {\n assert(startSegmentIndex < startPage.lacingValues.length);\n let startDataOffset = 0;\n for (let i = 0; i < startSegmentIndex; i++) {\n startDataOffset += startPage.lacingValues[i];\n }\n let currentPage = startPage;\n let currentDataOffset = startDataOffset;\n let currentSegmentIndex = startSegmentIndex;\n const chunks = [];\n outer: while (true) {\n // Load the entire page data\n let pageSlice = this.reader.requestSlice(currentPage.dataStartPos, currentPage.dataSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n const pageData = readBytes(pageSlice, currentPage.dataSize);\n while (true) {\n if (currentSegmentIndex === currentPage.lacingValues.length) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break;\n }\n const lacingValue = currentPage.lacingValues[currentSegmentIndex];\n currentDataOffset += lacingValue;\n if (lacingValue < 255) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break outer;\n }\n currentSegmentIndex++;\n }\n // The packet extends to the next page; let's find it\n let currentPos = currentPage.headerStartPos + currentPage.totalSize;\n while (true) {\n let headerSlice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice) {\n return null;\n }\n const nextPage = readPageHeader(headerSlice);\n if (!nextPage) {\n return null;\n }\n currentPage = nextPage;\n if (currentPage.serialNumber === startPage.serialNumber) {\n break;\n }\n currentPos = currentPage.headerStartPos + currentPage.totalSize;\n }\n startDataOffset = 0;\n currentDataOffset = 0;\n currentSegmentIndex = 0;\n }\n const totalPacketSize = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const packetData = new Uint8Array(totalPacketSize);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n packetData.set(chunk, offset);\n offset += chunk.length;\n }\n return {\n data: packetData,\n endPage: currentPage,\n endSegmentIndex: currentSegmentIndex,\n };\n }\n async findNextPacketStart(lastPacket) {\n // If there's another segment in the same page, return it\n if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) {\n return { startPage: lastPacket.endPage, startSegmentIndex: lastPacket.endSegmentIndex + 1 };\n }\n const isEos = !!(lastPacket.endPage.headerType & 0x04);\n if (isEos) {\n // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it\n return null;\n }\n // Otherwise, search for the next page belonging to the same bitstream\n let currentPos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n const nextPage = readPageHeader(slice);\n if (!nextPage) {\n return null;\n }\n if (nextPage.serialNumber === lastPacket.endPage.serialNumber) {\n return { startPage: nextPage, startSegmentIndex: 0 };\n }\n currentPos = nextPage.headerStartPos + nextPage.totalSize;\n }\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.getCodecParameterString()));\n return buildOggMimeType({\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nclass OggAudioTrackBacking {\n constructor(bitstream, demuxer) {\n this.bitstream = bitstream;\n this.demuxer = demuxer;\n this.encodedPacketToMetadata = new WeakMap();\n this.sequentialScanCache = [];\n this.sequentialScanMutex = new AsyncMutex();\n // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different\n this.internalSampleRate = bitstream.codecInfo.codec === 'opus'\n ? OPUS_SAMPLE_RATE\n : bitstream.sampleRate;\n }\n getId() {\n return this.bitstream.serialNumber;\n }\n getNumberOfChannels() {\n return this.bitstream.numberOfChannels;\n }\n getSampleRate() {\n return this.bitstream.sampleRate;\n }\n getTimeResolution() {\n return this.bitstream.sampleRate;\n }\n getCodec() {\n return this.bitstream.codecInfo.codec;\n }\n getInternalCodecId() {\n return null;\n }\n async getDecoderConfig() {\n assert(this.bitstream.codecInfo.codec);\n return {\n codec: this.bitstream.codecInfo.codec,\n numberOfChannels: this.bitstream.numberOfChannels,\n sampleRate: this.bitstream.sampleRate,\n description: this.bitstream.description ?? undefined,\n };\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n granulePositionToTimestampInSamples(granulePosition) {\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip;\n }\n return granulePosition;\n }\n createEncodedPacketFromOggPacket(packet, additional, options) {\n if (!packet) {\n return null;\n }\n const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);\n const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);\n this.encodedPacketToMetadata.set(encodedPacket, {\n packet,\n timestampInSamples: additional.timestampInSamples,\n durationInSamples,\n vorbisLastBlockSize: additional.vorbisLastBlocksize,\n vorbisBlockSize,\n });\n return encodedPacket;\n }\n async getFirstPacket(options) {\n assert(this.bitstream.lastMetadataPacket);\n const packetPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!packetPosition) {\n return null;\n }\n let timestampInSamples = 0;\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;\n }\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: null,\n }, options);\n }\n async getNextPacket(prevPacket, options) {\n const prevMetadata = this.encodedPacketToMetadata.get(prevPacket);\n if (!prevMetadata) {\n throw new Error('Packet was not created from this track.');\n }\n const packetPosition = await this.demuxer.findNextPacketStart(prevMetadata.packet);\n if (!packetPosition) {\n return null;\n }\n const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples;\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: prevMetadata.vorbisBlockSize,\n }, options);\n }\n async getPacket(timestamp, options) {\n if (this.demuxer.reader.fileSize === null) {\n // No file size known, can't do binary search, but fall back to sequential algo instead\n return this.getPacketSequential(timestamp, options);\n }\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n if (timestampInSamples === 0) {\n // Fast path for timestamp 0 - avoids binary search when playing back from the start\n return this.getFirstPacket(options);\n }\n if (timestampInSamples < 0) {\n // There's nothing here\n return null;\n }\n assert(this.bitstream.lastMetadataPacket);\n const startPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!startPosition) {\n return null;\n }\n let lowPage = startPosition.startPage;\n let high = this.demuxer.reader.fileSize;\n const lowPages = [lowPage];\n // First, let's perform a binary serach (bisection search) on the file to find the approximate page where\n // we'll find the packet. We want to find a page whose end packet position is less than or equal to the\n // packet position we're searching for.\n // Outer loop: Does the binary serach\n outer: while (lowPage.headerStartPos + lowPage.totalSize < high) {\n const low = lowPage.headerStartPos;\n const mid = Math.floor((low + high) / 2);\n let searchStartPos = mid;\n // Inner loop: Does a linear forward scan if the page cannot be found immediately\n while (true) {\n const until = Math.min(searchStartPos + MAX_PAGE_SIZE, high - MIN_PAGE_HEADER_SIZE);\n let searchSlice = this.demuxer.reader.requestSlice(searchStartPos, until - searchStartPos);\n if (searchSlice instanceof Promise)\n searchSlice = await searchSlice;\n assert(searchSlice);\n const found = findNextPageHeader(searchSlice, until);\n if (!found) {\n high = mid + MIN_PAGE_HEADER_SIZE;\n continue outer;\n }\n let headerSlice = this.demuxer.reader.requestSliceRange(searchSlice.filePos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const page = readPageHeader(headerSlice);\n assert(page);\n let pageValid = false;\n if (page.serialNumber === this.bitstream.serialNumber) {\n // Serial numbers are basically random numbers, and the chance of finding a fake page with\n // matching serial number is astronomically low, so we can be pretty sure this page is legit.\n pageValid = true;\n }\n else {\n let pageSlice = this.demuxer.reader.requestSlice(page.headerStartPos, page.totalSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n // Validate the page by checking checksum\n const bytes = readBytes(pageSlice, page.totalSize);\n const crc = computeOggPageCrc(bytes);\n pageValid = crc === page.checksum;\n }\n if (!pageValid) {\n // Keep searching for a valid page\n searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes\n continue;\n }\n if (pageValid && page.serialNumber !== this.bitstream.serialNumber) {\n // Page is valid but from a different bitstream, so keep searching forward until we find one\n // belonging to the our bitstream\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n const isContinuationPage = page.granulePosition === -1;\n if (isContinuationPage) {\n // No packet ends on this page - keep looking\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n // The page is valid and belongs to our bitstream; let's check its granule position to see where we\n // need to take the bisection search.\n if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) {\n high = page.headerStartPos;\n }\n else {\n lowPage = page;\n lowPages.push(page);\n }\n continue outer;\n }\n }\n // Now we have the last page with a packet position <= the packet position we're looking for, but there\n // might be multiple pages with the packet position, in which case we actually need to find the first of\n // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet\n // position, and then linear scan ourselves forward until we find the correct page.\n let lowerPage = startPosition.startPage;\n for (const otherLowPage of lowPages) {\n if (otherLowPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) {\n lowerPage = otherLowPage;\n }\n }\n let currentPage = lowerPage;\n // Keep track of the pages we traversed, we need these later for backwards seeking\n const previousPages = [currentPage];\n while (true) {\n // This loop must terminate as we'll eventually reach lowPage\n if (currentPage.serialNumber === this.bitstream.serialNumber\n && currentPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n const nextPos = currentPage.headerStartPos + currentPage.totalSize;\n let slice = this.demuxer.reader.requestSliceRange(nextPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const nextPage = readPageHeader(slice);\n assert(nextPage);\n currentPage = nextPage;\n if (currentPage.serialNumber === this.bitstream.serialNumber) {\n previousPages.push(currentPage);\n }\n }\n assert(currentPage.granulePosition !== -1);\n let currentSegmentIndex = null;\n let currentTimestampInSamples;\n let currentTimestampIsCorrect;\n // These indicate the end position of the packet that the granule position belongs to\n let endPage = currentPage;\n let endSegmentIndex = 0;\n if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);\n currentTimestampIsCorrect = true;\n currentSegmentIndex = 0;\n }\n else {\n currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can\n currentTimestampIsCorrect = false;\n // Find the segment index of the next packet\n for (let i = currentPage.lacingValues.length - 1; i >= 0; i--) {\n const value = currentPage.lacingValues[i];\n if (value < 255) {\n // We know the last packet ended at i, so the next one starts at i + 1\n currentSegmentIndex = i + 1;\n break;\n }\n }\n // This must hold: Since this page has a granule position set, that means there must be a packet that\n // ends in this page.\n if (currentSegmentIndex === null) {\n throw new Error('Invalid page with granule position: no packets end on this page.');\n }\n endSegmentIndex = currentSegmentIndex - 1;\n const pseudopacket = {\n data: PLACEHOLDER_DATA,\n endPage,\n endSegmentIndex,\n };\n const nextPosition = await this.demuxer.findNextPacketStart(pseudopacket);\n if (nextPosition) {\n // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute\n // the duration for the packet we're looking for.\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n assert(endPosition);\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (startPosition) {\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n }\n }\n else {\n // There is no next position, which means we're looking for the last packet in the bitstream. The\n // granule position on the last page tends to be fucky, so let's instead start the search on the\n // page before that. So let's loop until we find a packet that ends in a previous page.\n while (true) {\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n if (!endPosition) {\n break;\n }\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (!startPosition) {\n break;\n }\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n if (endPosition.page.headerStartPos !== endPage.headerStartPos) {\n endPage = endPosition.page;\n endSegmentIndex = endPosition.segmentIndex;\n break;\n }\n }\n }\n }\n let lastEncodedPacket = null;\n let lastEncodedPacketMetadata = null;\n // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the\n // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for.\n while (currentPage !== null) {\n assert(currentSegmentIndex !== null);\n const packet = await this.demuxer.readPacket(currentPage, currentSegmentIndex);\n if (!packet) {\n break;\n }\n // We might need to skip the packet if it's a metadata one\n const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos\n && currentSegmentIndex < startPosition.startSegmentIndex;\n if (!skipPacket) {\n let encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n if (!currentTimestampIsCorrect\n && packet.endPage.headerStartPos === endPage.headerStartPos\n && packet.endSegmentIndex === endSegmentIndex) {\n // We know this packet end timestamp can be derived from the page's granule position\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition);\n currentTimestampIsCorrect = true;\n // Let's backpatch the packet we just created with the correct timestamp\n encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n }\n else {\n currentTimestampInSamples += encodedPacketMetadata.durationInSamples;\n }\n lastEncodedPacket = encodedPacket;\n lastEncodedPacketMetadata = encodedPacketMetadata;\n if (currentTimestampIsCorrect\n && (\n // Next timestamp will be too late\n Math.max(currentTimestampInSamples, 0) > timestampInSamples\n // This timestamp already matches\n || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) {\n break;\n }\n }\n const nextPosition = await this.demuxer.findNextPacketStart(packet);\n if (!nextPosition) {\n break;\n }\n currentPage = nextPosition.startPage;\n currentSegmentIndex = nextPosition.startSegmentIndex;\n }\n return lastEncodedPacket;\n }\n // A slower but simpler and sequential algorithm for finding a packet in a file\n async getPacketSequential(timestamp, options) {\n const release = await this.sequentialScanMutex.acquire(); // Requires exclusivity because we write to a cache\n try {\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n timestamp = timestampInSamples / this.internalSampleRate;\n const index = binarySearchLessOrEqual(this.sequentialScanCache, timestampInSamples, x => x.timestampInSamples);\n let currentPacket;\n if (index !== -1) {\n // We don't need to start from the beginning, we can start at a previous scan point\n const cacheEntry = this.sequentialScanCache[index];\n currentPacket = this.createEncodedPacketFromOggPacket(cacheEntry.packet, {\n timestampInSamples: cacheEntry.timestampInSamples,\n vorbisLastBlocksize: cacheEntry.vorbisLastBlockSize,\n }, options);\n }\n else {\n currentPacket = await this.getFirstPacket(options);\n }\n let i = 0;\n while (currentPacket && currentPacket.timestamp < timestamp) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket || nextPacket.timestamp > timestamp) {\n break;\n }\n currentPacket = nextPacket;\n i++;\n if (i === 100) {\n // Add \"checkpoints\" every once in a while to speed up subsequent random accesses\n i = 0;\n const metadata = this.encodedPacketToMetadata.get(currentPacket);\n assert(metadata);\n if (this.sequentialScanCache.length > 0) {\n // If we reach this case, we must be at the end of the cache\n assert(last(this.sequentialScanCache).timestampInSamples <= metadata.timestampInSamples);\n }\n this.sequentialScanCache.push(metadata);\n }\n }\n return currentPacket;\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n/** Finds the start position of a packet given its end position. */\nconst findPacketStartPosition = (pageList, endPage, endSegmentIndex) => {\n let page = endPage;\n let segmentIndex = endSegmentIndex;\n outer: while (true) {\n segmentIndex--;\n for (segmentIndex; segmentIndex >= 0; segmentIndex--) {\n const lacingValue = page.lacingValues[segmentIndex];\n if (lacingValue < 255) {\n segmentIndex++; // We know the last packet starts here\n break outer;\n }\n }\n assert(segmentIndex === -1);\n const pageStartsWithFreshPacket = !(page.headerType & 0x01);\n if (pageStartsWithFreshPacket) {\n // Fast exit: We know we don't need to look in the previous page\n segmentIndex = 0;\n break;\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < page.headerStartPos);\n if (!previousPage) {\n return null;\n }\n page = previousPage;\n segmentIndex = page.lacingValues.length;\n }\n assert(segmentIndex !== -1);\n if (segmentIndex === page.lacingValues.length) {\n // Wrap back around to the first segment of the next page\n const nextPage = pageList[pageList.indexOf(page) + 1];\n assert(nextPage);\n page = nextPage;\n segmentIndex = 0;\n }\n return { page, segmentIndex };\n};\n/** Finds the end position of a packet given the start position of the following packet. */\nconst findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex) => {\n if (startSegmentIndex > 0) {\n // Easy\n return { page: startPage, segmentIndex: startSegmentIndex - 1 };\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < startPage.headerStartPos);\n if (!previousPage) {\n return null;\n }\n return { page: previousPage, segmentIndex: previousPage.lacingValues.length - 1 };\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parseOpusTocByte } from '../codec-data.js';\nimport { assert, ilog, toDataView } from '../misc.js';\nexport const OGGS = 0x5367674f; // 'OggS'\nconst OGG_CRC_POLYNOMIAL = 0x04c11db7;\nconst OGG_CRC_TABLE = new Uint32Array(256);\nfor (let n = 0; n < 256; n++) {\n let crc = n << 24;\n for (let k = 0; k < 8; k++) {\n crc = (crc & 0x80000000)\n ? ((crc << 1) ^ OGG_CRC_POLYNOMIAL)\n : (crc << 1);\n }\n OGG_CRC_TABLE[n] = (crc >>> 0) & 0xffffffff;\n}\nexport const computeOggPageCrc = (bytes) => {\n const view = toDataView(bytes);\n const originalChecksum = view.getUint32(22, true);\n view.setUint32(22, 0, true); // Zero out checksum field\n let crc = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n crc = ((crc << 8) ^ OGG_CRC_TABLE[(crc >>> 24) ^ byte]) >>> 0;\n }\n view.setUint32(22, originalChecksum, true); // Restore checksum field\n return crc;\n};\nexport const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize) => {\n let durationInSamples = 0;\n let currentBlocksize = null;\n if (data.length > 0) {\n // To know sample duration, we'll need to peak inside the packet\n if (codecInfo.codec === 'vorbis') {\n assert(codecInfo.vorbisInfo);\n const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length;\n const bitCount = ilog(vorbisModeCount - 1);\n const modeMask = ((1 << bitCount) - 1) << 1;\n const modeNumber = (data[0] & modeMask) >> 1;\n if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) {\n throw new Error('Invalid mode number.');\n }\n // In Vorbis, packet duration also depends on the blocksize of the previous packet\n let prevBlocksize = vorbisLastBlocksize;\n const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber];\n currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag];\n if (blockflag === 1) {\n const prevMask = (modeMask | 0x1) + 1;\n const flag = data[0] & prevMask ? 1 : 0;\n prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag];\n }\n durationInSamples = prevBlocksize !== null\n ? (prevBlocksize + currentBlocksize) >> 2\n : 0; // The first sample outputs no audio data and therefore has a duration of 0\n }\n else if (codecInfo.codec === 'opus') {\n const toc = parseOpusTocByte(data);\n durationInSamples = toc.durationInSamples;\n }\n }\n return {\n durationInSamples,\n vorbisBlockSize: currentBlocksize,\n };\n};\nexport const buildOggMimeType = (info) => {\n let string = 'audio/ogg';\n if (info.codecStrings) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { readI64Le, readU32Le, readU8 } from '../reader.js';\nimport { OGGS } from './ogg-misc.js';\nexport const MIN_PAGE_HEADER_SIZE = 27;\nexport const MAX_PAGE_HEADER_SIZE = 27 + 255;\nexport const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 255 * 255;\nexport const readPageHeader = (slice) => {\n const startPos = slice.filePos;\n const capturePattern = readU32Le(slice);\n if (capturePattern !== OGGS) {\n return null;\n }\n slice.skip(1); // Version\n const headerType = readU8(slice);\n const granulePosition = readI64Le(slice);\n const serialNumber = readU32Le(slice);\n const sequenceNumber = readU32Le(slice);\n const checksum = readU32Le(slice);\n const numberPageSegments = readU8(slice);\n const lacingValues = new Uint8Array(numberPageSegments);\n for (let i = 0; i < numberPageSegments; i++) {\n lacingValues[i] = readU8(slice);\n }\n const headerSize = 27 + numberPageSegments;\n const dataSize = lacingValues.reduce((a, b) => a + b, 0);\n const totalSize = headerSize + dataSize;\n return {\n headerStartPos: startPos,\n totalSize,\n dataStartPos: startPos + headerSize,\n dataSize,\n headerType,\n granulePosition,\n serialNumber,\n sequenceNumber,\n checksum,\n lacingValues,\n };\n};\nexport const findNextPageHeader = (slice, until) => {\n while (slice.filePos < until - (4 - 1)) { // Size of word minus 1\n const word = readU32Le(slice);\n const firstByte = word & 0xff;\n const secondByte = (word >>> 8) & 0xff;\n const thirdByte = (word >>> 16) & 0xff;\n const fourthByte = (word >>> 24) & 0xff;\n const O = 0x4f; // 'O'\n if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) {\n continue;\n }\n slice.skip(-4);\n if (word === OGGS) {\n // We have found the capture pattern\n return true;\n }\n slice.skip(1);\n }\n return false;\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readAscii, readBytes, readU16, readU32, readU64 } from '../reader.js';\nimport { parseId3V2Tag, readId3V2Header } from '../id3.js';\nexport var WaveFormat;\n(function (WaveFormat) {\n WaveFormat[WaveFormat[\"PCM\"] = 1] = \"PCM\";\n WaveFormat[WaveFormat[\"IEEE_FLOAT\"] = 3] = \"IEEE_FLOAT\";\n WaveFormat[WaveFormat[\"ALAW\"] = 6] = \"ALAW\";\n WaveFormat[WaveFormat[\"MULAW\"] = 7] = \"MULAW\";\n WaveFormat[WaveFormat[\"EXTENSIBLE\"] = 65534] = \"EXTENSIBLE\";\n})(WaveFormat || (WaveFormat = {}));\nexport class WaveDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.dataStart = -1;\n this.dataSize = -1;\n this.audioInfo = null;\n this.tracks = [];\n this.lastKnownPacketIndex = 0;\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let slice = this.reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const riffType = readAscii(slice, 4);\n const littleEndian = riffType !== 'RIFX';\n const isRf64 = riffType === 'RF64';\n const outerChunkSize = readU32(slice, littleEndian);\n let totalFileSize = isRf64\n ? this.reader.fileSize\n : Math.min(outerChunkSize + 8, this.reader.fileSize ?? Infinity);\n const format = readAscii(slice, 4);\n if (format !== 'WAVE') {\n throw new Error('Invalid WAVE file - wrong format');\n }\n let chunksRead = 0;\n let dataChunkSize = null;\n let currentPos = slice.filePos;\n while (totalFileSize === null || currentPos < totalFileSize) {\n let slice = this.reader.requestSlice(currentPos, 8);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const chunkId = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const startPos = slice.filePos;\n if (isRf64 && chunksRead === 0 && chunkId !== 'ds64') {\n throw new Error('Invalid RF64 file: First chunk must be \"ds64\".');\n }\n if (chunkId === 'fmt ') {\n await this.parseFmtChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'data') {\n dataChunkSize ??= chunkSize;\n this.dataStart = slice.filePos;\n this.dataSize = Math.min(dataChunkSize, (totalFileSize ?? Infinity) - this.dataStart);\n if (this.reader.fileSize === null) {\n break; // Stop once we hit the data chunk\n }\n }\n else if (chunkId === 'ds64') {\n // File and data chunk sizes are defined in here instead\n let ds64Slice = this.reader.requestSlice(startPos, chunkSize);\n if (ds64Slice instanceof Promise)\n ds64Slice = await ds64Slice;\n if (!ds64Slice)\n break;\n const riffChunkSize = readU64(ds64Slice, littleEndian);\n dataChunkSize = readU64(ds64Slice, littleEndian);\n totalFileSize = Math.min(riffChunkSize + 8, this.reader.fileSize ?? Infinity);\n }\n else if (chunkId === 'LIST') {\n await this.parseListChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'ID3 ' || chunkId === 'id3 ') {\n await this.parseId3Chunk(startPos, chunkSize);\n }\n currentPos = startPos + chunkSize + (chunkSize & 1); // Handle padding\n chunksRead++;\n }\n if (!this.audioInfo) {\n throw new Error('Invalid WAVE file - missing \"fmt \" chunk');\n }\n if (this.dataStart === -1) {\n throw new Error('Invalid WAVE file - missing \"data\" chunk');\n }\n const blockSize = this.audioInfo.blockSizeInBytes;\n this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize;\n this.tracks.push(new InputAudioTrack(this.input, new WaveAudioTrackBacking(this)));\n })();\n }\n async parseFmtChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n let formatTag = readU16(slice, littleEndian);\n const numChannels = readU16(slice, littleEndian);\n const sampleRate = readU32(slice, littleEndian);\n slice.skip(4); // Bytes per second\n const blockAlign = readU16(slice, littleEndian);\n let bitsPerSample;\n if (size === 14) { // Plain WAVEFORMAT\n bitsPerSample = 8;\n }\n else {\n bitsPerSample = readU16(slice, littleEndian);\n }\n // Handle WAVEFORMATEXTENSIBLE\n if (size >= 18 && formatTag !== 0x0165) {\n const cbSize = readU16(slice, littleEndian);\n const remainingSize = size - 18;\n const extensionSize = Math.min(remainingSize, cbSize);\n if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) {\n // Parse WAVEFORMATEXTENSIBLE\n slice.skip(2 + 4);\n const subFormat = readBytes(slice, 16);\n // Get actual format from subFormat GUID\n formatTag = subFormat[0] | (subFormat[1] << 8);\n }\n }\n if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) {\n bitsPerSample = 8;\n }\n this.audioInfo = {\n format: formatTag,\n numberOfChannels: numChannels,\n sampleRate,\n sampleSizeInBytes: Math.ceil(bitsPerSample / 8),\n blockSizeInBytes: blockAlign,\n };\n }\n async parseListChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const infoType = readAscii(slice, 4);\n if (infoType !== 'INFO' && infoType !== 'INF0') { // exiftool.org claims INF0 can happen\n return; // Not an INFO chunk\n }\n let currentPos = slice.filePos;\n while (currentPos <= startPos + size - 8) {\n slice.filePos = currentPos;\n const chunkName = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const bytes = readBytes(slice, chunkSize);\n let stringLength = 0;\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === 0) {\n break;\n }\n stringLength++;\n }\n const value = String.fromCharCode(...bytes.subarray(0, stringLength));\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[chunkName] = value;\n switch (chunkName) {\n case 'INAM':\n case 'TITL':\n {\n this.metadataTags.title ??= value;\n }\n ;\n break;\n case 'TIT3':\n {\n this.metadataTags.description ??= value;\n }\n ;\n break;\n case 'IART':\n {\n this.metadataTags.artist ??= value;\n }\n ;\n break;\n case 'IPRD':\n {\n this.metadataTags.album ??= value;\n }\n ;\n break;\n case 'IPRT':\n case 'ITRK':\n case 'TRCK':\n {\n const parts = value.split('/');\n const trackNum = Number.parseInt(parts[0], 10);\n const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n if (Number.isInteger(trackNum) && trackNum > 0) {\n this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'ICRD':\n case 'IDIT':\n {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n ;\n break;\n case 'YEAR':\n {\n const year = Number.parseInt(value, 10);\n if (Number.isInteger(year) && year > 0) {\n this.metadataTags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'IGNR':\n case 'GENR':\n {\n this.metadataTags.genre ??= value;\n }\n ;\n break;\n case 'ICMT':\n case 'CMNT':\n case 'COMM':\n {\n this.metadataTags.comment ??= value;\n }\n ;\n break;\n }\n currentPos += 8 + chunkSize + (chunkSize & 1); // Handle padding\n }\n }\n async parseId3Chunk(startPos, size) {\n // Parse ID3 tag embedded in WAV file (non-default, but used a lot in practice anyway)\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const id3V2Header = readId3V2Header(slice);\n if (id3V2Header) {\n // Extract the content portion (skip the 10-byte header)\n const contentSlice = slice.slice(startPos + 10, id3V2Header.size);\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n }\n }\n getCodec() {\n assert(this.audioInfo);\n if (this.audioInfo.format === WaveFormat.MULAW) {\n return 'ulaw';\n }\n if (this.audioInfo.format === WaveFormat.ALAW) {\n return 'alaw';\n }\n if (this.audioInfo.format === WaveFormat.PCM) {\n // All formats are little-endian\n if (this.audioInfo.sampleSizeInBytes === 1) {\n return 'pcm-u8';\n }\n else if (this.audioInfo.sampleSizeInBytes === 2) {\n return 'pcm-s16';\n }\n else if (this.audioInfo.sampleSizeInBytes === 3) {\n return 'pcm-s24';\n }\n else if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-s32';\n }\n }\n if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) {\n if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-f32';\n }\n }\n return null;\n }\n async getMimeType() {\n return 'audio/wav';\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nconst PACKET_SIZE_IN_FRAMES = 2048;\nclass WaveAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return this.demuxer.getCodec();\n }\n getInternalCodecId() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.format;\n }\n async getDecoderConfig() {\n const codec = this.demuxer.getCodec();\n if (!codec) {\n return null;\n }\n assert(this.demuxer.audioInfo);\n return {\n codec,\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n };\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getPacketAtIndex(packetIndex, options) {\n assert(this.demuxer.audioInfo);\n const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n if (startOffset >= this.demuxer.dataSize) {\n return null;\n }\n const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset);\n if (this.demuxer.reader.fileSize === null) {\n // If the file size is unknown, we weren't able to cap the dataSize in the init logic and we instead have to\n // rely on the headers telling us how large the file is. But, these might be wrong, so let's check if the\n // requested slice actually exists.\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sizeInBytes);\n }\n const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate;\n const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate;\n this.demuxer.lastKnownPacketIndex = Math.max(packetIndex, timestamp);\n return new EncodedPacket(data, 'key', timestamp, duration, packetIndex, sizeInBytes);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.floor(Math.min(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES, (this.demuxer.dataSize - 1) / (PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes)));\n const packet = await this.getPacketAtIndex(packetIndex, options);\n if (packet) {\n return packet;\n }\n if (packetIndex === 0) {\n return null; // Empty data chunk\n }\n assert(this.demuxer.reader.fileSize === null);\n // The file is shorter than we thought, meaning the packet we were looking for doesn't exist. So, let's find\n // the last packet by doing a sequential scan, instead.\n let currentPacket = await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex, options);\n while (currentPacket) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket) {\n break;\n }\n currentPacket = nextPacket;\n }\n return currentPacket;\n }\n getNextPacket(packet, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex + 1, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Bitstream } from '../misc.js';\nimport { readBytes } from '../reader.js';\nexport const MIN_FRAME_HEADER_SIZE = 7;\nexport const MAX_FRAME_HEADER_SIZE = 9;\nexport const readFrameHeader = (slice) => {\n // https://wiki.multimedia.cx/index.php/ADTS (last visited: 2025/08/17)\n const startPos = slice.filePos;\n const bytes = readBytes(slice, 9); // 9 with CRC, 7 without CRC\n const bitstream = new Bitstream(bytes);\n const syncword = bitstream.readBits(12);\n if (syncword !== 0b1111_11111111) {\n return null;\n }\n bitstream.skipBits(1); // MPEG version\n const layer = bitstream.readBits(2);\n if (layer !== 0) {\n return null;\n }\n const protectionAbsence = bitstream.readBits(1);\n const objectType = bitstream.readBits(2) + 1;\n const samplingFrequencyIndex = bitstream.readBits(4);\n if (samplingFrequencyIndex === 15) {\n return null;\n }\n bitstream.skipBits(1); // Private bit\n const channelConfiguration = bitstream.readBits(3);\n if (channelConfiguration === 0) {\n throw new Error('ADTS frames with channel configuration 0 are not supported.');\n }\n bitstream.skipBits(1); // Originality\n bitstream.skipBits(1); // Home\n bitstream.skipBits(1); // Copyright ID bit\n bitstream.skipBits(1); // Copyright ID start\n const frameLength = bitstream.readBits(13);\n bitstream.skipBits(11); // Buffer fullness\n const numberOfAacFrames = bitstream.readBits(2) + 1;\n if (numberOfAacFrames !== 1) {\n throw new Error('ADTS frames with more than one AAC frame are not supported.');\n }\n let crcCheck = null;\n if (protectionAbsence === 1) { // No CRC\n slice.filePos -= 2;\n }\n else { // CRC\n crcCheck = bitstream.readBits(16);\n }\n return {\n objectType,\n samplingFrequencyIndex,\n channelConfiguration,\n frameLength,\n numberOfAacFrames,\n crcCheck,\n startPos,\n };\n};\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { aacChannelMap, aacFrequencyTable } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, Bitstream, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts-reader.js';\nconst SAMPLES_PER_AAC_FRAME = 1024;\nexport class AdtsDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = [];\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n // There has to be a frame if this demuxer got selected\n assert(this.firstFrameHeader);\n // Create the single audio track\n this.tracks = [new InputAudioTrack(this.input, new AdtsAudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n let slice = this.reader.requestSliceRange(this.lastLoadedPos, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = readFrameHeader(slice);\n if (!header) {\n this.lastSampleLoaded = true;\n return;\n }\n if (this.reader.fileSize !== null && header.startPos + header.frameLength > this.reader.fileSize) {\n // Frame doesn't fit in the rest of the file\n this.lastSampleLoaded = true;\n return;\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n const sampleRate = aacFrequencyTable[header.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n const sampleDuration = SAMPLES_PER_AAC_FRAME / sampleRate;\n const headerSize = header.crcCheck ? MAX_FRAME_HEADER_SIZE : MIN_FRAME_HEADER_SIZE;\n const sample = {\n timestamp: this.nextTimestampInSamples / sampleRate,\n duration: sampleDuration,\n dataStart: header.startPos + headerSize,\n dataSize: header.frameLength - headerSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += SAMPLES_PER_AAC_FRAME;\n this.lastLoadedPos = header.startPos + header.frameLength;\n }\n async getMimeType() {\n return 'audio/aac';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n return {}; // No tags in this one\n }\n}\nclass AdtsAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n const sampleRate = this.getSampleRate();\n return sampleRate / SAMPLES_PER_AAC_FRAME;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'aac';\n }\n getInternalCodecId() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.objectType;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n const numberOfChannels = aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];\n assert(numberOfChannels !== undefined);\n return numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n const sampleRate = aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n return sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n const bytes = new Uint8Array(3); // 19 bits max\n const bitstream = new Bitstream(bytes);\n const { objectType, samplingFrequencyIndex, channelConfiguration } = this.demuxer.firstFrameHeader;\n if (objectType > 31) {\n bitstream.writeBits(5, 31);\n bitstream.writeBits(6, objectType - 32);\n }\n else {\n bitstream.writeBits(5, objectType);\n }\n bitstream.writeBits(4, samplingFrequencyIndex); // samplingFrequencyIndex === 15 is forbidden\n bitstream.writeBits(4, channelConfiguration);\n return {\n codec: `mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,\n numberOfChannels: this.getNumberOfChannels(),\n sampleRate: this.getSampleRate(),\n description: bytes.subarray(0, Math.ceil((bitstream.pos - 1) / 8)),\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { FlacBlockType, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, Bitstream, textDecoder, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes, readU24Be, readU32Be, readU8, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { calculateCrc8, readBlockSize, getBlockSizeOrUncommon, readCodedNumber, readSampleRate, getSampleRateOrUncommon, } from './flac-misc.js';\nexport class FlacDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataPromise = null;\n this.track = null;\n this.metadataTags = {};\n this.audioInfo = null;\n this.lastLoadedPos = null;\n this.blockingBit = null;\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n await this.readMetadata();\n assert(this.track);\n return this.track.computeDuration();\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n async getTracks() {\n await this.readMetadata();\n assert(this.track);\n return [this.track];\n }\n async getMimeType() {\n return 'audio/flac';\n }\n async readMetadata() {\n let currentPos = 4; // Skip 'fLaC'\n return (this.metadataPromise ??= (async () => {\n while (this.reader.fileSize === null\n || currentPos < this.reader.fileSize) {\n let sizeSlice = this.reader.requestSlice(currentPos, 4);\n if (sizeSlice instanceof Promise)\n sizeSlice = await sizeSlice;\n currentPos += 4;\n if (sizeSlice === null) {\n throw new Error(`Metadata block at position ${currentPos} is too small! Corrupted file.`);\n }\n assert(sizeSlice);\n const byte = readU8(sizeSlice); // first bit: isLastMetadata, remaining 7 bits: metaBlockType\n const size = readU24Be(sizeSlice);\n const isLastMetadata = (byte & 0x80) !== 0;\n const metaBlockType = byte & 0x7f;\n switch (metaBlockType) {\n case FlacBlockType.STREAMINFO: {\n // Parse streaminfo block\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-8.2\n let streamInfoBlock = this.reader.requestSlice(currentPos, size);\n if (streamInfoBlock instanceof Promise)\n streamInfoBlock = await streamInfoBlock;\n assert(streamInfoBlock);\n if (streamInfoBlock === null) {\n throw new Error(`StreamInfo block at position ${currentPos} is too small! Corrupted file.`);\n }\n const streamInfoBytes = readBytes(streamInfoBlock, 34);\n const bitstream = new Bitstream(streamInfoBytes);\n const minimumBlockSize = bitstream.readBits(16);\n const maximumBlockSize = bitstream.readBits(16);\n const minimumFrameSize = bitstream.readBits(24);\n const maximumFrameSize = bitstream.readBits(24);\n const sampleRate = bitstream.readBits(20);\n const numberOfChannels = bitstream.readBits(3) + 1;\n bitstream.readBits(5); // bitsPerSample - 1\n const totalSamples = bitstream.readBits(36);\n // https://www.w3.org/TR/webcodecs-flac-codec-registration/#audiodecoderconfig-description\n // description is required, and has to be the following:\n // 1. The bytes 0x66 0x4C 0x61 0x43 (\"fLaC\" in ASCII)\n // 2. A metadata block (called the STREAMINFO block) as described in section 7 of [FLAC]\n // 3. Optionaly (sic) other metadata blocks, that are not used by the specification\n bitstream.skipBits(16 * 8); // md5 hash\n const description = new Uint8Array(42);\n // 1. \"fLaC\"\n description.set(new Uint8Array([0x66, 0x4c, 0x61, 0x43]), 0);\n // 2. STREAMINFO block\n description.set(new Uint8Array([128, 0, 0, 34]), 4);\n // 3. Other metadata blocks\n description.set(streamInfoBytes, 8);\n this.audioInfo = {\n numberOfChannels,\n sampleRate,\n totalSamples,\n minimumBlockSize,\n maximumBlockSize,\n minimumFrameSize,\n maximumFrameSize,\n description,\n };\n this.track = new InputAudioTrack(this.input, new FlacAudioTrackBacking(this));\n break;\n }\n case FlacBlockType.VORBIS_COMMENT: {\n // Parse vorbis comment block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-vorbis-comment\n let vorbisCommentBlock = this.reader.requestSlice(currentPos, size);\n if (vorbisCommentBlock instanceof Promise)\n vorbisCommentBlock = await vorbisCommentBlock;\n assert(vorbisCommentBlock);\n readVorbisComments(readBytes(vorbisCommentBlock, size), this.metadataTags);\n break;\n }\n case FlacBlockType.PICTURE: {\n // Parse picture block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-picture\n let pictureBlock = this.reader.requestSlice(currentPos, size);\n if (pictureBlock instanceof Promise)\n pictureBlock = await pictureBlock;\n assert(pictureBlock);\n const pictureType = readU32Be(pictureBlock);\n const mediaTypeLength = readU32Be(pictureBlock);\n const mediaType = textDecoder.decode(readBytes(pictureBlock, mediaTypeLength));\n const descriptionLength = readU32Be(pictureBlock);\n const description = textDecoder.decode(readBytes(pictureBlock, descriptionLength));\n pictureBlock.skip(4 + 4 + 4 + 4); // Skip width, height, color depth, number of indexed colors\n const dataLength = readU32Be(pictureBlock);\n const data = readBytes(pictureBlock, dataLength);\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n mimeType: mediaType,\n // https://www.rfc-editor.org/rfc/rfc9639.html#table13\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n break;\n }\n default:\n break;\n }\n currentPos += size;\n if (isLastMetadata) {\n this.lastLoadedPos = currentPos;\n break;\n }\n }\n })());\n }\n async readNextFlacFrame({ startPos, isFirstPacket, }) {\n assert(this.audioInfo);\n // we expect that there are at least `minimumFrameSize` bytes left in the file\n // Ideally we also want to validate the next header is valid\n // to throw out an accidential sync word\n // The shortest valid FLAC header I can think of, based off the code\n // of readFlacFrameHeader:\n // 4 bytes used for bitstream from syncword to bit depth\n // 1 byte coded number\n // (uncommon values, no bytes read)\n // 1 byte crc\n // --> 6 bytes\n const minimumHeaderLength = 6;\n // If we read everything in readFlacFrameHeader, we read 16 bytes\n const maximumHeaderSize = 16;\n const maximumSliceLength = this.audioInfo.maximumFrameSize + maximumHeaderSize;\n const slice = await this.reader.requestSliceRange(startPos, this.audioInfo.minimumFrameSize, maximumSliceLength);\n if (!slice) {\n return null;\n }\n const frameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: isFirstPacket,\n });\n if (!frameHeader) {\n return null;\n }\n // We don't know exactly how long the packet is, we only know the `minimumFrameSize` and `maximumFrameSize`\n // The packet is over if the next 2 bytes are the sync word followed by a valid header\n // or the end of the file is reached\n // The next sync word is expected at earliest when `minimumFrameSize` is reached,\n // we can skip over anything before that\n slice.filePos = startPos + this.audioInfo.minimumFrameSize;\n while (true) {\n // Reached end of the file, packet is over\n if (slice.filePos > slice.end - minimumHeaderLength) {\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: slice.end - startPos,\n isLastFrame: true,\n };\n }\n const nextByte = readU8(slice);\n if (nextByte === 0xff) {\n const positionBeforeReading = slice.filePos;\n const byteAfterNextByte = readU8(slice);\n const expected = this.blockingBit === 1 ? 0b1111_1001 : 0b1111_1000;\n if (byteAfterNextByte !== expected) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n slice.skip(-2);\n const lengthIfNextFlacFrameHeaderIsLegit = slice.filePos - startPos;\n const nextFrameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: false,\n });\n if (!nextFrameHeader) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n // Ensure the frameOrSampleNum is consecutive.\n // https://github.com/Vanilagy/mediabunny/issues/194\n if (this.blockingBit === 0) {\n // Case A: If the stream is fixed block size, this is the frame number, which increments by 1\n if (nextFrameHeader.num - frameHeader.num !== 1) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n else {\n // Case B: If the stream is variable block size, this is the sample number, which increments by\n // amount of samples in a frame.\n if (nextFrameHeader.num - frameHeader.num !== frameHeader.blockSize) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: lengthIfNextFlacFrameHeaderIsLegit,\n isLastFrame: false,\n };\n }\n }\n }\n readFlacFrameHeader({ slice, isFirstPacket, }) {\n // In this function, generally it is not safe to throw errors.\n // We might end up here because we stumbled upon a syncword,\n // but the data might not actually be a FLAC frame, it might be random bitstream\n // data, in that case we should return null and continue.\n const startOffset = slice.filePos;\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1\n // Each frame MUST start on a byte boundary and start with the 15-bit frame\n // sync code 0b111111111111100. Following the sync code is the blocking strategy\n // bit, which MUST NOT change during the audio stream.\n const bytes = readBytes(slice, 4);\n const bitstream = new Bitstream(bytes);\n const bits = bitstream.readBits(15);\n if (bits !== 0b111111111111100) {\n // This cannot be a valid FLAC frame, must start with the syncword\n return null;\n }\n if (this.blockingBit === null) {\n assert(isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n this.blockingBit = newBlockingBit;\n }\n else if (this.blockingBit === 1) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 1) {\n // This cannot be a valid FLAC frame, expected 1 but got 0\n return null;\n }\n }\n else if (this.blockingBit === 0) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 0) {\n // This cannot be a valid FLAC frame, expected 0 but got 1\n return null;\n }\n }\n else {\n throw new Error('Invalid blocking bit');\n }\n const blockSizeOrUncommon = getBlockSizeOrUncommon(bitstream.readBits(4));\n if (!blockSizeOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n assert(this.audioInfo);\n const sampleRateOrUncommon = getSampleRateOrUncommon(bitstream.readBits(4), this.audioInfo.sampleRate);\n if (!sampleRateOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n bitstream.readBits(4); // channel count\n bitstream.readBits(3); // bit depth\n const reservedZero = bitstream.readBits(1); // reserved zero\n if (reservedZero !== 0) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n const num = readCodedNumber(slice);\n const blockSize = readBlockSize(slice, blockSizeOrUncommon);\n const sampleRate = readSampleRate(slice, sampleRateOrUncommon);\n if (sampleRate === null) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n if (sampleRate !== this.audioInfo.sampleRate) {\n // This cannot be a valid FLAC frame, the sample rate is not the same as in the stream info\n return null;\n }\n const size = slice.filePos - startOffset;\n const crc = readU8(slice);\n slice.skip(-size);\n slice.skip(-1);\n const crcCalculated = calculateCrc8(readBytes(slice, size));\n if (crc !== crcCalculated) {\n // Maybe this wasn't a FLAC frame at all, the syncword was just coincidentally\n // in the bitstream\n return null;\n }\n return { num, blockSize, sampleRate };\n }\n async advanceReader() {\n await this.readMetadata();\n assert(this.lastLoadedPos !== null);\n assert(this.audioInfo);\n const startPos = this.lastLoadedPos;\n const frame = await this.readNextFlacFrame({\n startPos,\n isFirstPacket: this.loadedSamples.length === 0,\n });\n if (!frame) {\n // Unexpected case, failed to read next FLAC frame\n // handling gracefully\n this.lastSampleLoaded = true;\n return;\n }\n const lastSample = this.loadedSamples[this.loadedSamples.length - 1];\n const blockOffset = lastSample\n ? lastSample.blockOffset + lastSample.blockSize\n : 0;\n const sample = {\n blockOffset,\n blockSize: frame.blockSize,\n byteOffset: startPos,\n byteSize: frame.size,\n };\n this.lastLoadedPos = this.lastLoadedPos + frame.size;\n this.loadedSamples.push(sample);\n if (frame.isLastFrame) {\n this.lastSampleLoaded = true;\n return;\n }\n }\n}\nclass FlacAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return 'flac';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getDecoderConfig() {\n assert(this.demuxer.audioInfo);\n return {\n codec: 'flac',\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n description: this.demuxer.audioInfo.description,\n };\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n if (timestamp < 0) {\n throw new Error('Timestamp cannot be negative');\n }\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const packetIndex = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.blockOffset / this.demuxer.audioInfo.sampleRate);\n if (packetIndex === -1) {\n await this.demuxer.advanceReader();\n continue;\n }\n const packet = this.demuxer.loadedSamples[packetIndex];\n const sampleTimestamp = packet.blockOffset / this.demuxer.audioInfo.sampleRate;\n const sampleDuration = packet.blockSize / this.demuxer.audioInfo.sampleRate;\n if (sampleTimestamp + sampleDuration <= timestamp) {\n if (this.demuxer.lastSampleLoaded) {\n return this.getPacketAtIndex(this.demuxer.loadedSamples.length - 1, options);\n }\n await this.demuxer.advanceReader();\n continue;\n }\n return this.getPacketAtIndex(packetIndex, options);\n }\n }\n finally {\n release();\n }\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const nextIndex = packet.sequenceNumber + 1;\n if (this.demuxer.lastSampleLoaded\n && nextIndex >= this.demuxer.loadedSamples.length) {\n return null;\n }\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n async getPacketAtIndex(sampleIndex, options) {\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.byteOffset, rawSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.byteSize);\n }\n assert(this.demuxer.audioInfo);\n const timestamp = rawSample.blockOffset / this.demuxer.audioInfo.sampleRate;\n const duration = rawSample.blockSize / this.demuxer.audioInfo.sampleRate;\n return new EncodedPacket(data, 'key', timestamp, duration, sampleIndex, rawSample.byteSize);\n }\n async getFirstPacket(options) {\n // Ensure the next sample exists\n while (this.demuxer.loadedSamples.length === 0\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(0, options);\n }\n}\n","/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, assertNever, Bitstream } from '../misc.js';\nimport { readBytes, readU16Be, readU8 } from '../reader.js';\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-block-size-bits\nexport const getBlockSizeOrUncommon = (bits) => {\n if (bits === 0b0000) {\n return null;\n }\n else if (bits === 0b0001) {\n return 192;\n }\n else if (bits >= 0b0010 && bits <= 0b0101) {\n return 144 * 2 ** bits;\n }\n else if (bits === 0b0110) {\n return 'uncommon-u8';\n }\n else if (bits === 0b0111) {\n return 'uncommon-u16';\n }\n else if (bits >= 0b1000 && bits <= 0b1111) {\n return 2 ** bits;\n }\n else {\n return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-sample-rate-bits\nexport const getSampleRateOrUncommon = (sampleRateBits, streamInfoSampleRate) => {\n switch (sampleRateBits) {\n case 0b0000: return streamInfoSampleRate;\n case 0b0001: return 88200;\n case 0b0010: return 176400;\n case 0b0011: return 192000;\n case 0b0100: return 8000;\n case 0b0101: return 16000;\n case 0b0110: return 22050;\n case 0b0111: return 24000;\n case 0b1000: return 32000;\n case 0b1001: return 44100;\n case 0b1010: return 48000;\n case 0b1011: return 96000;\n case 0b1100: return 'uncommon-u8';\n case 0b1101: return 'uncommon-u16';\n case 0b1110: return 'uncommon-u16-10';\n default: return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-coded-number\nexport const readCodedNumber = (fileSlice) => {\n let ones = 0;\n const bitstream1 = new Bitstream(readBytes(fileSlice, 1));\n while (bitstream1.readBits(1) === 1) {\n ones++;\n }\n if (ones === 0) {\n return bitstream1.readBits(7);\n }\n const bitArray = [];\n const extraBytes = ones - 1;\n const bitstream2 = new Bitstream(readBytes(fileSlice, extraBytes));\n const firstByteBits = 8 - ones - 1;\n for (let i = 0; i < firstByteBits; i++) {\n bitArray.unshift(bitstream1.readBits(1));\n }\n for (let i = 0; i < extraBytes; i++) {\n for (let j = 0; j < 8; j++) {\n const val = bitstream2.readBits(1);\n if (j < 2) {\n continue;\n }\n bitArray.unshift(val);\n }\n }\n const encoded = bitArray.reduce((acc, bit, index) => {\n return acc | (bit << index);\n }, 0);\n return encoded;\n};\nexport const readBlockSize = (slice, blockSizeBits) => {\n if (blockSizeBits === 'uncommon-u16') {\n return readU16Be(slice) + 1;\n }\n else if (blockSizeBits === 'uncommon-u8') {\n return readU8(slice) + 1;\n }\n else if (typeof blockSizeBits === 'number') {\n return blockSizeBits;\n }\n else {\n assertNever(blockSizeBits);\n assert(false);\n }\n};\nexport const readSampleRate = (slice, sampleRateOrUncommon) => {\n if (sampleRateOrUncommon === 'uncommon-u16') {\n return readU16Be(slice);\n }\n if (sampleRateOrUncommon === 'uncommon-u16-10') {\n return readU16Be(slice) * 10;\n }\n if (sampleRateOrUncommon === 'uncommon-u8') {\n return readU8(slice);\n }\n if (typeof sampleRateOrUncommon === 'number') {\n return sampleRateOrUncommon;\n }\n return null;\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1.1\nexport const calculateCrc8 = (data) => {\n const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0\n let crc = 0x00; // Initialize CRC to 0\n for (const byte of data) {\n crc ^= byte; // XOR byte into least significant byte of crc\n for (let i = 0; i < 8; i++) {\n // For each bit in the byte\n if ((crc & 0x80) !== 0) {\n // If the leftmost bit (MSB) is set\n crc = (crc << 1) ^ polynomial; // Shift left and XOR with polynomial\n }\n else {\n crc <<= 1; // Just shift left\n }\n crc &= 0xff; // Ensure CRC remains 8-bit\n }\n }\n return crc;\n};\n","import {\n ALL_FORMATS,\n BlobSource,\n CanvasSink,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default function createVideoEngine({\n canvas,\n ctx,\n events,\n timeupdateInterval = 250,\n avSyncTolerance = 0.12,\n dropLateFrames = false,\n poster = '',\n preflightRange = false,\n}) {\n let input = null\n let videoSink = null\n let videoIterator = null\n\n let nextFrame = null\n let rafId = 0\n let asyncId = 0\n\n let _width = 0\n let _height = 0\n let _duration = Number.NaN\n\n let audioClock = null\n let lastTimeUpdate = 0\n let stalled = false\n let playbackRate = 1\n let posterDrawn = false\n\n function normalizeSource(src) {\n if (typeof src === 'string')\n return new UrlSource(src)\n if (src instanceof Blob)\n return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream)\n return new ReadableStreamSource(src)\n return src\n }\n\n async function preflight(url) {\n if (!preflightRange || typeof url !== 'string')\n return true\n try {\n const res = await fetch(url, { method: 'HEAD' })\n const acceptRanges = res.headers.get('accept-ranges')\n if (!acceptRanges || acceptRanges === 'none') {\n events.emit('error', new Event('RangeNotSupported'))\n return false\n }\n return true\n }\n catch (e) {\n console.warn('preflight failed', e)\n return true\n }\n }\n\n function drawPoster() {\n if (!poster || posterDrawn)\n return\n const img = new Image()\n img.onload = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n canvas.width = img.naturalWidth || canvas.width\n canvas.height = img.naturalHeight || canvas.height\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n posterDrawn = true\n }\n img.src = poster\n }\n\n async function stopIterator() {\n await videoIterator?.return()\n videoIterator = null\n }\n\n function clear() {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n }\n\n async function load(src, onMetadata) {\n asyncId++\n const id = asyncId\n\n await stopIterator()\n clear()\n posterDrawn = false\n\n if (!(await preflight(src)))\n return\n\n const source = normalizeSource(src)\n if (!source) {\n drawPoster()\n return\n }\n\n input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n _duration = await input.computeDuration()\n if (id !== asyncId)\n return\n\n const videoTrack = await input.getPrimaryVideoTrack()\n if (!videoTrack) {\n videoSink = null\n _width = 0\n _height = 0\n canvas.width = 0\n canvas.height = 0\n drawPoster()\n if (onMetadata)\n onMetadata()\n return\n }\n\n if (videoTrack.codec === null || !(await videoTrack.canDecode())) {\n videoSink = null\n _width = 0\n _height = 0\n canvas.width = 0\n canvas.height = 0\n clear()\n drawPoster()\n if (onMetadata)\n onMetadata()\n return\n }\n\n const transparent = await videoTrack.canBeTransparent()\n videoSink = new CanvasSink(videoTrack, {\n poolSize: 2,\n fit: 'contain',\n alpha: transparent,\n })\n\n _width = videoTrack.displayWidth\n _height = videoTrack.displayHeight\n\n canvas.width = _width\n canvas.height = _height\n\n if (onMetadata)\n onMetadata()\n\n await resetIterator(0)\n }\n\n async function resetIterator(time) {\n await stopIterator()\n\n if (!videoSink)\n return\n\n videoIterator = videoSink.canvases(time)\n\n const first = (await videoIterator.next()).value ?? null\n const second = (await videoIterator.next()).value ?? null\n\n nextFrame = second\n\n if (first) {\n ctx.drawImage(first.canvas, 0, 0)\n events.emit('loadeddata')\n }\n else {\n drawPoster()\n }\n }\n\n async function updateNextFrame(localId) {\n if (!videoIterator)\n return\n\n while (true) {\n const frame = (await videoIterator.next()).value ?? null\n if (!frame)\n return\n if (localId !== asyncId)\n return\n\n const t = audioClock.currentTime\n if (dropLateFrames) {\n const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate))\n if (frame.timestamp < t - tolerance) {\n continue\n }\n if (frame.timestamp <= t + tolerance) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(frame.canvas, 0, 0)\n }\n else {\n nextFrame = frame\n return\n }\n }\n else {\n if (frame.timestamp <= t) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(frame.canvas, 0, 0)\n }\n else {\n nextFrame = frame\n return\n }\n }\n }\n }\n\n function render() {\n if (!audioClock)\n return\n\n const t = audioClock.currentTime\n const now = Date.now()\n if (now - lastTimeUpdate >= timeupdateInterval) {\n events.emit('timeupdate')\n lastTimeUpdate = now\n }\n\n if (Number.isFinite(_duration) && t >= _duration) {\n stop()\n events.emit('ended')\n return\n }\n\n if (nextFrame && nextFrame.timestamp <= t) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(nextFrame.canvas, 0, 0)\n nextFrame = null\n updateNextFrame(asyncId)\n if (stalled) {\n events.emit('canplay')\n events.emit('playing')\n stalled = false\n }\n }\n else if (!nextFrame) {\n updateNextFrame(asyncId)\n if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) {\n stalled = true\n events.emit('waiting')\n }\n }\n\n rafId = requestAnimationFrame(render)\n }\n\n function start(audioEngine) {\n audioClock = audioEngine\n asyncId++\n stalled = false\n updateNextFrame(asyncId)\n rafId = requestAnimationFrame(render)\n }\n\n function stop() {\n cancelAnimationFrame(rafId)\n }\n\n async function seek(time) {\n asyncId++\n await resetIterator(time)\n }\n\n function setPlaybackRate(rate) {\n playbackRate = Math.max(0.1, Number(rate) || 1)\n }\n\n function destroy() {\n asyncId++\n stop()\n stopIterator()\n posterDrawn = false\n input = null\n videoSink = null\n }\n\n return {\n load,\n start,\n stop,\n seek,\n setPlaybackRate,\n destroy,\n\n get width() {\n return _width\n },\n get height() {\n return _height\n },\n get duration() {\n return _duration\n },\n }\n}\n","export default function clamp(v, min, max) {\n return Math.max(min, Math.min(max, Number(v) || 0))\n}\n","export function createVideoEventTarget() {\n const listeners = new Map()\n\n function addEventListener(type, fn) {\n if (!listeners.has(type))\n listeners.set(type, [])\n listeners.get(type).push(fn)\n }\n\n function removeEventListener(type, fn) {\n const list = listeners.get(type)\n if (!list)\n return\n const i = list.indexOf(fn)\n if (i >= 0)\n list.splice(i, 1)\n }\n\n function emit(type, detail) {\n const evt = new Event(type)\n evt.detail = detail\n const list = listeners.get(type)\n if (list)\n list.forEach(fn => fn(evt))\n }\n\n return { addEventListener, removeEventListener, emit }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file diff --git a/packages/artplayer-proxy-canvas/types/artplayer-proxy-canvas.d.ts b/packages/artplayer-proxy-canvas/types/artplayer-proxy-canvas.d.ts index f9ab95345..e408aadff 100644 --- a/packages/artplayer-proxy-canvas/types/artplayer-proxy-canvas.d.ts +++ b/packages/artplayer-proxy-canvas/types/artplayer-proxy-canvas.d.ts @@ -4,6 +4,6 @@ type Option = (ctx: CanvasRenderingContext2D, video: HTMLVideoElement) => void type Result = HTMLCanvasElement -declare const artplayerProxyCanvas: (option: Option) => (art: Artplayer) => Result +declare const artplayerProxyCanvas: (option?: Option) => (art: Artplayer) => Result export default artplayerProxyCanvas diff --git a/packages/artplayer-proxy-mediabunny/.npmignore b/packages/artplayer-proxy-mediabunny/.npmignore new file mode 100644 index 000000000..932395606 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/.npmignore @@ -0,0 +1,6 @@ +node_modules +.DS_Store +.parcel-cache +yarn.lock +package-lock.json +src \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/README.md b/packages/artplayer-proxy-mediabunny/README.md new file mode 100644 index 000000000..fcf1127fb --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/README.md @@ -0,0 +1,11 @@ +# artplayer-proxy-mediabunny + +mediabunny proxy for ArtPlayer + +## Demo + +[https://artplayer.org](https://artplayer.org/?libs=./uncompiled/artplayer-proxy-mediabunny/index.js&example=mediabunny) + +## License + +MIT © Harvey Zack diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js new file mode 100644 index 000000000..da2602984 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},m=d.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!m[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=m[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return m[r].exports;function u(e){var r=u.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=m,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"ln3T4","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],ln3T4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"aLQUP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aLQUP:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,m=!!i.muted,h=1;n.setVolume(u,m);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return h},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;h=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),m=!1,n.setVolume(u,m),s.emit("volumechange")},get muted(){return m},set muted(v){m=!!v,n.setVolume(u,m),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"hMkle","../utils/clamp.js":"i5ob4","./videoEvents.js":"5969H","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hMkle:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,m=0,h=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,h=null,m=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,m=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;h={code:4,message:e.message},m=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,h={code:4,message:e.message},m=3,a.emit("error")}else await p}async function k(){l&&(l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return m},get error(){return h},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"d0iOY","./videoEngine.js":"8o8Re","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d0iOY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,m=!0,h=.7,p=!1,f=1,g=0,k=new Set;function b(){return m?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:h;s.gain.value=e*e}function S(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function y(){for(let e of k)e.stop();k.clear()}async function x(){await o?.return(),o=null}async function I(r){if(a)for(await x(),o=a.buffers(b());;){let a;if(r!==g||m)return;let n=o.next(),u=setInterval(()=>{if(r!==g||m)return void clearInterval(u);"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||m)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:h,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=h,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,S=T+h.duration/f;S>d&&(d=S),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function w(){m||(c=b(),m=!0,x(),y())}return{load:async function e(e,i){let s=++g;await x(),y(),m=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,S(),i&&i();return}S(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){m&&(i||S(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,m=!1,I(++g))},pause:w,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,m||I(g)},destroy:function(){g++,w(),i?.close(),i=null,r=null,a=null},setVolume(e,r){h=e,p=r,T()},setPlaybackRate(e){e!==f&&(m||(c=b(),l=i.currentTime),f=e,m||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return m}}}},{mediabunny:"5c8Rl","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5c8Rl":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Output",()=>n.Output),s.export(a,"OutputFormat",()=>o.OutputFormat),s.export(a,"AdtsOutputFormat",()=>o.AdtsOutputFormat),s.export(a,"FlacOutputFormat",()=>o.FlacOutputFormat),s.export(a,"IsobmffOutputFormat",()=>o.IsobmffOutputFormat),s.export(a,"MkvOutputFormat",()=>o.MkvOutputFormat),s.export(a,"MovOutputFormat",()=>o.MovOutputFormat),s.export(a,"Mp3OutputFormat",()=>o.Mp3OutputFormat),s.export(a,"Mp4OutputFormat",()=>o.Mp4OutputFormat),s.export(a,"OggOutputFormat",()=>o.OggOutputFormat),s.export(a,"WavOutputFormat",()=>o.WavOutputFormat),s.export(a,"WebMOutputFormat",()=>o.WebMOutputFormat),s.export(a,"MediaSource",()=>l.MediaSource),s.export(a,"VideoSource",()=>l.VideoSource),s.export(a,"AudioSource",()=>l.AudioSource),s.export(a,"SubtitleSource",()=>l.SubtitleSource),s.export(a,"AudioBufferSource",()=>l.AudioBufferSource),s.export(a,"AudioSampleSource",()=>l.AudioSampleSource),s.export(a,"CanvasSource",()=>l.CanvasSource),s.export(a,"EncodedAudioPacketSource",()=>l.EncodedAudioPacketSource),s.export(a,"EncodedVideoPacketSource",()=>l.EncodedVideoPacketSource),s.export(a,"MediaStreamAudioTrackSource",()=>l.MediaStreamAudioTrackSource),s.export(a,"MediaStreamVideoTrackSource",()=>l.MediaStreamVideoTrackSource),s.export(a,"TextSubtitleSource",()=>l.TextSubtitleSource),s.export(a,"VideoSampleSource",()=>l.VideoSampleSource),s.export(a,"VIDEO_CODECS",()=>c.VIDEO_CODECS),s.export(a,"AUDIO_CODECS",()=>c.AUDIO_CODECS),s.export(a,"PCM_AUDIO_CODECS",()=>c.PCM_AUDIO_CODECS),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c.NON_PCM_AUDIO_CODECS),s.export(a,"SUBTITLE_CODECS",()=>c.SUBTITLE_CODECS),s.export(a,"canEncode",()=>d.canEncode),s.export(a,"canEncodeVideo",()=>d.canEncodeVideo),s.export(a,"canEncodeAudio",()=>d.canEncodeAudio),s.export(a,"canEncodeSubtitles",()=>d.canEncodeSubtitles),s.export(a,"getEncodableCodecs",()=>d.getEncodableCodecs),s.export(a,"getEncodableVideoCodecs",()=>d.getEncodableVideoCodecs),s.export(a,"getEncodableAudioCodecs",()=>d.getEncodableAudioCodecs),s.export(a,"getEncodableSubtitleCodecs",()=>d.getEncodableSubtitleCodecs),s.export(a,"getFirstEncodableVideoCodec",()=>d.getFirstEncodableVideoCodec),s.export(a,"getFirstEncodableAudioCodec",()=>d.getFirstEncodableAudioCodec),s.export(a,"getFirstEncodableSubtitleCodec",()=>d.getFirstEncodableSubtitleCodec),s.export(a,"Quality",()=>d.Quality),s.export(a,"QUALITY_VERY_LOW",()=>d.QUALITY_VERY_LOW),s.export(a,"QUALITY_LOW",()=>d.QUALITY_LOW),s.export(a,"QUALITY_MEDIUM",()=>d.QUALITY_MEDIUM),s.export(a,"QUALITY_HIGH",()=>d.QUALITY_HIGH),s.export(a,"QUALITY_VERY_HIGH",()=>d.QUALITY_VERY_HIGH),s.export(a,"Target",()=>u.Target),s.export(a,"BufferTarget",()=>u.BufferTarget),s.export(a,"FilePathTarget",()=>u.FilePathTarget),s.export(a,"NullTarget",()=>u.NullTarget),s.export(a,"StreamTarget",()=>u.StreamTarget),s.export(a,"ALL_TRACK_TYPES",()=>n.ALL_TRACK_TYPES),s.export(a,"Source",()=>m.Source),s.export(a,"BlobSource",()=>m.BlobSource),s.export(a,"BufferSource",()=>m.BufferSource),s.export(a,"FilePathSource",()=>m.FilePathSource),s.export(a,"StreamSource",()=>m.StreamSource),s.export(a,"ReadableStreamSource",()=>m.ReadableStreamSource),s.export(a,"UrlSource",()=>m.UrlSource),s.export(a,"InputFormat",()=>h.InputFormat),s.export(a,"AdtsInputFormat",()=>h.AdtsInputFormat),s.export(a,"IsobmffInputFormat",()=>h.IsobmffInputFormat),s.export(a,"MatroskaInputFormat",()=>h.MatroskaInputFormat),s.export(a,"Mp3InputFormat",()=>h.Mp3InputFormat),s.export(a,"Mp4InputFormat",()=>h.Mp4InputFormat),s.export(a,"OggInputFormat",()=>h.OggInputFormat),s.export(a,"QuickTimeInputFormat",()=>h.QuickTimeInputFormat),s.export(a,"WaveInputFormat",()=>h.WaveInputFormat),s.export(a,"WebMInputFormat",()=>h.WebMInputFormat),s.export(a,"FlacInputFormat",()=>h.FlacInputFormat),s.export(a,"ALL_FORMATS",()=>h.ALL_FORMATS),s.export(a,"ADTS",()=>h.ADTS),s.export(a,"MATROSKA",()=>h.MATROSKA),s.export(a,"MP3",()=>h.MP3),s.export(a,"MP4",()=>h.MP4),s.export(a,"OGG",()=>h.OGG),s.export(a,"QTFF",()=>h.QTFF),s.export(a,"WAVE",()=>h.WAVE),s.export(a,"WEBM",()=>h.WEBM),s.export(a,"FLAC",()=>h.FLAC),s.export(a,"Input",()=>p.Input),s.export(a,"InputDisposedError",()=>p.InputDisposedError),s.export(a,"InputTrack",()=>f.InputTrack),s.export(a,"InputVideoTrack",()=>f.InputVideoTrack),s.export(a,"InputAudioTrack",()=>f.InputAudioTrack),s.export(a,"EncodedPacket",()=>g.EncodedPacket),s.export(a,"AudioSample",()=>k.AudioSample),s.export(a,"VideoSample",()=>k.VideoSample),s.export(a,"AudioBufferSink",()=>b.AudioBufferSink),s.export(a,"AudioSampleSink",()=>b.AudioSampleSink),s.export(a,"BaseMediaSampleSink",()=>b.BaseMediaSampleSink),s.export(a,"CanvasSink",()=>b.CanvasSink),s.export(a,"EncodedPacketSink",()=>b.EncodedPacketSink),s.export(a,"VideoSampleSink",()=>b.VideoSampleSink),s.export(a,"Conversion",()=>T.Conversion),s.export(a,"CustomVideoDecoder",()=>S.CustomVideoDecoder),s.export(a,"CustomVideoEncoder",()=>S.CustomVideoEncoder),s.export(a,"CustomAudioDecoder",()=>S.CustomAudioDecoder),s.export(a,"CustomAudioEncoder",()=>S.CustomAudioEncoder),s.export(a,"registerDecoder",()=>S.registerDecoder),s.export(a,"registerEncoder",()=>S.registerEncoder),s.export(a,"RichImageData",()=>y.RichImageData),s.export(a,"AttachedFile",()=>y.AttachedFile);var n=e("./output.js"),o=e("./output-format.js"),l=e("./media-source.js"),c=e("./codec.js"),d=e("./encode.js"),u=e("./target.js"),m=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),f=e("./input-track.js"),g=e("./packet.js"),k=e("./sample.js"),b=e("./media-sink.js"),T=e("./conversion.js"),S=e("./custom-coder.js"),y=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"d2urb","./input-format.js":"eC3Vq","./input.js":"cI9DB","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"h5xyX","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8wd8o":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>S),s.export(a,"extractVideoCodecString",()=>y),s.export(a,"buildAudioCodecString",()=>x),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>w),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>C),s.export(a,"buildAacAudioSpecificConfig",()=>P),s.export(a,"OPUS_SAMPLE_RATE",()=>A),s.export(a,"parsePcmCodec",()=>_),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>F),s.export(a,"getAudioEncoderConfigExtension",()=>M),s.export(a,"validateVideoChunkMetadata",()=>j),s.export(a,"validateAudioChunkMetadata",()=>z),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],m=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],h=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=m.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(m),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=h.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(h);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split("."),a=Number(r[1]),i=Number(r[2]);return[1,1,a,2,1,i,3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},S=e=>{let r=e.split("."),a=Number(r[1]),i=r[2],s=Number(i.slice(0,-1)),n=+("H"===i.slice(-1)),o=Number(r[3]),l=r[4]?Number(r[4]):0,c=r[5]?Number(r[5][0]):1;return[129,(a<<5)+s,(n<<7)+((8!==o)<<6)+0+(l<<4)+(c<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},y=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),m=`vp09.${r}.${a}.${i}.${s}`;return(m+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(m=m.slice(0,-g.length)),m}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,m=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,h=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},x=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=C(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},w=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],C=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},P=e=>{let r=w.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},A=48e3,B=/^pcm-([usf])(\d+)+(be)?$/,_=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=B.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(B.test(e))return e;return"webvtt"===e?"webvtt":null},F=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},M=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,O=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,N=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,j=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!O.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},V=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],z=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!V.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dpOkn:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>m),s.export(a,"writeBits",()=>h),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>S),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>y),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>x),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>w),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>C),s.export(a,"isAllowSharedBufferSource",()=>P),s.export(a,"AsyncMutex",()=>A),s.export(a,"bytesToHexString",()=>B),s.export(a,"reverseBitsU32",()=>_),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>F),s.export(a,"insertSorted",()=>M),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>O),s.export(a,"toAsyncIterator",()=>N),s.export(a,"validateAnyIterable",()=>j),s.export(a,"assertNever",()=>V),s.export(a,"getUint24",()=>z),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>W),s.export(a,"setInt24",()=>q),s.export(a,"setInt64",()=>G),s.export(a,"mapAsyncGenerator",()=>K),s.export(a,"clamp",()=>Q),s.export(a,"UNDETERMINED_LANGUAGE",()=>$),s.export(a,"roundIfAlmostInteger",()=>X),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>em),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>eS),s.export(a,"uint8ArraysAreEqual",()=>ey),s.export(a,"polyfillSymbolDispose",()=>ex),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},h=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),S={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},y=T(S),x={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(x),w={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(w),C=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,P=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class A{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let B=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),_=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},M=(e,r,a)=>{let i=F(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},O=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},N=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},j=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},V=e=>{throw Error(`Unexpected value: ${e}`)},z=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>z(e,r,a)<<8>>8,W=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},q=(e,r,a,i)=>{(a=Q(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),W(e,r,a,i)},G=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},K=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),Q=(e,r,a)=>Math.max(r,Math.min(a,e)),$="und",X=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,em=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),eh=null,ep=()=>{if(null!==eh)return eh;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eh=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],d2urb:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Source",()=>d),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>m),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class m extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??h,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),m=0,h=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),h=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ad),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"eC3Vq","./misc.js":"dpOkn","./reader.js":"3hF2Q","./source.js":"d2urb","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eC3Vq:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>S),s.export(a,"Mp4InputFormat",()=>y),s.export(a,"QuickTimeInputFormat",()=>x),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>w),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>C),s.export(a,"OggInputFormat",()=>P),s.export(a,"FlacInputFormat",()=>A),s.export(a,"AdtsInputFormat",()=>B),s.export(a,"MP4",()=>_),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>F),s.export(a,"WEBM",()=>M),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>O),s.export(a,"FLAC",()=>N),s.export(a,"ALL_FORMATS",()=>j);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),m=e("./mp3/mp3-reader.js"),h=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class S extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class y extends S{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class x extends S{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class w extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,m.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,m.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,h.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class A extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class B extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let _=new y,D=new x,F=new I,M=new w,R=new E,U=new C,L=new P,O=new B,N=new A,j=[_,D,F,M,U,L,N,R,O]},{"./isobmff/isobmff-demuxer.js":"c6bfa","./matroska/ebml.js":"B0jDs","./matroska/matroska-demuxer.js":"fOHz2","./mp3/mp3-demuxer.js":"i9O6t","../shared/mp3-misc.js":"25tyg","./id3.js":"69HAt","./mp3/mp3-reader.js":"8Pxtf","./ogg/ogg-demuxer.js":"5cgt7","./wave/wave-demuxer.js":"lUIAt","./adts/adts-reader.js":"5Z778","./adts/adts-demuxer.js":"2HibR","./reader.js":"3hF2Q","./flac/flac-demuxer.js":"h7VU7","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c6bfa:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),m=e("./isobmff-misc.js"),h=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,m.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,h.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-h.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,h.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),m=r.sampleTimingEntries[u],h=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[h],f=m.startDecodeTimestamp+(l-m.startIndex)*m.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)w(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&w(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,h.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,h.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,h.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let m=null;4&i&&(m=(0,p.readU32Be)(e));let h=u;if(0===c){this.currentFragment.implicitBaseDataOffset=h;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=S(i,a),n=await this.fetchPacketForSampleIndex(s,r);return C(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=x(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let m=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==m?this.internalTrack.fragmentLookupTable[m]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,h.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let S=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},y=(e,r)=>{if(!e.keySampleIndices)return S(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=S(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},x=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let m=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),h=e.chunkOffsets[m],p=u.startSampleIndex+(m-u.startChunkIndex)*u.samplesPerChunk,f=0,g=h;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},w=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},C=e=>0===e.sampleSizes.length},{"../codec.js":"8wd8o","../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","./isobmff-misc.js":"8o5uh","./isobmff-reader.js":"8Phe1","../reader.js":"3hF2Q","../metadata.js":"fFgR1","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4Hepu":[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>S),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>y),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>x),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>w),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>C),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>O),u.export(a,"parseOpusIdentificationHeader",()=>N),u.export(a,"parseOpusTocByte",()=>V),u.export(a,"parseModesFromVorbisSetupPacket",()=>z),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>W),u.export(a,"createVorbisComments",()=>q);var m=e("./codec.js"),h=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,h.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,h.assertNever)(r),(0,h.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,h.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],S=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,h.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},y=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,h.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,h.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,h.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,h.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,h.readExpGolomb)(r),c=(0,h.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,h.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,C=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,h.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:m,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:S}=P(l,d);(0,h.readExpGolomb)(l);let y=(0,h.readExpGolomb)(l);3===y&&l.skipBits(1),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&((0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l));let x=(0,h.readExpGolomb)(l),I=(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l);let w=l.readBits(1)?0:d;for(let e=w;e<=d;e++)(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&A(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.skipBits(1));let C=(0,h.readExpGolomb)(l);if(B(l,C),l.readBits(1)){let e=(0,h.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,h.Bitstream)(g(e));r.skipBits(16),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);F=a||i?a&&!i?2:!a&&i?3:0:0}let M=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:m,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:S,minSpatialSegmentationIdc:_,parallelismType:F,chromaFormatIdc:y,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:M}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},P=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,h.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,h.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,h.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,h.readExpGolomb)(e),a=(0,h.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,h.readExpGolomb)(e),e.readBits(1)&&F(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,h.readExpGolomb)(e);return(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),r}return 0},F=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,h.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,h.readExpGolomb)(e)+1),i&&M(e,l,n),s&&M(e,l,n)}},M=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,h.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=r.readBits(16),d=(c+1)*(r.readBits(16)+1),u=(0,h.last)(m.VP9_LEVEL_TABLE).level;for(let e of m.VP9_LEVEL_TABLE)if(d<=e.maxPictureSize){u=e.level;break}return{profile:i,level:u,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,h.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,h.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},O=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,h.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let m=d+1;e.skipBits(m);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},N=e=>{let r=(0,h.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},j=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],V=e=>({durationInSamples:j[e[0]>>3]}),z=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,h.isChromium)()||(0,h.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,h.Bitstream)(e);r.pos=8*a;let s=(0,h.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,h.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,h.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,h.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,h.assertNever)(e),(0,h.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let W=(e,r)=>{let a=(0,h.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=h.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,h.base64ToBytes)(c),a=(0,h.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=h.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},q=(e,r,a)=>{let i=[e],s=h.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=h.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,h.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),m=0;for(let e of i)u.set(e,m),m+=e.length;return u}},{"./codec.js":"8wd8o","./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6cHW1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8ofmg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>m),s.export(a,"InputAudioTrack",()=>h);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof m}isAudioTrack(){return this instanceof h}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./media-sink.js":"h5xyX","./misc.js":"dpOkn","./packet.js":"i61Hy","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3RBiS":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>m),s.export(a,"customAudioEncoders",()=>h),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],m=[],h=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(m.includes(e))return void console.warn("Video encoder already registered.");m.push(e)}else if(e.prototype instanceof c){if(h.includes(e))return void console.warn("Audio encoder already registered.");h.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h5xyX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>S),s.export(a,"VideoSampleSink",()=>w),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>A),s.export(a,"AudioBufferSink",()=>B);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),m=e("./packet.js"),h=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof m.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof m.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!h&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class S{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),m=!1,h=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{if(d(),l.timestamp>=r&&(h=!0),h)return void l.close();s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)())},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),S=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let x=b.packets(T??void 0,c);for(await x.next();S&&!h&&!this._track.input._disposed;){let e=y(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(S);let r=await x.next();if(r.done)break;S=r.value}await x.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),m=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(m)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,h=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,h=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),m)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{h||(r.stack=e.stack,h=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!m;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(m)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},S=async()=>{await s.flush();for(let e=0;e{h||(h=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(h)throw k(),h;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let y=e=>0===e?40:8;class x extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;let c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{let e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){let e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){let r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");let e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class w extends S{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new x(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");let a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s],c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new w(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class C extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;let s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class P extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;let{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,h.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,h.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class A extends S{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new P(e,r,i):new C(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class B{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new A(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"8wd8o","./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./input.js":"cI9DB","./input-track.js":"8ofmg","./misc.js":"dpOkn","./packet.js":"i61Hy","./pcm.js":"bPgId","./sample.js":"9Wy36","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i61Hy:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"PLACEHOLDER_DATA",()=>o),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bPgId:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>m),s.export(a,"validateCropRectangle",()=>h),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");let s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,m=this.displayWidth,h=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,m=i,h=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=m,k=h)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(m)||m<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(h)||h<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:m,sHeight:h}=this._rotateSourceRegion(d,u,m,h,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,S=f+k/2;e.translate(T,S),e.rotate(this.rotation*Math.PI/180);let y=this.rotation%180==0?1:g/k;e.scale(1/y,y),e.drawImage(b,d,u,m,h,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&h(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&m(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],m="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*m,n=c*m,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,m=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},h=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,S(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");let a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");let i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let m=void 0!==s?s:c-u;if(m>c-u)throw RangeError("frameCount out of range");let h=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let y=f?m:m*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},S=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o5uh":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8Phe1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>m),s.export(a,"readFixed_2_30",()=>h),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},m=e=>(0,l.readI32Be)(e)/65536,h=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"fFgR1","../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fFgR1:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3hF2Q":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>m),s.export(a,"readU16",()=>h),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>S),s.export(a,"readI32Le",()=>y),s.export(a,"readU64",()=>x),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>w),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>C),s.export(a,"readF64Be",()=>P),s.export(a,"readAscii",()=>A);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},m=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),h=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),w=e=>0x100000000*S(e)+b(e),E=e=>{let r=T(e);return 0x100000000*y(e)+r},C=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},P=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=(e,r)=>{d(e,r);let a="";for(let i=0;id),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>m),o.export(a,"EBMLUnicodeString",()=>h),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>S),o.export(a,"EBMLWriter",()=>y),o.export(a,"MAX_VAR_INT_SIZE",()=>x),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>w),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>C),o.export(a,"readUnsignedInt",()=>P),o.export(a,"readUnsignedBigInt",()=>A),o.export(a,"readSignedInt",()=>B),o.export(a,"readElementId",()=>_),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>F),o.export(a,"readAsciiString",()=>M),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>O),o.export(a,"CODEC_STRING_MAP",()=>N),o.export(a,"assertDefinedSize",()=>j);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},S=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class y{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=S(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof m){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof h){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let x=8,I=2,w=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},C=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=P(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},_=e=>{let r=E(e);return null===r?null:P(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=C(e))&&(r=null)),r},F=e=>{let r=_(e);return null===r?null:{id:r,size:D(e)}},M=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},O=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var m=e("../codec-data.js"),h=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),S=e("./matroska-misc.js"),y=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let x=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,S.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=x[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=x.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=h.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new C(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,y.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,y.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=(0,y.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,y.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,y.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,y.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,y.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class w{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let m=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),h=-1!==m?this.internalTrack.cuePoints[m]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(h?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,m=(0,T.readElementHeader)(e);if(!m||!T.LEVEL_1_EBML_IDS.includes(m.id)&&m.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let h=m.id,p=m.size,f=e.filePos;if(h===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(h!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(h&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,h.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,m.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,m.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,m.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,m.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class C extends w{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,h.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"4Hepu","../codec.js":"8wd8o","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","./ebml.js":"B0jDs","./matroska-misc.js":"axlni","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],axlni:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9O6t:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),m=e("../id3.js"),h=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,m.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,h.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,m.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,m.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,m.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=m.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-m.ID3_V1_TAG_SIZE,m.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,m.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>m),s.export(a,"readFrameHeader",()=>h),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,h=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,m=0;16&s?d=8&s?0:1:(d=1,m=1);let h=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+m,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"69HAt":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>h),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>S),c.export(a,"Id3V2Writer",()=>y);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),m=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let h=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,m.readBytes)(e,h-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,m.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,m.readU8)(e);d{let a=(0,m.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,m.readAscii)(e,3),i=(0,m.readU8)(e),s=(0,m.readU8)(e),n=(0,m.readU8)(e),o=(0,m.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,m.readBytes)(e,r.size),s=new S(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class S{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class y{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let m=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&m),1<<(m>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,m.EncodedPacket)(a.metadataOnly?m.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let S=null,y=g,x=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,S=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){S=e+1;break}if(null===S)throw Error("Invalid page with granule position: no packets end on this page.");x=S-1;let e={data:m.PLACEHOLDER_DATA,endPage:y,endSegmentIndex:x};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,S);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,S=r.segmentIndex)}else for(;;){let e=T(k,g,S);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,S=r.segmentIndex,e.page.headerStartPos!==y.headerStartPos){y=e.page,x=e.segmentIndex;break}}}let I=null,w=null;for(;null!==g;){(0,u.assert)(null!==S);let e=await this.demuxer.readPacket(g,S);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&Ss||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,S=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>m);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},m=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"4Hepu","../misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9qmX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>m);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:m+h,dataStartPos:r+m,dataSize:h,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},m=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"3hF2Q","./ogg-misc.js":"7ByLQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lUIAt:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,h.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,h.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,h.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,h.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,h.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,h.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,h.readAscii)(i,4),r=(0,h.readU32)(i,a),s=(0,h.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=m.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,h.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,m.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../id3.js":"69HAt","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5Z778":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let m=i.readBits(2)+1;if(1!==m)throw Error("ADTS frames with more than one AAC frame are not supported.");let h=null;return 1===s?e.filePos-=2:h=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:m,crcCheck:h,startPos:r}}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2HibR":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,h.MIN_FRAME_HEADER_SIZE,h.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?h.MAX_FRAME_HEADER_SIZE:h.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,h.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,h.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,h.readCodedNumber)(e),d=(0,h.readBlockSize)(e,n),m=(0,h.readSampleRate)(e,o);if(null===m||m!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,h.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:m}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../metadata.js":"fFgR1","./flac-misc.js":"aXiDm","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aXiDm:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>m),s.export(a,"calculateCrc8",()=>h);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),m=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,h=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o8Re":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,m=null,h=null,p=0,f=0,g=0,k=0,b=NaN,T=null,S=0,y=!1,x=1,I=!1;async function w(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function C(){await m?.return(),m=null}function P(){r.clearRect(0,0,e.width,e.height)}async function A(e){if(await C(),!u)return;m=u.canvases(e);let i=(await m.next()).value??null;h=(await m.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function B(a){if(m)for(;;){let i=(await m.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,x));if(i.timestamp=i&&(a.emit("timeupdate"),S=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}h&&h.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(h.canvas,0,0),h=null,B(f),y&&(a.emit("canplay"),a.emit("playing"),y=!1)):!h&&(B(f),!h&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5969H":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}]},["1qMFK"],"1qMFK","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js new file mode 100644 index 000000000..27bf5d10e --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,n,a,i,s,o,c){var u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},l="function"==typeof u[a]&&u[a],d=l.i||{},f=l.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,n){if(!f[r]){if(!e[r]){if(i[r])return i[r];var s="function"==typeof u[a]&&u[a];if(!n&&s)return s(r,!0);if(l)return l(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}d.resolve=function(n){var a=e[r][1][n];return null!=a?a:n},d.cache={};var c=f[r]=new p.Module(r);e[r][0].call(c.exports,d,c,c.exports,u)}return f[r].exports;function d(e){var r=d.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=f,p.parent=l,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=d,p.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]},Object.defineProperty(p,"root",{get:function(){return u[a]}}),u[a]=p;for(var m=0;m0&&void 0!==arguments[0]?arguments[0]:{};return function(r){return(0,o.default)(r,e)}}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=c)},{"./proxy/canvasProxy.js":"hTxiw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hTxiw:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"default",function(){return u});var s=e("@swc/helpers/cjs/_to_consumable_array.cjs"),o=e("../shim/mediabunnyVideoShim.js"),c=i.interopDefault(o);function u(e,r){var n,a=function(e){e in o||Object.defineProperty(o,e,{get:function(){var r=l[e];return"function"==typeof r?r.bind(l):r},set:function(r){l[e]=r},configurable:!0,enumerable:!0})},i=function(e){o[e]=function(){for(var r=arguments.length,a=Array(r),i=0;ie.length)&&(r=e.length);for(var n=0,a=Array(r);n0?new Promise(function(e,r){a=setTimeout(function(){return r(Error("Load timeout"))},n)}):null,c=(0,s._)(function(){var n,i,s,c;return(0,o._)(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,3,4]),n=!1,i=!1,s=function(){n&&i&&(S=1,p.emit("loadedmetadata"),p.emit("durationchange"))},[4,Promise.all([k.load(e,function(){r===I&&(n=!0,s())}),b.load(e,function(){r===I&&(i=!0,s())})])];case 1:if(o.sent(),r!==I)return[2];return S=4,w=1,p.emit("loadeddata"),p.emit("canplay"),p.emit("canplaythrough"),[3,4];case 2:if(c=o.sent(),r!==I)return[2];return T={code:4,message:c.message},w=3,p.emit("error"),console.error(c),[3,4];case 3:return a&&clearTimeout(a),[7];case 4:return[2]}})})(),!i)return[3,5];l.label=1;case 1:return l.trys.push([1,3,,4]),[4,Promise.race([c,i])];case 2:return l.sent(),[3,4];case 3:if(u=l.sent(),r!==I)return[2];return I++,T={code:4,message:u.message},w=3,p.emit("error"),[3,4];case 4:return[3,7];case 5:return[4,c];case 6:l.sent(),l.label=7;case 7:return[2]}})})()},play:E,pause:j,seek:function(e){return(0,s._)(function(){var r;return(0,o._)(this,function(n){switch(n.label){case 0:return r=!_,x=!0,p.emit("seeking"),p.emit("waiting"),j(),[4,b.seek(e)];case 1:return n.sent(),[4,k.seek(e)];case 2:if(n.sent(),x=!1,p.emit("seeked"),!(r&&!y))return[3,4];return[4,E()];case 3:n.sent(),n.label=4;case 4:return[2]}})})()},destroy:function(){j(),b.destroy(),k.destroy()},setVolume:b.setVolume,setPlaybackRate:function(e){b.setPlaybackRate(e),k.setPlaybackRate(e)},get currentTime(){return b.currentTime},get duration(){return b.duration||k.duration},get paused(){return _},get seeking(){return x},get ended(){return y},get readyState(){return S},get networkState(){return w},get error(){return T},get videoWidth(){return k.width},get videoHeight(){return k.height}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./audioEngine.js":"avNjw","./videoEngine.js":"iWP57","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cZn0e:[function(e,r,n,a){"use strict";function i(e,r,n,a,i,s,o){try{var c=e[s](o),u=c.value}catch(e){n(e);return}c.done?r(u):Promise.resolve(u).then(a,i)}n._=function(e){return function(){var r=this,n=arguments;return new Promise(function(a,s){var o=e.apply(r,n);function c(e){i(o,a,s,c,u,"next",e)}function u(e){i(o,a,s,c,u,"throw",e)}c(void 0)})}}},{}],eltGh:[function(e,r,n,a){"use strict";n._=e("eb260df52bffddd").__generator},{eb260df52bffddd:"6yrAu"}],"6yrAu":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"__extends",function(){return c}),i.export(n,"__assign",function(){return u}),i.export(n,"__rest",function(){return l}),i.export(n,"__decorate",function(){return d}),i.export(n,"__param",function(){return f}),i.export(n,"__esDecorate",function(){return h}),i.export(n,"__runInitializers",function(){return p}),i.export(n,"__propKey",function(){return m}),i.export(n,"__setFunctionName",function(){return g}),i.export(n,"__metadata",function(){return b}),i.export(n,"__awaiter",function(){return k}),i.export(n,"__generator",function(){return _}),i.export(n,"__createBinding",function(){return y}),i.export(n,"__exportStar",function(){return S}),i.export(n,"__values",function(){return w}),i.export(n,"__read",function(){return T}),i.export(n,"__spread",function(){return x}),i.export(n,"__spreadArrays",function(){return I}),i.export(n,"__spreadArray",function(){return E}),i.export(n,"__await",function(){return j}),i.export(n,"__asyncGenerator",function(){return P}),i.export(n,"__asyncDelegator",function(){return C}),i.export(n,"__asyncValues",function(){return A}),i.export(n,"__makeTemplateObject",function(){return B}),i.export(n,"__importStar",function(){return F}),i.export(n,"__importDefault",function(){return R}),i.export(n,"__classPrivateFieldGet",function(){return U}),i.export(n,"__classPrivateFieldSet",function(){return O}),i.export(n,"__classPrivateFieldIn",function(){return L}),i.export(n,"__addDisposableResource",function(){return N}),i.export(n,"__disposeResources",function(){return z}),i.export(n,"__rewriteRelativeImportExtension",function(){return H});var s=e("@swc/helpers/cjs/_type_of.cjs"),o=function(e,r){return(o=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])})(e,r)};function c(e,r){if("function"!=typeof r&&null!==r)throw TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}o(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var u=function(){return(u=Object.assign||function(e){for(var r,n=1,a=arguments.length;nr.indexOf(a)&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,a=Object.getOwnPropertySymbols(e);ir.indexOf(a[i])&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(n[a[i]]=e[a[i]]);return n}function d(e,r,n,a){var i,o=arguments.length,c=o<3?r:null===a?a=Object.getOwnPropertyDescriptor(r,n):a;if(("undefined"==typeof Reflect?"undefined":(0,s._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,r,n,a);else for(var u=e.length-1;u>=0;u--)(i=e[u])&&(c=(o<3?i(c):o>3?i(r,n,c):i(r,n))||c);return o>3&&c&&Object.defineProperty(r,n,c),c}function f(e,r){return function(n,a){r(n,a,e)}}function h(e,r,n,a,i,o){function c(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var u,l=a.kind,d="getter"===l?"get":"setter"===l?"set":"value",f=!r&&e?a.static?e:e.prototype:null,h=r||(f?Object.getOwnPropertyDescriptor(f,a.name):{}),p=!1,m=n.length-1;m>=0;m--){var g={};for(var b in a)g[b]="access"===b?{}:a[b];for(var b in a.access)g.access[b]=a.access[b];g.addInitializer=function(e){if(p)throw TypeError("Cannot add initializers after decoration has completed");o.push(c(e||null))};var k=(0,n[m])("accessor"===l?{get:h.get,set:h.set}:h[d],g);if("accessor"===l){if(void 0===k)continue;if(null===k||(void 0===k?"undefined":(0,s._)(k))!=="object")throw TypeError("Object expected");(u=c(k.get))&&(h.get=u),(u=c(k.set))&&(h.set=u),(u=c(k.init))&&i.unshift(u)}else(u=c(k))&&("field"===l?i.unshift(u):h[d]=u)}f&&Object.defineProperty(f,a.name,h),p=!0}function p(e,r,n){for(var a=arguments.length>2,i=0;i0&&i[i.length-1])&&(6===l[0]||2===l[0])){s=0;continue}if(3===l[0]&&(!i||l[1]>i[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")}function T(e,r){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var a,i,s=n.call(e),o=[];try{for(;(void 0===r||r-- >0)&&!(a=s.next()).done;)o.push(a.value)}catch(e){i={error:e}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(i)throw i.error}}return o}function x(){for(var e=[],r=0;r1||c(e,r)})},r&&(a[e]=r(a[e])))}function c(e,r){try{var n;(n=i[e](r)).value instanceof j?Promise.resolve(n.value.v).then(u,l):d(s[0][2],n)}catch(e){d(s[0][3],e)}}function u(e){c("next",e)}function l(e){c("throw",e)}function d(e,r){e(r),s.shift(),s.length&&c(s[0][0],s[0][1])}}function C(e){var r,n;return r={},a("next"),a("throw",function(e){throw e}),a("return"),r[Symbol.iterator]=function(){return this},r;function a(a,i){r[a]=e[a]?function(r){return(n=!n)?{value:j(e[a](r)),done:!1}:i?i(r):r}:i}}function A(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var r,n=e[Symbol.asyncIterator];return n?n.call(e):(e=w(e),r={},a("next"),a("throw"),a("return"),r[Symbol.asyncIterator]=function(){return this},r);function a(n){r[n]=e[n]&&function(r){return new Promise(function(a,i){var s,o,c;s=a,o=i,c=(r=e[n](r)).done,Promise.resolve(r.value).then(function(e){s({value:e,done:c})},o)})}}}function B(e,r){return Object.defineProperty?Object.defineProperty(e,"raw",{value:r}):e.raw=r,e}var M=Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r},D=function(e){return(D=Object.getOwnPropertyNames||function(e){var r=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[r.length]=n);return r})(e)};function F(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n=D(e),a=0;a=p-.2&&(a.suspend(),e.emit("waiting"))},50),o=void 0,c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,n];case 2:return o=c.sent(),[3,5];case 3:return console.error(c.sent()),[2,"break"];case 4:return clearInterval(s),[7];case 5:if(r!==y||g)return[2,{v:void 0}];if("suspended"!==a.state)return[3,7];return[4,a.resume()];case 6:c.sent(),e.emit("canplay"),e.emit("playing"),c.label=7;case 7:if(o.done)return[2,"break"];return l=(u=o.value).buffer,m=u.timestamp,(b=a.createBufferSource()).buffer=l,b.connect(i),b.playbackRate.value=_,(w=(k=f+(m-h)/_)+l.duration/_)>p&&(p=w),k>=a.currentTime?b.start(k):b.start(a.currentTime,(a.currentTime-k)*_),S.add(b),b.onended=function(){return S.delete(b)},[2]}})},!n)return[2];return[4,E()];case 1:m.sent(),d=n.buffers(w()),m.label=2;case 2:return[5,(0,u._)(s())];case 3:if(l=m.sent(),"object"===(0,o._)(l))return[2,l.v];if("break"===l)return[3,4];return[3,2];case 4:return[2]}})})()}function P(){g||(h=w(),g=!0,E(),I())}return{load:function(e,a){return(0,s._)(function(){var i,s,o,u;return(0,c._)(this,function(c){switch(c.label){case 0:return i=++y,[4,E()];case 1:if(c.sent(),I(),g=!0,h=0,f=0,!(s="string"==typeof e?new(0,l.UrlSource)(e):e instanceof Blob?new(0,l.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,l.ReadableStreamSource)(e):e))return[2];return[4,(r=new(0,l.Input)({source:s,formats:l.ALL_FORMATS})).computeDuration()];case 2:if(m=c.sent(),i!==y)return[2];return[4,r.getPrimaryAudioTrack()];case 3:if(!(o=c.sent()))return n=null,x(),a&&a(),[2];if(u=null===o.codec)return[3,5];return[4,o.canDecode()];case 4:u=!c.sent(),c.label=5;case 5:if(u)return n=null,x(),a&&a(),[2];return x(o.sampleRate),n=new(0,l.AudioBufferSink)(o),a&&a(),[2]}})})()},play:function(){return(0,s._)(function(){return(0,c._)(this,function(e){switch(e.label){case 0:if(!g)return[2];if(a||x(),"suspended"!==a.state)return[3,2];return[4,a.resume()];case 1:e.sent(),e.label=2;case 2:return p=f=a.currentTime,g=!1,j(++y),[2]}})})()},pause:P,seek:function(e){return(0,s._)(function(){return(0,c._)(this,function(r){return h=Math.max(0,e),p=f=a.currentTime,y++,g||j(y),[2]})})()},destroy:function(){y++,P(),null==a||a.close(),a=null,r=null,n=null},setVolume:function(e,r){b=e,k=r,T()},setPlaybackRate:function(e){e!==_&&(g||(h=w(),f=a.currentTime),_=e,g||j(++y))},get currentTime(){return w()},get duration(){return m},get paused(){return g}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","@swc/helpers/cjs/_ts_values.cjs":"94P5Q",mediabunny:"b8Ej9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"94P5Q":[function(e,r,n,a){"use strict";n._=e("2ed00358a4809745").__values},{"2ed00358a4809745":"6yrAu"}],b8Ej9:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Output",function(){return s.Output}),i.export(n,"OutputFormat",function(){return o.OutputFormat}),i.export(n,"AdtsOutputFormat",function(){return o.AdtsOutputFormat}),i.export(n,"FlacOutputFormat",function(){return o.FlacOutputFormat}),i.export(n,"IsobmffOutputFormat",function(){return o.IsobmffOutputFormat}),i.export(n,"MkvOutputFormat",function(){return o.MkvOutputFormat}),i.export(n,"MovOutputFormat",function(){return o.MovOutputFormat}),i.export(n,"Mp3OutputFormat",function(){return o.Mp3OutputFormat}),i.export(n,"Mp4OutputFormat",function(){return o.Mp4OutputFormat}),i.export(n,"OggOutputFormat",function(){return o.OggOutputFormat}),i.export(n,"WavOutputFormat",function(){return o.WavOutputFormat}),i.export(n,"WebMOutputFormat",function(){return o.WebMOutputFormat}),i.export(n,"MediaSource",function(){return c.MediaSource}),i.export(n,"VideoSource",function(){return c.VideoSource}),i.export(n,"AudioSource",function(){return c.AudioSource}),i.export(n,"SubtitleSource",function(){return c.SubtitleSource}),i.export(n,"AudioBufferSource",function(){return c.AudioBufferSource}),i.export(n,"AudioSampleSource",function(){return c.AudioSampleSource}),i.export(n,"CanvasSource",function(){return c.CanvasSource}),i.export(n,"EncodedAudioPacketSource",function(){return c.EncodedAudioPacketSource}),i.export(n,"EncodedVideoPacketSource",function(){return c.EncodedVideoPacketSource}),i.export(n,"MediaStreamAudioTrackSource",function(){return c.MediaStreamAudioTrackSource}),i.export(n,"MediaStreamVideoTrackSource",function(){return c.MediaStreamVideoTrackSource}),i.export(n,"TextSubtitleSource",function(){return c.TextSubtitleSource}),i.export(n,"VideoSampleSource",function(){return c.VideoSampleSource}),i.export(n,"VIDEO_CODECS",function(){return u.VIDEO_CODECS}),i.export(n,"AUDIO_CODECS",function(){return u.AUDIO_CODECS}),i.export(n,"PCM_AUDIO_CODECS",function(){return u.PCM_AUDIO_CODECS}),i.export(n,"NON_PCM_AUDIO_CODECS",function(){return u.NON_PCM_AUDIO_CODECS}),i.export(n,"SUBTITLE_CODECS",function(){return u.SUBTITLE_CODECS}),i.export(n,"canEncode",function(){return l.canEncode}),i.export(n,"canEncodeVideo",function(){return l.canEncodeVideo}),i.export(n,"canEncodeAudio",function(){return l.canEncodeAudio}),i.export(n,"canEncodeSubtitles",function(){return l.canEncodeSubtitles}),i.export(n,"getEncodableCodecs",function(){return l.getEncodableCodecs}),i.export(n,"getEncodableVideoCodecs",function(){return l.getEncodableVideoCodecs}),i.export(n,"getEncodableAudioCodecs",function(){return l.getEncodableAudioCodecs}),i.export(n,"getEncodableSubtitleCodecs",function(){return l.getEncodableSubtitleCodecs}),i.export(n,"getFirstEncodableVideoCodec",function(){return l.getFirstEncodableVideoCodec}),i.export(n,"getFirstEncodableAudioCodec",function(){return l.getFirstEncodableAudioCodec}),i.export(n,"getFirstEncodableSubtitleCodec",function(){return l.getFirstEncodableSubtitleCodec}),i.export(n,"Quality",function(){return l.Quality}),i.export(n,"QUALITY_VERY_LOW",function(){return l.QUALITY_VERY_LOW}),i.export(n,"QUALITY_LOW",function(){return l.QUALITY_LOW}),i.export(n,"QUALITY_MEDIUM",function(){return l.QUALITY_MEDIUM}),i.export(n,"QUALITY_HIGH",function(){return l.QUALITY_HIGH}),i.export(n,"QUALITY_VERY_HIGH",function(){return l.QUALITY_VERY_HIGH}),i.export(n,"Target",function(){return d.Target}),i.export(n,"BufferTarget",function(){return d.BufferTarget}),i.export(n,"FilePathTarget",function(){return d.FilePathTarget}),i.export(n,"NullTarget",function(){return d.NullTarget}),i.export(n,"StreamTarget",function(){return d.StreamTarget}),i.export(n,"ALL_TRACK_TYPES",function(){return s.ALL_TRACK_TYPES}),i.export(n,"Source",function(){return f.Source}),i.export(n,"BlobSource",function(){return f.BlobSource}),i.export(n,"BufferSource",function(){return f.BufferSource}),i.export(n,"FilePathSource",function(){return f.FilePathSource}),i.export(n,"StreamSource",function(){return f.StreamSource}),i.export(n,"ReadableStreamSource",function(){return f.ReadableStreamSource}),i.export(n,"UrlSource",function(){return f.UrlSource}),i.export(n,"InputFormat",function(){return h.InputFormat}),i.export(n,"AdtsInputFormat",function(){return h.AdtsInputFormat}),i.export(n,"IsobmffInputFormat",function(){return h.IsobmffInputFormat}),i.export(n,"MatroskaInputFormat",function(){return h.MatroskaInputFormat}),i.export(n,"Mp3InputFormat",function(){return h.Mp3InputFormat}),i.export(n,"Mp4InputFormat",function(){return h.Mp4InputFormat}),i.export(n,"OggInputFormat",function(){return h.OggInputFormat}),i.export(n,"QuickTimeInputFormat",function(){return h.QuickTimeInputFormat}),i.export(n,"WaveInputFormat",function(){return h.WaveInputFormat}),i.export(n,"WebMInputFormat",function(){return h.WebMInputFormat}),i.export(n,"FlacInputFormat",function(){return h.FlacInputFormat}),i.export(n,"ALL_FORMATS",function(){return h.ALL_FORMATS}),i.export(n,"ADTS",function(){return h.ADTS}),i.export(n,"MATROSKA",function(){return h.MATROSKA}),i.export(n,"MP3",function(){return h.MP3}),i.export(n,"MP4",function(){return h.MP4}),i.export(n,"OGG",function(){return h.OGG}),i.export(n,"QTFF",function(){return h.QTFF}),i.export(n,"WAVE",function(){return h.WAVE}),i.export(n,"WEBM",function(){return h.WEBM}),i.export(n,"FLAC",function(){return h.FLAC}),i.export(n,"Input",function(){return p.Input}),i.export(n,"InputDisposedError",function(){return p.InputDisposedError}),i.export(n,"InputTrack",function(){return m.InputTrack}),i.export(n,"InputVideoTrack",function(){return m.InputVideoTrack}),i.export(n,"InputAudioTrack",function(){return m.InputAudioTrack}),i.export(n,"EncodedPacket",function(){return g.EncodedPacket}),i.export(n,"AudioSample",function(){return b.AudioSample}),i.export(n,"VideoSample",function(){return b.VideoSample}),i.export(n,"AudioBufferSink",function(){return k.AudioBufferSink}),i.export(n,"AudioSampleSink",function(){return k.AudioSampleSink}),i.export(n,"BaseMediaSampleSink",function(){return k.BaseMediaSampleSink}),i.export(n,"CanvasSink",function(){return k.CanvasSink}),i.export(n,"EncodedPacketSink",function(){return k.EncodedPacketSink}),i.export(n,"VideoSampleSink",function(){return k.VideoSampleSink}),i.export(n,"Conversion",function(){return _.Conversion}),i.export(n,"CustomVideoDecoder",function(){return y.CustomVideoDecoder}),i.export(n,"CustomVideoEncoder",function(){return y.CustomVideoEncoder}),i.export(n,"CustomAudioDecoder",function(){return y.CustomAudioDecoder}),i.export(n,"CustomAudioEncoder",function(){return y.CustomAudioEncoder}),i.export(n,"registerDecoder",function(){return y.registerDecoder}),i.export(n,"registerEncoder",function(){return y.registerEncoder}),i.export(n,"RichImageData",function(){return S.RichImageData}),i.export(n,"AttachedFile",function(){return S.AttachedFile});var s=e("./output.js"),o=e("./output-format.js"),c=e("./media-source.js"),u=e("./codec.js"),l=e("./encode.js"),d=e("./target.js"),f=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),m=e("./input-track.js"),g=e("./packet.js"),b=e("./sample.js"),k=e("./media-sink.js"),_=e("./conversion.js"),y=e("./custom-coder.js"),S=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"7vKle","./input-format.js":"1jhAI","./input.js":"3sapy","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"k0V9R","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fXWqW:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"VIDEO_CODECS",function(){return u}),i.export(n,"PCM_AUDIO_CODECS",function(){return l}),i.export(n,"NON_PCM_AUDIO_CODECS",function(){return d}),i.export(n,"AUDIO_CODECS",function(){return f}),i.export(n,"SUBTITLE_CODECS",function(){return h}),i.export(n,"VP9_LEVEL_TABLE",function(){return g}),i.export(n,"buildVideoCodecString",function(){return y}),i.export(n,"generateVp9CodecConfigurationFromCodecString",function(){return S}),i.export(n,"generateAv1CodecConfigurationFromCodecString",function(){return w}),i.export(n,"extractVideoCodecString",function(){return T}),i.export(n,"buildAudioCodecString",function(){return x}),i.export(n,"extractAudioCodecString",function(){return I}),i.export(n,"aacFrequencyTable",function(){return E}),i.export(n,"aacChannelMap",function(){return j}),i.export(n,"parseAacAudioSpecificConfig",function(){return P}),i.export(n,"buildAacAudioSpecificConfig",function(){return C}),i.export(n,"OPUS_SAMPLE_RATE",function(){return A}),i.export(n,"parsePcmCodec",function(){return M}),i.export(n,"inferCodecFromCodecString",function(){return D}),i.export(n,"getVideoEncoderConfigExtension",function(){return F}),i.export(n,"getAudioEncoderConfigExtension",function(){return R}),i.export(n,"validateVideoChunkMetadata",function(){return z}),i.export(n,"validateAudioChunkMetadata",function(){return G}),i.export(n,"validateSubtitleMetadata",function(){return q});var s=e("@swc/helpers/cjs/_to_consumable_array.cjs"),o=e("@swc/helpers/cjs/_type_of.cjs"),c=e("./misc.js"),u=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],d=["aac","opus","mp3","vorbis","flac"],f=(0,s._)(d).concat((0,s._)(l)),h=["webvtt"],p=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],m=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],g=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],b=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],k=".01.01.01.01.00",_=".0.110.01.01.01.0",y=function(e,r,n,a){if("avc"===e){var i,s=Math.ceil(r/16)*Math.ceil(n/16),o=null!=(i=p.find(function(e){return s<=e.maxMacroblocks&&a<=e.maxBitrate}))?i:(0,c.last)(p),u=o?o.level:0,l="64".padStart(2,"0"),d=u.toString(16).padStart(2,"0");return"avc1.".concat(l).concat("00").concat(d)}if("hevc"===e){var f,h=r*n,k=null!=(f=m.find(function(e){return h<=e.maxPictureSize&&a<=e.maxBitrate}))?f:(0,c.last)(m);return"hev1."+"".concat("").concat(1,".")+"".concat("6",".")+"".concat(k.tier).concat(k.level,".")+"".concat("B0")}if("vp8"===e)return"vp8";if("vp9"===e){var _,y=r*n,S=null!=(_=g.find(function(e){return y<=e.maxPictureSize&&a<=e.maxBitrate}))?_:(0,c.last)(g);return"vp09.".concat("00",".").concat(S.level.toString().padStart(2,"0"),".").concat("08")}if("av1"===e){var w,T=r*n,x=null!=(w=b.find(function(e){return T<=e.maxPictureSize&&a<=e.maxBitrate}))?w:(0,c.last)(b),I=x.level.toString().padStart(2,"0");return"av01.".concat(0,".").concat(I).concat(x.tier,".").concat("08")}throw TypeError("Unhandled codec '".concat(e,"'."))},S=function(e){var r=e.split(".");return[1,1,Number(r[1]),2,1,Number(r[2]),3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},w=function(e){var r=e.split("."),n=Number(r[1]),a=r[2];return[129,(n<<5)+Number(a.slice(0,-1)),(("H"===a.slice(-1))<<7)+((8!==Number(r[3]))<<6)+0+((r[4]?Number(r[4]):0)<<4)+((r[5]?Number(r[5][0]):1)<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},T=function(e){var r=e.codec,n=e.codecDescription,a=e.colorSpace,i=e.avcCodecInfo,o=e.hevcCodecInfo,u=e.vp9CodecInfo,l=e.av1CodecInfo;if("avc"===r){if((0,c.assert)(null!==e.avcType),i){var d=new Uint8Array([i.avcProfileIndication,i.profileCompatibility,i.avcLevelIndication]);return"avc".concat(e.avcType,".").concat((0,c.bytesToHexString)(d))}if(!n||n.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return"avc".concat(e.avcType,".").concat((0,c.bytesToHexString)(n.subarray(1,4)))}if("hevc"===r){if(o)f=o.generalProfileSpace,h=o.generalProfileIdc,p=(0,c.reverseBitsU32)(o.generalProfileCompatibilityFlags),m=o.generalTierFlag,b=o.generalLevelIdc,y=(0,s._)(o.generalConstraintIndicatorFlags);else{if(!n||n.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");var f,h,p,m,b,y,S=(0,c.toDataView)(n),w=S.getUint8(1);f=w>>6&3,h=31&w,p=(0,c.reverseBitsU32)(S.getUint32(2)),m=w>>5&1,b=S.getUint8(12),y=[];for(var T=0;T<6;T++)y.push(S.getUint8(6+T))}var x="hev1.";for(x+=["","A","B","C"][f]+h,x+=".",x+=p.toString(16).toUpperCase(),x+=".",x+=0===m?"L":"H",x+=b;y.length>0&&0===y[y.length-1];)y.pop();return y.length>0&&(x+=".",x+=y.map(function(e){return e.toString(16).toUpperCase()}).join(".")),x}if("vp8"===r)return"vp8";if("vp9"===r){if(!u){var I=e.width*e.height,E=(0,c.last)(g).level,j=!0,P=!1,C=void 0;try{for(var A,B=g[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value;if(I<=M.maxPictureSize){E=M.level;break}}}catch(e){P=!0,C=e}finally{try{j||null==B.return||B.return()}finally{if(P)throw C}}return"vp09.00.".concat(E.toString().padStart(2,"0"),".08")}var D=u.profile.toString().padStart(2,"0"),F=u.level.toString().padStart(2,"0"),R=u.bitDepth.toString().padStart(2,"0"),U=u.chromaSubsampling.toString().padStart(2,"0"),O=u.colourPrimaries.toString().padStart(2,"0"),L=u.transferCharacteristics.toString().padStart(2,"0"),N=u.matrixCoefficients.toString().padStart(2,"0"),V=u.videoFullRangeFlag.toString().padStart(2,"0"),z="vp09.".concat(D,".").concat(F,".").concat(R,".").concat(U);return(z+=".".concat(O,".").concat(L,".").concat(N,".").concat(V)).endsWith(k)&&(z=z.slice(0,-k.length)),z}if("av1"===r){if(!l){var H=e.width*e.height,G=(0,c.last)(g).level,q=!0,W=!1,K=void 0;try{for(var X,Q=g[Symbol.iterator]();!(q=(X=Q.next()).done);q=!0){var Z=X.value;if(H<=Z.maxPictureSize){G=Z.level;break}}}catch(e){W=!0,K=e}finally{try{q||null==Q.return||Q.return()}finally{if(W)throw K}}return"av01.0.".concat(G.toString().padStart(2,"0"),"M.08")}var Y=l.profile,J=l.level.toString().padStart(2,"0"),$=l.tier?"H":"M",ee=l.bitDepth.toString().padStart(2,"0"),et=l.monochrome?"1":"0",er=100*l.chromaSubsamplingX+10*l.chromaSubsamplingY+ +(l.chromaSubsamplingX&&l.chromaSubsamplingY?l.chromaSamplePosition:0),en=(null==a?void 0:a.primaries)?c.COLOR_PRIMARIES_MAP[a.primaries]:1,ea=(null==a?void 0:a.transfer)?c.TRANSFER_CHARACTERISTICS_MAP[a.transfer]:1,ei=(null==a?void 0:a.matrix)?c.MATRIX_COEFFICIENTS_MAP[a.matrix]:1,es=+(null!=a&&!!a.fullRange),eo="av01.".concat(Y,".").concat(J).concat($,".").concat(ee);return eo+=".".concat(et,".").concat(er.toString().padStart(3,"0")),eo+=".".concat(en.toString().padStart(2,"0")),eo+=".".concat(ea.toString().padStart(2,"0")),eo+=".".concat(ei.toString().padStart(2,"0")),(eo+=".".concat(es)).endsWith(_)&&(eo=eo.slice(0,-_.length)),eo}throw TypeError("Unhandled codec '".concat(r,"'."))},x=function(e,r,n){if("aac"===e)return r>=2&&n<=24e3?"mp4a.40.29":n<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError("Unhandled codec '".concat(e,"'."))},I=function(e){var r=e.codec,n=e.codecDescription,a=e.aacCodecInfo;if("aac"===r){if(!a)throw TypeError("AAC codec info must be provided.");if(a.isMpeg2)return"mp4a.67";var i=P(n);return"mp4a.40.".concat(i.objectType)}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError("Unhandled codec '".concat(r,"'."))},E=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],j=[-1,1,2,3,4,5,6,8],P=function(e){if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");var r=new(0,c.Bitstream)(e),n=r.readBits(5);31===n&&(n=32+r.readBits(6));var a=r.readBits(4),i=null;15===a?i=r.readBits(24):a=1&&s<=7&&(o=j[s]),{objectType:n,frequencyIndex:a,sampleRate:i,channelConfiguration:s,numberOfChannels:o}},C=function(e){var r=E.indexOf(e.sampleRate),n=null;-1===r&&(r=15,n=e.sampleRate);var a=j.indexOf(e.numberOfChannels);if(-1===a)throw TypeError("Unsupported number of channels: ".concat(e.numberOfChannels));var i=13;e.objectType>=32&&(i+=6),15===r&&(i+=24);var s=new Uint8Array(Math.ceil(i/8)),o=new(0,c.Bitstream)(s);return e.objectType<32?o.writeBits(5,e.objectType):(o.writeBits(5,31),o.writeBits(6,e.objectType-32)),o.writeBits(4,r),15===r&&o.writeBits(24,n),o.writeBits(4,a),s},A=48e3,B=/^pcm-([usf])(\d+)+(be)?$/,M=function(e){if((0,c.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};var r=B.exec(e);return(0,c.assert)(r),{dataType:"u"===r[1]?"unsigned":"s"===r[1]?"signed":"float",sampleSize:Number(r[2])/8,littleEndian:"be"!==r[3],silentValue:128*("pcm-u8"===e)}},D=function(e){if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(B.test(e))return e;return"webvtt"===e?"webvtt":null},F=function(e){return"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{}},R=function(e){return"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{}},U=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],O=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,N=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,V=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,z=function(e){if(!e)throw TypeError("Video chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!U.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){var r=e.decoderConfig.colorSpace;if((void 0===r?"undefined":(0,o._)(r))!=="object")throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");var n=Object.keys(c.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!n.includes(r.primaries))throw TypeError("Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of"+" ".concat(n.join(", "),"."));var a=Object.keys(c.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!a.includes(r.transfer))throw TypeError("Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of"+" ".concat(a.join(", "),"."));var i=Object.keys(c.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!i.includes(r.matrix))throw TypeError("Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of"+" ".concat(i.join(", "),"."));if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!O.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!V.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},H=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],G=function(e){if(!e)throw TypeError("Audio chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!H.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM"+" codecs (".concat(l.join(", "),")."))},q=function(e){if(!e)throw TypeError("Subtitle metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!==(0,o._)(e.config))throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j7iGm:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"assert",function(){return _}),i.export(n,"normalizeRotation",function(){return y}),i.export(n,"last",function(){return S}),i.export(n,"isU32",function(){return w}),i.export(n,"Bitstream",function(){return T}),i.export(n,"readExpGolomb",function(){return x}),i.export(n,"readSignedExpGolomb",function(){return I}),i.export(n,"writeBits",function(){return E}),i.export(n,"toUint8Array",function(){return j}),i.export(n,"toDataView",function(){return P}),i.export(n,"textDecoder",function(){return C}),i.export(n,"textEncoder",function(){return A}),i.export(n,"isIso88591Compatible",function(){return B}),i.export(n,"COLOR_PRIMARIES_MAP",function(){return D}),i.export(n,"COLOR_PRIMARIES_MAP_INVERSE",function(){return F}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP",function(){return R}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",function(){return U}),i.export(n,"MATRIX_COEFFICIENTS_MAP",function(){return O}),i.export(n,"MATRIX_COEFFICIENTS_MAP_INVERSE",function(){return L}),i.export(n,"colorSpaceIsComplete",function(){return N}),i.export(n,"isAllowSharedBufferSource",function(){return V}),i.export(n,"AsyncMutex",function(){return z}),i.export(n,"bytesToHexString",function(){return H}),i.export(n,"reverseBitsU32",function(){return G}),i.export(n,"binarySearchExact",function(){return q}),i.export(n,"binarySearchLessOrEqual",function(){return W}),i.export(n,"insertSorted",function(){return K}),i.export(n,"promiseWithResolvers",function(){return X}),i.export(n,"removeItem",function(){return Q}),i.export(n,"findLast",function(){return Z}),i.export(n,"findLastIndex",function(){return Y}),i.export(n,"toAsyncIterator",function(){return J}),i.export(n,"validateAnyIterable",function(){return $}),i.export(n,"assertNever",function(){return ee}),i.export(n,"getUint24",function(){return et}),i.export(n,"getInt24",function(){return er}),i.export(n,"setUint24",function(){return en}),i.export(n,"setInt24",function(){return ea}),i.export(n,"setInt64",function(){return ei}),i.export(n,"mapAsyncGenerator",function(){return es}),i.export(n,"clamp",function(){return eo}),i.export(n,"UNDETERMINED_LANGUAGE",function(){return ec}),i.export(n,"roundIfAlmostInteger",function(){return eu}),i.export(n,"roundToMultiple",function(){return el}),i.export(n,"ilog",function(){return ed}),i.export(n,"isIso639Dash2LanguageCode",function(){return eh}),i.export(n,"SECOND_TO_MICROSECOND_FACTOR",function(){return ep}),i.export(n,"mergeRequestInit",function(){return em}),i.export(n,"retriedFetch",function(){return ev}),i.export(n,"computeRationalApproximation",function(){return eb}),i.export(n,"CallSerializer",function(){return ek}),i.export(n,"isWebKit",function(){return ey}),i.export(n,"isFirefox",function(){return ew}),i.export(n,"isChromium",function(){return ex}),i.export(n,"getChromiumVersion",function(){return eE}),i.export(n,"coalesceIndex",function(){return ej}),i.export(n,"closedIntervalsOverlap",function(){return eP}),i.export(n,"keyValueIterator",function(){return eC}),i.export(n,"imageMimeTypeToExtension",function(){return eA}),i.export(n,"base64ToBytes",function(){return eB}),i.export(n,"bytesToBase64",function(){return eM}),i.export(n,"uint8ArraysAreEqual",function(){return eD}),i.export(n,"polyfillSymbolDispose",function(){return eF}),i.export(n,"isNumber",function(){return eR});var s=e("@swc/helpers/cjs/_async_generator_delegate.cjs"),o=e("@swc/helpers/cjs/_async_iterator.cjs"),c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_object_spread.cjs"),h=e("@swc/helpers/cjs/_sliced_to_array.cjs"),p=e("@swc/helpers/cjs/_to_consumable_array.cjs"),m=e("@swc/helpers/cjs/_type_of.cjs"),g=e("@swc/helpers/cjs/_wrap_async_generator.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("@swc/helpers/cjs/_ts_values.cjs");function _(e){if(!e)throw Error("Assertion failed.")}var y=function(e){var r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error("Invalid rotation ".concat(e,"."))},S=function(e){return e&&e[e.length-1]},w=function(e){return e>=0&&e<0x100000000},T=function(){"use strict";function e(r){(0,u._)(this,e),this.bytes=r,this.pos=0}return(0,l._)(e,[{key:"seekToByte",value:function(e){this.pos=8*e}},{key:"readBit",value:function(){var e,r=Math.floor(this.pos/8),n=null!=(e=this.bytes[r])?e:0,a=7-(7&this.pos);return this.pos++,(n&1<>a}},{key:"readBits",value:function(e){if(1===e)return this.readBit();for(var r=0,n=0;n>n-a-1<=32)throw Error("Invalid exponential-Golomb code.");return(1<>1):r+1>>1},E=function(e,r,n,a){for(var i=r;i>n-i-1<255)return!1;return!0},M=function(e){return Object.fromEntries(Object.entries(e).map(function(e){var r=(0,h._)(e,2),n=r[0];return[r[1],n]}))},D={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},F=M(D),R={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},U=M(R),O={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},L=M(O),N=function(e){return!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange},V=function(e){return e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)},z=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"acquire",value:function(){return(0,c._)(function(){var e,r,n;return(0,b._)(this,function(a){switch(a.label){case 0:return r=new Promise(function(r){e=r}),n=this.currentPromise,this.currentPromise=r,[4,n];case 1:return a.sent(),[2,e]}})}).call(this)}}]),e}(),H=function(e){return(0,p._)(e).map(function(e){return e.toString(16).padStart(2,"0")}).join("")},G=function(e){return(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0},q=function(e,r,n){for(var a=0,i=e.length-1,s=-1;a<=i;){var o=a+i>>1,c=n(e[o]);c===r?(s=o,i=o-1):c=0;n--)if(r(e[n]))return e[n]},Y=function(e,r){for(var n=e.length-1;n>=0;n--)if(r(e[n]))return n;return -1},J=function(e){return(0,g._)(function(){return(0,b._)(this,function(r){switch(r.label){case 0:if(!(Symbol.iterator in e))return[3,2];return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.iterator]())))];case 1:return r.sent(),[3,4];case 2:return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.asyncIterator]())))];case 3:r.sent(),r.label=4;case 4:return[2]}})})()},$=function(e){if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},ee=function(e){throw Error("Unexpected value: ".concat(e))},et=function(e,r,n){var a=e.getUint8(r),i=e.getUint8(r+1),s=e.getUint8(r+2);return n?a|i<<8|s<<16:a<<16|i<<8|s},er=function(e,r,n){return et(e,r,n)<<8>>8},en=function(e,r,n,a){n>>>=0,n&=0xffffff,a?(e.setUint8(r,255&n),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,n>>>16&255)):(e.setUint8(r,n>>>16&255),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,255&n))},ea=function(e,r,n,a){(n=eo(n,-8388608,8388607))<0&&(n=n+0x1000000&0xffffff),en(e,r,n,a)},ei=function(e,r,n,a){a?(e.setUint32(r+0,n,!0),e.setInt32(r+4,Math.floor(n/0x100000000),!0)):(e.setInt32(r+0,Math.floor(n/0x100000000),!0),e.setUint32(r+4,n,!0))},es=function(e,r){return(0,d._)({next:function(){return(0,c._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:return[4,e.next()];case 1:if((n=a.sent()).done)return[2,{value:void 0,done:!0}];return[2,{value:r(n.value),done:!1}]}})})()},return:function(){return e.return()},throw:function(r){return e.throw(r)}},Symbol.asyncIterator,function(){return this})},eo=function(e,r,n){return Math.max(r,Math.min(n,e))},ec="und",eu=function(e){var r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},el=function(e,r){return Math.round(e/r)*r},ed=function(e){for(var r=0;e;)r++,e>>=1;return r},ef=/^[a-z]{3}$/,eh=function(e){return ef.test(e)},ep=1e6*(1+Number.EPSILON),em=function(e,r){var n=(0,f._)({},e,r);if(e.headers||r.headers){var a=e.headers?eg(e.headers):{},i=r.headers?eg(r.headers):{},s=(0,f._)({},a);Object.entries(i).forEach(function(e){var r=(0,h._)(e,2),n=r[0],a=r[1],i=Object.keys(s).find(function(e){return e.toLowerCase()===n.toLowerCase()});i&&delete s[i],s[n]=a}),n.headers=s}return n},eg=function(e){if(e instanceof Headers){var r={};return e.forEach(function(e,n){r[n]=e}),r}if(Array.isArray(e)){var n={};return e.forEach(function(e){var r=(0,h._)(e,2),a=r[0],i=r[1];n[a]=i}),n}return e},ev=function(e,r,n,a,i){return(0,c._)(function(){var s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:s=function(){var s,c,u;return(0,b._)(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,,5]),s={},[4,e(r,n)];case 1:return[2,(s.v=l.sent(),s)];case 2:if(c=l.sent(),i()||null===(u=a(++o,c,r)))throw c;if(console.error("Retrying failed fetch. Error:",c),!Number.isFinite(u)||u<0)throw TypeError("Retry delay must be a non-negative finite number.");if(!(u>0))return[3,4];return[4,new Promise(function(e){return setTimeout(e,1e3*u)})];case 3:l.sent(),l.label=4;case 4:if(i())throw c;return[3,5];case 5:return[2]}})},o=0,u.label=1;case 1:return[5,(0,k._)(s())];case 2:if(c=u.sent(),"object"===(0,m._)(c))return[2,c.v];return[3,1];case 3:return[2]}})})()},eb=function(e,r){for(var n=e<0?-1:1,a=0,i=1,s=1,o=0,c=e=Math.abs(e);;){var u=Math.floor(c),l=u*s+a,d=u*o+i;if(d>r||(a=s,i=o,s=l,o=d,!isFinite(c=1/(c-u))))break}return{numerator:n*s,denominator:o}},ek=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"call",value:function(e){return this.currentPromise=this.currentPromise.then(e)}}]),e}(),e_=null,ey=function(){var e;return null!==e_?e_:e_=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.match(/apple/i))||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent)))},eS=null,ew=function(){var e;return null!==eS?eS:eS="undefined"!=typeof navigator&&(null==(e=navigator.userAgent)?void 0:e.includes("Firefox"))},eT=null,ex=function(){var e;return null!==eT?eT:eT=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.includes("Google Inc"))||/Chrome/.test(navigator.userAgent)))},eI=null,eE=function(){if(null!==eI)return eI;if("undefined"==typeof navigator)return null;var e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eI=Number(e[1]):null},ej=function(e,r){return -1!==e?e:r},eP=function(e,r,n,a){return e<=a&&n<=r},eC=function(e){var r,n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:for(n in r=[],e)r.push(n);a=0,o.label=1;case 1:if(!(a1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,p.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._readers=new WeakMap,n._blob=e,n._orchestrator=new j({maxCacheSize:null!=(a=i.maxCacheSize)?a:8388608,maxWorkerCount:4,runWorker:n._runWorker.bind(n),prefetchProfile:E.fileSystem}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this._blob.size;return this._orchestrator.fileSize=e,e}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,f._)(this,function(d){switch(d.label){case 0:void 0===(r=this._readers.get(e))&&(r="stream"in this._blob&&!(0,p.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r)),d.label=1;case 1:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!s||(void 0===s?"undefined":(0,d._)(s))!=="object")throw TypeError("options must be an object.");if(void 0!==s.requestInit&&(!s.requestInit||"object"!==(0,d._)(s.requestInit)))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==s.getRetryDelay&&"function"!=typeof s.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==s.maxCacheSize&&(!(0,p.isNumber)(s.maxCacheSize)||s.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==s.fetchFn&&"function"!=typeof s.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");return(n=(0,o._)(this,r))._existingResponses=new WeakMap,n._url=e,n._options=s,n._getRetryDelay=null!=(a=s.getRetryDelay)?a:S,n._orchestrator=new j({maxCacheSize:null!=(i=s.maxCacheSize)?i:0x4000000,maxWorkerCount:2,runWorker:n._runWorker.bind(n),prefetchProfile:E.network}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c;return(0,f._)(this,function(u){switch(u.label){case 0:return e=this,r=new AbortController,[4,(0,p.retriedFetch)(null!=(n=this._options.fetchFn)?n:fetch,this._url,(0,p.mergeRequestInit)(null!=(a=this._options.requestInit)?a:{},{headers:{Range:"bytes=0-"},signal:r.signal}),this._getRetryDelay,function(){return e._disposed})];case 1:if(!(i=u.sent()).ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(i.status," ").concat(i.statusText));if(206===i.status)o=this._getTotalLengthFromRangeResponse(i),s=this._orchestrator.createWorker(0,Math.min(o,524288));else if(c=i.headers.get("Content-Length"))o=Number(c),s=this._orchestrator.createWorker(0,o),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error("HTTP response (status ".concat(i.status,") must surface Content-Length header."));return this._orchestrator.fileSize=o,this._existingResponses.set(s,{response:i,abortController:r}),this._orchestrator.runWorker(s),[2,o]}})}).call(this)}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,m;return(0,f._)(this,function(g){switch(g.label){case 0:r=this,g.label=1;case 1:if(a=function(){var r,a,i,o,c,u,d;return(0,f._)(this,function(f){switch(f.label){case 0:if(e.currentPos>=e.targetPos||e.aborted)return s.abort(),e.running=!1,[2,{v:void 0}];i=void 0,f.label=1;case 1:return f.trys.push([1,3,,7]),[4,l.read()];case 2:return i=f.sent(),[3,7];case 3:if(o=f.sent(),n._disposed)throw o;if(null===(c=n._getRetryDelay(1,o,n._url)))return[3,5];return console.error("Error while reading response stream. Attempting to resume.",o),[4,new Promise(function(e){return setTimeout(e,1e3*c)})];case 4:return f.sent(),[2,"break"];case 5:throw o;case 6:return[3,7];case 7:if(e.aborted)return[2,"break"];if(u=i.done,d=i.value,u){if(e.currentPos>=e.targetPos)return n._orchestrator.forgetWorker(e),e.running=!1,[2,{v:void 0}];return[2,"break"]}return null==(r=(a=n).onread)||r.call(a,e.currentPos,e.currentPos+d.length),n._orchestrator.supplyWorkerData(e,d),[2]}})},i=this._existingResponses.get(e),this._existingResponses.delete(e),s=null==i?void 0:i.abortController,o=null==i?void 0:i.response,s)return[3,3];return s=new AbortController,[4,(0,p.retriedFetch)(null!=(c=this._options.fetchFn)?c:fetch,this._url,(0,p.mergeRequestInit)(null!=(u=this._options.requestInit)?u:{},{headers:{Range:"bytes=".concat(e.currentPos,"-")},signal:s.signal}),this._getRetryDelay,function(){return r._disposed})];case 2:o=g.sent(),g.label=3;case 3:if((0,p.assert)(o),!o.ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(o.status," ").concat(o.statusText));if(e.currentPos>0&&206!==o.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!o.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");l=o.body.getReader(),g.label=4;case 4:return n=this,[5,(0,h._)(a())];case 5:if(m=g.sent(),"object"===(0,d._)(m))return[2,m.v];if("break"===m)return[3,6];return[3,4];case 6:if(e.aborted)return[3,7];return[3,1];case 7:return e.running=!1,[2]}})}).call(this)}},{key:"_getTotalLengthFromRangeResponse",value:function(e){var r=e.headers.get("Content-Range");if(r){var n=/\/(\d+)/.exec(r);if(n)return Number(n[1])}var a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}},{key:"_dispose",value:function(){this._orchestrator.dispose()}}]),r}(k),T=function(e){"use strict";function r(e){var n,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e)throw TypeError("filePath must be a string.");if(!a||(void 0===a?"undefined":(0,d._)(a))!=="object")throw TypeError("options must be an object.");if(void 0!==a.maxCacheSize&&(!(0,p.isNumber)(a.maxCacheSize)||a.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._fileHandle=null,n._streamSource=new x({getSize:function(){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:return[4,b.fs.open(e,"r")];case 1:return n._fileHandle=r.sent(),[4,n._fileHandle.stat()];case 2:return[2,r.sent().size]}})})()},read:function(e,r){return(0,s._)(function(){var a;return(0,f._)(this,function(i){switch(i.label){case 0:return(0,p.assert)(n._fileHandle),a=new Uint8Array(r-e),[4,n._fileHandle.read(a,0,r-e,e)];case 1:return i.sent(),[2,a]}})})()},maxCacheSize:a.maxCacheSize,prefetchProfile:"fileSystem"}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_read",value:function(e,r){return this._streamSource._read(e,r)}},{key:"_retrieveSize",value:function(){return this._streamSource._retrieveSize()}},{key:"_dispose",value:function(){var e;this._streamSource._dispose(),null==(e=this._fileHandle)||e.close(),this._fileHandle=null}}]),r}(k),x=function(e){"use strict";function r(e){var n,a,i;if((0,c._)(this,r),!e||(void 0===e?"undefined":(0,d._)(e))!=="object")throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,p.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");return(n=(0,o._)(this,r))._options=e,n._orchestrator=new j({maxCacheSize:null!=(a=e.maxCacheSize)?a:8388608,maxWorkerCount:2,prefetchProfile:E[null!=(i=e.prefetchProfile)?i:"none"],runWorker:n._runWorker.bind(n)}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this,r=this._options.getSize();if(r instanceof Promise)return r.then(function(r){if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return e._orchestrator.fileSize=r,r});if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=r,r}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,d,h,m;return(0,f._)(this,function(f){switch(f.label){case 0:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof ReadableStream))throw TypeError("stream must be a ReadableStream.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,p.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._reader=null,n._cache=[],n._pendingSlices=[],n._currentIndex=0,n._targetIndex=0,n._maxRequestedIndex=0,n._endIndex=null,n._pulling=!1,n._stream=e,n._maxCacheSize=null!=(a=i.maxCacheSize)?a:0x1000000,n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return this._endIndex}},{key:"_read",value:function(e,r){var n=this;if(null!==this._endIndex&&r>this._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);var a=(0,p.binarySearchLessOrEqual)(this._cache,e,function(e){return e.start}),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};var s=e,o=new Uint8Array(r-e);if(-1!==a)for(var c=a;c=r)break;var l=Math.max(e,u.start);l>s&&this._throwDueToCacheMiss();var d=Math.min(r,u.end);ls&&this._throwDueToCacheMiss();var f=(0,p.promiseWithResolvers)(),h=f.promise,m=f.resolve,g=f.reject;return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:m,reject:g}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(function(e){if(n._pulling=!1,n._pendingSlices.length>0)n._pendingSlices.forEach(function(r){return r.reject(e)}),n._pendingSlices.length=0;else throw e})),h}},{key:"_throwDueToCacheMiss",value:function(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}},{key:"_pull",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u,l,d,h,m,g,b;return(0,f._)(this,function(f){switch(f.label){case 0:null!=this._reader||(this._reader=this._stream.getReader()),f.label=1;case 1:if(!(this._currentIndex0&&(b=this._cache[0],!(this._maxRequestedIndex-b.end<=this._maxCacheSize));)this._cache.shift();return this._currentIndex+=n.byteLength,[3,1];case 3:return this._pulling=!1,[2]}})}).call(this)}},{key:"_dispose",value:function(){this._pendingSlices.length=0,this._cache.length=0}}]),r}(k),E={none:function(e,r){return{start:e,end:r}},fileSystem:function(e,r){return{start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}},network:function(e,r,n){e=Math.max(0,65536*Math.floor((e-65536)/65536));var a=!0,i=!1,s=void 0;try{for(var o,c=n[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value,l=Math.max((u.startPos+u.targetPos)/2,u.targetPos-8388608);if((0,p.closedIntervalsOverlap)(e,r,l,u.targetPos)){var d=u.targetPos-u.startPos,f=8388608*Math.ceil((d+1)/8388608),h=Math.pow(2,Math.ceil(Math.log2(d+1))),m=Math.min(h,f);r=Math.max(r,u.startPos+m)}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return r=Math.max(r,e+524288),{start:e,end:r}}},j=function(){"use strict";function e(r){(0,c._)(this,e),this.options=r,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}return(0,u._)(e,[{key:"read",value:function(e,r){(0,p.assert)(null!==this.fileSize);var n=this.options.prefetchProfile(e,r,this.workers),a=Math.max(n.start,0),i=Math.min(n.end,this.fileSize);(0,p.assert)(a<=e&&r<=i);var s=null,o=(0,p.binarySearchLessOrEqual)(this.cache,e,function(e){return e.start}),c=-1!==o?this.cache[o]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,s={bytes:c.bytes,view:c.view,offset:c.start});var u=(0,p.binarySearchLessOrEqual)(this.cache,a,function(e){return e.start}),l=s?null:new Uint8Array(r-e),d=0,f=a,h=[];if(-1!==u){for(var m=u;m=i)break;if(!(g.end<=a)){var b=Math.max(a,g.start),k=Math.min(i,g.end);if((0,p.assert)(b<=k),f=l.length&&(s={bytes:l,view:(0,p.toDataView)(l),offset:e}),0===h.length)return(0,p.assert)(s),s;var w=(0,p.promiseWithResolvers)(),T=w.promise,x=w.resolve,I=w.reject,E=[],j=!0,P=!1,C=void 0;try{for(var A,B=h[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value,D=Math.max(e,M.start),F=Math.min(r,M.end);D===M.start&&F===M.end?E.push(M):Dthis.options.maxWorkerCount;){for(var a=0,i=this.workers[0],s=1;s0)break;i.aborted=!0,this.workers.splice(a,1)}return n}},{key:"runWorker",value:function(e){(0,p.assert)(!e.running),(0,p.assert)(e.currentPos0)e.pendingSlices.forEach(function(e){return e.reject(r)}),e.pendingSlices.length=0;else throw r})}},{key:"supplyWorkerData",value:function(e,r){(0,p.assert)(!e.aborted);var n=e.currentPos,a=n+r.length;this.insertIntoCache({start:n,end:a,bytes:r,view:(0,p.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(var i=0;il.start&&(l.start=a),l.end<=l.start&&(s.holes.splice(u,1),u--)}0===s.holes.length&&(s.resolve(s.bytes),e.pendingSlices.splice(i,1),i--)}for(var d=0;d0){var n=this.cache[r-1];if(n.end>=e.end)return;if(n.end>e.start){var a=new Uint8Array(e.end-n.start);a.set(n.bytes,0),a.set(e.bytes,e.start-n.start),this.currentCacheSize+=e.end-n.end,n.bytes=a,n.view=(0,p.toDataView)(a),n.end=e.end,r--,e=n}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(var i=r+1;i=s.end){this.cache.splice(i,1),this.currentCacheSize-=s.bytes.length,i--;continue}var o=new Uint8Array(s.end-e.start);o.set(e.bytes,0),o.set(s.bytes,s.start-e.start),this.currentCacheSize-=e.end-s.start,e.bytes=o,e.view=(0,p.toDataView)(o),e.end=s.end,this.cache.splice(i,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){for(var c=0,u=this.cache[0],l=1;l0&&void 0!==arguments[0]?arguments[0]:"Input has been disposed.";return(0,c._)(this,r),(e=(0,o._)(this,r,[n])).name="InputDisposedError",e}return(0,l._)(r,e),r}((0,f._)(Error))},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./input-format.js":"1jhAI","./misc.js":"j7iGm","./reader.js":"8KRfO","./source.js":"7vKle","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,r,n,a){"use strict";var i=e("c8857d56f4968279"),s=e("2ed7bdf1701f2d07"),o=e("5c5ad8846076b9cd"),c=e("2db6fa09e8a5be4c");function u(e){var r="function"==typeof Map?new Map:void 0;return n._=u=function(e){if(null===e||!o._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,n)}function n(){return i._(e,arguments,s._(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c._(n,e)},u(e)}n._=u},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,r,n,a){"use strict";var i=e("62fc231ae2e75266"),s=e("3f98bf9d4f706151");function o(e,r,a){return i._()?n._=o=Reflect.construct:n._=o=function(e,r,n){var a=[null];a.push.apply(a,r);var i=new(Function.bind.apply(e,a));return n&&s._(i,n.prototype),i},o.apply(null,arguments)}n._=o},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,r,n,a){"use strict";n._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"1jhAI":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"InputFormat",function(){return I}),i.export(n,"IsobmffInputFormat",function(){return E}),i.export(n,"Mp4InputFormat",function(){return j}),i.export(n,"QuickTimeInputFormat",function(){return P}),i.export(n,"MatroskaInputFormat",function(){return C}),i.export(n,"WebMInputFormat",function(){return A}),i.export(n,"Mp3InputFormat",function(){return B}),i.export(n,"WaveInputFormat",function(){return M}),i.export(n,"OggInputFormat",function(){return D}),i.export(n,"FlacInputFormat",function(){return F}),i.export(n,"AdtsInputFormat",function(){return R}),i.export(n,"MP4",function(){return U}),i.export(n,"QTFF",function(){return O}),i.export(n,"MATROSKA",function(){return L}),i.export(n,"WEBM",function(){return N}),i.export(n,"MP3",function(){return V}),i.export(n,"WAVE",function(){return z}),i.export(n,"OGG",function(){return H}),i.export(n,"ADTS",function(){return G}),i.export(n,"FLAC",function(){return q}),i.export(n,"ALL_FORMATS",function(){return W});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("./isobmff/isobmff-demuxer.js"),h=e("./matroska/ebml.js"),p=e("./matroska/matroska-demuxer.js"),m=e("./mp3/mp3-demuxer.js"),g=e("../shared/mp3-misc.js"),b=e("./id3.js"),k=e("./mp3/mp3-reader.js"),_=e("./ogg/ogg-demuxer.js"),y=e("./wave/wave-demuxer.js"),S=e("./adts/adts-reader.js"),w=e("./adts/adts-demuxer.js"),T=e("./reader.js"),x=e("./flac/flac-demuxer.js"),I=function e(){"use strict";(0,c._)(this,e)},E=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_getMajorBrand",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r||(r.skip(4),"ftyp"!==(0,T.readAscii)(r,4)))return[2,null];return[2,(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,f.IsobmffDemuxer)(e)}}]),r}(I),j=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,!!(r=n.sent())&&"qt "!==r]}})}).call(this)}},{key:"name",get:function(){return"MP4"}},{key:"mimeType",get:function(){return"video/mp4"}}]),r}(E),P=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){return(0,d._)(this,function(r){switch(r.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,"qt "===r.sent()]}})}).call(this)}},{key:"name",get:function(){return"QuickTime File Format"}},{key:"mimeType",get:function(){return"video/quicktime"}}]),r}(E),C=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"isSupportedEBMLOfDocType",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,f;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((n=e._reader.requestSlice(0,h.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,n];case 1:n=d.sent(),d.label=2;case 2:if(!n||null===(a=(0,h.readVarIntSize)(n))||a<1||a>8||(0,h.readUnsignedInt)(n,a)!==h.EBMLId.EBML||null===(i=(0,h.readElementSize)(n)))return[2,!1];if(!((s=e._reader.requestSlice(n.filePos,i))instanceof Promise))return[3,4];return[4,s];case 3:s=d.sent(),d.label=4;case 4:if(!s)return[2,!1];for(o=n.filePos;s.filePos<=o+i-h.MIN_HEADER_SIZE&&(c=(0,h.readElementHeader)(s));){if(u=c.id,l=c.size,f=s.filePos,null===l)return[2,!1];switch(u){case h.EBMLId.EBMLVersion:case h.EBMLId.EBMLReadVersion:if(1!==(0,h.readUnsignedInt)(s,l))return[2,!1];break;case h.EBMLId.DocType:if((0,h.readAsciiString)(s,l)!==r)return[2,!1];break;case h.EBMLId.DocTypeVersion:if((0,h.readUnsignedInt)(s,l)>4)return[2,!1]}s.filePos=f+l}return[2,!0]}})})()}},{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"matroska")}},{key:"_createDemuxer",value:function(e){return new(0,p.MatroskaDemuxer)(e)}},{key:"name",get:function(){return"Matroska"}},{key:"mimeType",get:function(){return"video/x-matroska"}}]),r}(I),A=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"webm")}},{key:"name",get:function(){return"WebM"}},{key:"mimeType",get:function(){return"video/webm"}}]),r}(C),B=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((r=e._reader.requestSlice(0,10))instanceof Promise))return[3,2];return[4,r];case 1:r=d.sent(),d.label=2;case 2:if(!r)return[2,!1];n=0,a=!1,d.label=3;case 3:if(!((i=e._reader.requestSlice(n,b.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,5];return[4,i];case 4:i=d.sent(),d.label=5;case 5:if(!i||!(s=(0,b.readId3V2Header)(i)))return[3,6];return a=!0,n=i.filePos+s.size,[3,3];case 6:return[4,(0,k.readNextFrameHeader)(e._reader,n,n+4096)];case 7:if(!(o=d.sent()))return[2,!1];if(a)return[2,!0];return n=o.startPos+o.header.totalSize,[4,(0,k.readNextFrameHeader)(e._reader,n,n+g.FRAME_HEADER_SIZE)];case 8:if(!(c=d.sent())||(u=o.header,l=c.header,u.channel!==l.channel||u.sampleRate!==l.sampleRate))return[2,!1];return[2,!0]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,m.Mp3Demuxer)(e)}},{key:"name",get:function(){return"MP3"}},{key:"mimeType",get:function(){return"audio/mpeg"}}]),r}(I),M=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=a.sent(),a.label=2;case 2:if(!r||"RIFF"!==(n=(0,T.readAscii)(r,4))&&"RIFX"!==n&&"RF64"!==n)return[2,!1];return r.skip(4),[2,"WAVE"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,y.WaveDemuxer)(e)}},{key:"name",get:function(){return"WAVE"}},{key:"mimeType",get:function(){return"audio/wav"}}]),r}(I),D=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"OggS"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,_.OggDemuxer)(e)}},{key:"name",get:function(){return"Ogg"}},{key:"mimeType",get:function(){return"application/ogg"}}]),r}(I),F=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"fLaC"===(0,T.readAscii)(r,4)]}})})()}},{key:"name",get:function(){return"FLAC"}},{key:"mimeType",get:function(){return"audio/flac"}},{key:"_createDemuxer",value:function(e){return new(0,x.FlacDemuxer)(e)}}]),r}(I),R=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a;return(0,d._)(this,function(i){switch(i.label){case 0:if(!((r=e._reader.requestSliceRange(0,S.MIN_FRAME_HEADER_SIZE,S.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,r];case 1:r=i.sent(),i.label=2;case 2:if(!r||!(n=(0,S.readFrameHeader)(r)))return[2,!1];if(!((r=e._reader.requestSliceRange(n.frameLength,S.MIN_FRAME_HEADER_SIZE,S.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,4];return[4,r];case 3:r=i.sent(),i.label=4;case 4:if(!r||!(a=(0,S.readFrameHeader)(r)))return[2,!1];return[2,n.objectType===a.objectType&&n.samplingFrequencyIndex===a.samplingFrequencyIndex&&n.channelConfiguration===a.channelConfiguration]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,w.AdtsDemuxer)(e)}},{key:"name",get:function(){return"ADTS"}},{key:"mimeType",get:function(){return"audio/aac"}}]),r}(I),U=new j,O=new P,L=new C,N=new A,V=new B,z=new M,H=new D,G=new R,q=new F,W=[U,O,L,N,z,H,q,V,G]},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./isobmff/isobmff-demuxer.js":"1Dw1A","./matroska/ebml.js":"fq2QE","./matroska/matroska-demuxer.js":"kY1ME","./mp3/mp3-demuxer.js":"ifShX","../shared/mp3-misc.js":"gcure","./id3.js":"42Y2c","./mp3/mp3-reader.js":"gFWvE","./ogg/ogg-demuxer.js":"hRJRs","./wave/wave-demuxer.js":"cokSU","./adts/adts-reader.js":"5AUBv","./adts/adts-demuxer.js":"3t0bF","./reader.js":"8KRfO","./flac/flac-demuxer.js":"e0w8C","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1Dw1A":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"IsobmffDemuxer",function(){return I});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_sliced_to_array.cjs"),h=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),m=e("../codec.js"),g=e("../codec-data.js"),b=e("../demuxer.js"),k=e("../input-track.js"),_=e("../misc.js"),y=e("../packet.js"),S=e("./isobmff-misc.js"),w=e("./isobmff-reader.js"),T=e("../reader.js"),x=e("../metadata.js"),I=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).moovSlice=null,n.currentTrack=null,n.tracks=[],n.metadataPromise=null,n.movieTimescale=-1,n.movieDurationInTimescale=-1,n.isQuickTime=!1,n.metadataTags={},n.currentMetadataKeys=null,n.isFragmented=!1,n.fragmentTrackDefaults=[],n.currentFragment=null,n.lastReadFragment=null,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r;return(0,p._)(this,function(n){switch(n.label){case 0:return[4,this.getTracks()];case 1:return[4,Promise.all(n.sent().map(function(e){return e.computeDuration()}))];case 2:return r=n.sent(),[2,(e=Math).max.apply(e,[0].concat((0,h._)(r)))]}})}).call(this)}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks.map(function(e){return e.inputTrack})]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){var e;return(0,p._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),[4,Promise.all(this.tracks.map(function(e){return e.inputTrack.getCodecParameterString()}))];case 2:return e=r.sent(),[2,(0,S.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(function(e){var r;return(null==(r=e.info)?void 0:r.type)==="video"}),hasAudio:this.tracks.some(function(e){var r;return(null==(r=e.info)?void 0:r.type)==="audio"}),codecStrings:e.filter(Boolean)})]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.metadataTags]}})}).call(this)}},{key:"readMetadata",value:function(){var e;return null!=(e=this.metadataPromise)?e:this.metadataPromise=(0,s._)(function(){var e,r,n,a,i,s,o,c,u,l,d,f,h,m,g,b,k,y,S;return(0,p._)(this,function(p){switch(p.label){case 0:e=0,p.label=1;case 1:if(!((r=this.reader.requestSliceRange(e,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,r];case 2:r=p.sent(),p.label=3;case 3:if(!r||(n=e,!(a=(0,w.readBoxHeader)(r))))return[3,8];if("ftyp"!==a.name)return[3,4];return i=(0,T.readAscii)(r,4),this.isQuickTime="qt "===i,[3,7];case 4:if("moov"!==a.name)return[3,7];if(!((s=this.reader.requestSlice(r.filePos,a.contentSize))instanceof Promise))return[3,6];return[4,s];case 5:s=p.sent(),p.label=6;case 6:if(!s)return[3,8];this.moovSlice=s,this.readContiguousBoxes(this.moovSlice),this.tracks.sort(function(e,r){return Number(r.disposition.default)-Number(e.disposition.default)}),o=!0,c=!1,u=void 0;try{for(l=this.tracks[Symbol.iterator]();!(o=(d=l.next()).done);o=!0)h=(f=d.value).editListPreviousSegmentDurations/this.movieTimescale,f.editListOffset-=Math.round(h*f.timescale)}catch(e){c=!0,u=e}finally{try{o||null==l.return||l.return()}finally{if(c)throw u}}return[3,8];case 7:return e=n+a.totalSize,[3,1];case 8:if(!(this.isFragmented&&null!==this.reader.fileSize))return[3,15];if(!((m=this.reader.requestSlice(this.reader.fileSize-4,4))instanceof Promise))return[3,10];return[4,m];case 9:m=p.sent(),p.label=10;case 10:if((0,_.assert)(m),g=(0,T.readU32Be)(m),!((b=this.reader.fileSize-g)>=0&&b<=this.reader.fileSize-w.MAX_BOX_HEADER_SIZE))return[3,15];if(!((k=this.reader.requestSliceRange(b,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,12];return[4,k];case 11:k=p.sent(),p.label=12;case 12:if(!k||!((y=(0,w.readBoxHeader)(k))&&"mfra"===y.name))return[3,15];if(!((S=this.reader.requestSlice(k.filePos,y.contentSize))instanceof Promise))return[3,14];return[4,S];case 13:S=p.sent(),p.label=14;case 14:S&&this.readContiguousBoxes(S),p.label=15;case 15:return[2]}})}).call(this)}},{key:"getSampleTableForTrack",value:function(e){if(e.sampleTable)return e.sampleTable;var r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,_.assert)(this.moovSlice);var n=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(n),this.currentTrack=null,(null==(a=e.info)?void 0:a.type)==="audio"&&e.info.codec&&m.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,_.assert)((null==(i=e.info)?void 0:i.type)==="audio");for(var a,i,s=(0,m.parsePcmCodec)(e.info.codec),o=[],c=[],u=0;u0){r.presentationTimestamps=[];var E=!0,j=!1,P=void 0;try{for(var C,A=r.sampleTimingEntries[Symbol.iterator]();!(E=(C=A.next()).done);E=!0)for(var B=C.value,M=0;M0){M.languageCode="";for(var O=0;O<3;O++)M.languageCode=String.fromCharCode(96+(31&U))+M.languageCode,U>>=5;(0,_.isIso639Dash2LanguageCode)(M.languageCode)||(M.languageCode=_.UNDETERMINED_LANGUAGE)}break;case"hdlr":var L=this.currentTrack;if(!L)break;e.skip(8);var N=(0,T.readAscii)(e,4);"vide"===N?L.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===N&&(L.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null});break;case"stbl":var V=this.currentTrack;if(!V)break;V.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(a,n.contentSize));break;case"stsd":var z=this.currentTrack;if(!z||null===z.info||z.sampleTable)break;var H=(0,T.readU8)(e);e.skip(3);for(var G=(0,T.readU32Be)(e),q=0;q0){if(1===Q)e.skip(4),Y=8*(0,T.readU32Be)(e),e.skip(8);else if(2===Q){e.skip(4),J=(0,T.readF64Be)(e),Z=(0,T.readU32Be)(e),e.skip(4),Y=(0,T.readU32Be)(e);var $=(0,T.readU32Be)(e);if(e.skip(8),"lpcm"===X){var ee=Y+7>>3,et=!!(1&$),er=!!(2&$),en=4&$?-1:0;Y>0&&Y<=64&&(et?32===Y&&(z.info.codec=er?"pcm-f32be":"pcm-f32"):en&1<>4,chromaSubsampling:el>>1&7,videoFullRangeFlag:1&el,colourPrimaries:ed,transferCharacteristics:ef,matrixCoefficients:eh};break;case"av1C":var ep,em=this.currentTrack;if(!em)break;(0,_.assert)((null==(ep=em.info)?void 0:ep.type)==="video"),e.skip(1);var eg=(0,T.readU8)(e),ev=eg>>5,eb=(0,T.readU8)(e),ek=eb>>6&1;em.info.av1CodecInfo={profile:ev,level:31&eg,tier:eb>>7,bitDepth:2===ev&&ek?eb>>5&1?12:10:ek?10:8,monochrome:eb>>4&1,chromaSubsamplingX:eb>>3&1,chromaSubsamplingY:eb>>2&1,chromaSamplePosition:3&eb};break;case"colr":var e_,ey=this.currentTrack;if(!ey||((0,_.assert)((null==(e_=ey.info)?void 0:e_.type)==="video"),"nclx"!==(0,T.readAscii)(e,4)))break;var eS=(0,T.readU16Be)(e),ew=(0,T.readU16Be)(e),eT=(0,T.readU16Be)(e),ex=!!(128&(0,T.readU8)(e));ey.info.colorSpace={primaries:_.COLOR_PRIMARIES_MAP_INVERSE[eS],transfer:_.TRANSFER_CHARACTERISTICS_MAP_INVERSE[ew],matrix:_.MATRIX_COEFFICIENTS_MAP_INVERSE[eT],fullRange:ex};break;case"esds":var eI,eE=this.currentTrack;if(!eE)break;(0,_.assert)((null==(eI=eE.info)?void 0:eI.type)==="audio"),e.skip(4);var ej=(0,T.readU8)(e);(0,_.assert)(3===ej),(0,w.readIsomVariableInteger)(e),e.skip(2);var eP=(0,T.readU8)(e);if((128&eP)!=0&&e.skip(2),(64&eP)!=0){var eC=(0,T.readU8)(e);e.skip(eC)}(32&eP)!=0&&e.skip(2);var eA=(0,T.readU8)(e);(0,_.assert)(4===eA);var eB=(0,w.readIsomVariableInteger)(e),eM=e.filePos,eD=(0,T.readU8)(e);if(64===eD||103===eD?(eE.info.codec="aac",eE.info.aacCodecInfo={isMpeg2:103===eD}):105===eD||107===eD?eE.info.codec="mp3":221===eD?eE.info.codec="vorbis":console.warn("Unsupported audio codec (objectTypeIndication ".concat(eD,") - discarding track.")),e.skip(12),eB>e.filePos-eM){var eF=(0,T.readU8)(e);(0,_.assert)(5===eF);var eR=(0,w.readIsomVariableInteger)(e);if(eE.info.codecDescription=(0,T.readBytes)(e,eR),"aac"===eE.info.codec){var eU=(0,m.parseAacAudioSpecificConfig)(eE.info.codecDescription);null!==eU.numberOfChannels&&(eE.info.numberOfChannels=eU.numberOfChannels),null!==eU.sampleRate&&(eE.info.sampleRate=eU.sampleRate)}}break;case"enda":var eO,eL=this.currentTrack;if(!eL)break;(0,_.assert)((null==(eO=eL.info)?void 0:eO.type)==="audio"),255&(0,T.readU16Be)(e)&&("pcm-s16be"===eL.info.codec?eL.info.codec="pcm-s16":"pcm-s24be"===eL.info.codec?eL.info.codec="pcm-s24":"pcm-s32be"===eL.info.codec?eL.info.codec="pcm-s32":"pcm-f32be"===eL.info.codec?eL.info.codec="pcm-f32":"pcm-f64be"===eL.info.codec&&(eL.info.codec="pcm-f64"));break;case"pcmC":var eN,eV=this.currentTrack;if(!eV)break;(0,_.assert)((null==(eN=eV.info)?void 0:eN.type)==="audio"),e.skip(4);var ez=!!(1&(0,T.readU8)(e)),eH=(0,T.readU8)(e);"pcm-s16be"===eV.info.codec?ez?16===eH?eV.info.codec="pcm-s16":24===eH?eV.info.codec="pcm-s24":32===eH?eV.info.codec="pcm-s32":(console.warn("Invalid ipcm sample size ".concat(eH,".")),eV.info.codec=null):16===eH?eV.info.codec="pcm-s16be":24===eH?eV.info.codec="pcm-s24be":32===eH?eV.info.codec="pcm-s32be":(console.warn("Invalid ipcm sample size ".concat(eH,".")),eV.info.codec=null):"pcm-f32be"===eV.info.codec&&(ez?32===eH?eV.info.codec="pcm-f32":64===eH?eV.info.codec="pcm-f64":(console.warn("Invalid fpcm sample size ".concat(eH,".")),eV.info.codec=null):32===eH?eV.info.codec="pcm-f32be":64===eH?eV.info.codec="pcm-f64be":(console.warn("Invalid fpcm sample size ".concat(eH,".")),eV.info.codec=null));break;case"dOps":var eG,eq,eW=this.currentTrack;if(!eW)break;(0,_.assert)((null==(eG=eW.info)?void 0:eG.type)==="audio"),e.skip(1);var eK=(0,T.readU8)(e),eX=(0,T.readU16Be)(e),eQ=(0,T.readU32Be)(e),eZ=(0,T.readI16Be)(e),eY=(0,T.readU8)(e);eq=0!==eY?(0,T.readBytes)(e,2+eK):new Uint8Array(0);var eJ=new Uint8Array(19+eq.byteLength),e$=new DataView(eJ.buffer);e$.setUint32(0,0x4f707573,!1),e$.setUint32(4,0x48656164,!1),e$.setUint8(8,1),e$.setUint8(9,eK),e$.setUint16(10,eX,!0),e$.setUint32(12,eQ,!0),e$.setInt16(16,eZ,!0),e$.setUint8(18,eY),eJ.set(eq,19),eW.info.codecDescription=eJ,eW.info.numberOfChannels=eK;break;case"dfLa":var e0,e1=this.currentTrack;if(!e1)break;(0,_.assert)((null==(e0=e1.info)?void 0:e0.type)==="audio"),e.skip(4);for(var e2=e.filePos;e.filePos>>12,e5=(e8>>9&7)+1;e1.info.sampleRate=e6,e1.info.numberOfChannels=e5,e.skip(20)}else e.skip(e4);if(128&e3)break}var e7=e.filePos;e.filePos=e2;var e9=(0,T.readBytes)(e,e7-e2),te=new Uint8Array(4+e9.byteLength);new DataView(te.buffer).setUint32(0,0x664c6143,!1),te.set(e9,4),e1.info.codecDescription=te;break;case"stts":var tt=this.currentTrack;if(!tt||!tt.sampleTable)break;e.skip(4);for(var tr=(0,T.readU32Be)(e),tn=0,ta=0,ti=0;ti>4],t8=t3[(12&t2)>>2],t6=t3[3&t2],t5=(0,T.readU32Be)(e),t7=0;t70&&(null!=(nD=this.metadataTags).trackNumber||(nD.trackNumber=nU)),nO&&Number.isInteger(nO)&&nO>0&&(null!=(nF=this.metadataTags).tracksTotal||(nF.tracksTotal=nO))}break;case"trkn":if(nb instanceof Uint8Array&&nb.length>=6){var nL,nN,nV=(0,_.toDataView)(nb),nz=nV.getUint16(2,!1),nH=nV.getUint16(4,!1);nz>0&&(null!=(nL=this.metadataTags).trackNumber||(nL.trackNumber=nz)),nH>0&&(null!=(nN=this.metadataTags).tracksTotal||(nN.tracksTotal=nH))}break;case"disc":case"disk":if(nb instanceof Uint8Array&&nb.length>=6){var nG,nq,nW=(0,_.toDataView)(nb),nK=nW.getUint16(2,!1),nX=nW.getUint16(4,!1);nK>0&&(null!=(nG=this.metadataTags).discNumber||(nG.discNumber=nK)),nX>0&&(null!=(nq=this.metadataTags).discsTotal||(nq.discsTotal=nX))}}}}catch(e){nu=!0,nl=e}finally{try{nc||null==nf.return||nf.return()}finally{if(nu)throw nl}}}return e.filePos=i,!0}}]),r}(b.Demuxer),E=function(){"use strict";function e(r){(0,c._)(this,e),this.internalTrack=r,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}return(0,u._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.internalCodecId}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getTimeResolution",value:function(){return this.internalTrack.timescale}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,p._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){var e,r;return(0,p._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){var r,n;return(0,p._)(this,function(a){switch(a.label){case 0:return r=this,[4,this.fetchPacketForSampleIndex(0,e)];case 1:if((n=a.sent())||!this.internalTrack.demuxer.isFragmented)return[2,n];return[2,this.performFragmentedLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,e)]}})}).call(this)}},{key:"mapTimestampIntoTimescale",value:function(e){return(0,_.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,p._)(this,function(c){switch(c.label){case 0:return n=this,a=this.mapTimestampIntoTimescale(e),s=C(i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a),[4,this.fetchPacketForSampleIndex(s,r)];case 1:if(o=c.sent(),!R(i)||!this.internalTrack.demuxer.isFragmented)return[2,o];return[2,this.performFragmentedLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};var i=(0,_.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.presentationTimestamp});return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&as.sampleIndex});if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{var a=e.trackData.get(n.internalTrack.id);if(a&&null!==a.firstKeyFrameTimestamp){var i=a.samples.findIndex(function(e){return e.isKeyFrame});return(0,_.assert)(-1!==i),{sampleIndex:i,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketForSampleIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c;return(0,p._)(this,function(u){switch(u.label){case 0:if(-1===e||!(n=B(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e)))return[2,null];if(!r.metadataOnly)return[3,1];return a=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.internalTrack.demuxer.reader.requestSlice(n.sampleOffset,n.sampleSize))instanceof Promise))return[3,3];return[4,i];case 2:i=u.sent(),u.label=3;case 3:(0,_.assert)(i),a=(0,T.readBytes)(i,n.sampleSize),u.label=4;case 4:return s=(n.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=n.duration/this.internalTrack.timescale,c=new(0,y.EncodedPacket)(a,n.isKeyFrame?"key":"delta",s,o,e,n.sampleSize),this.packetToSampleIndex.set(c,e),[2,c]}})}).call(this)}},{key:"fetchPacketInFragment",value:function(e,r,n){return(0,s._)(function(){var a,i,s,o,c,u;return(0,p._)(this,function(l){switch(l.label){case 0:if(-1===r)return[2,null];if(a=e.trackData.get(this.internalTrack.id).samples[r],(0,_.assert)(a),!n.metadataOnly)return[3,1];return i=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((s=this.internalTrack.demuxer.reader.requestSlice(a.byteOffset,a.byteSize))instanceof Promise))return[3,3];return[4,s];case 2:s=l.sent(),l.label=3;case 3:(0,_.assert)(s),i=(0,T.readBytes)(s,a.byteSize),l.label=4;case 4:return o=(a.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,c=a.duration/this.internalTrack.timescale,u=new(0,y.EncodedPacket)(i,a.isKeyFrame?"key":"delta",o,c,e.moofOffset+r,a.byteSize),this.packetToFragmentLocation.set(u,{fragment:e,sampleIndex:r}),[2,u]}})}).call(this)}},{key:"performFragmentedLookup",value:function(e,r,n,a,i){return(0,s._)(function(){var s,o,c,u,l,d,f,h,m,g,b,k,y,S,T,x,I,E,j,P,C,A,B;return(0,p._)(this,function(p){switch(p.label){case 0:if(s=this.internalTrack.demuxer,o=null,c=null,u=-1,e){if(d=(l=r(e)).sampleIndex,l.correctSampleFound)return[2,this.fetchPacketInFragment(e,d,i)];-1!==d&&(c=e,u=d)}h=-1!==(f=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,n,function(e){return e.timestamp}))?this.internalTrack.fragmentLookupTable[f]:null,g=-1!==(m=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.fragmentPositionCache[m]:null,y=Math.max(null!=(b=null==h?void 0:h.moofOffset)?b:0,null!=(k=null==g?void 0:g.moofOffset)?k:0)||null,e?null===y||e.moofOffset>=y?(S=e.moofOffset+e.moofSize,o=e):S=y:S=null!=y?y:0,p.label=1;case 1:if(o&&(T=o.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,6];if(!((x=s.reader.requestSliceRange(S,w.MIN_BOX_HEADER_SIZE,w.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=p.sent(),p.label=3;case 3:if(!x||(I=S,!(E=(0,w.readBoxHeader)(x))))return[3,6];if("moof"!==E.name)return[3,5];return[4,s.readFragment(I)];case 4:if(P=(j=r(o=p.sent())).sampleIndex,j.correctSampleFound)return[2,this.fetchPacketInFragment(o,P,i)];-1!==P&&(c=o,u=P),p.label=5;case 5:return S=I+E.totalSize,[3,1];case 6:if(h&&(!c||c.moofOffset=0;a--){var i=e.presentationTimestamps[a].sampleIndex;if(-1!==(0,_.binarySearchExact)(e.keySampleIndices,i,function(e){return e}))return i}return -1}var s,o=C(e,r),c=(0,_.binarySearchLessOrEqual)(e.keySampleIndices,o,function(e){return e});return null!=(s=e.keySampleIndices[c])?s:-1},B=function(e,r){var n=(0,_.binarySearchLessOrEqual)(e.sampleTimingEntries,r,function(e){return e.startIndex}),a=e.sampleTimingEntries[n];if(!a||a.startIndex+a.count<=r)return null;var i=a.startDecodeTimestamp+(r-a.startIndex)*a.delta,s=(0,_.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,function(e){return e.startIndex}),o=e.sampleCompositionTimeOffsets[s];o&&r-o.startIndex0&&a>n){var o=e.subarray(n,a);o.length>0&&r.push(o)}n=a+i}if(n0&&r.push(c)}return r},b=function(e,r){for(var n=[],a=0,i=new DataView(e.buffer,e.byteOffset,e.byteLength);a+r<=e.length;){var s=void 0;1===r?s=i.getUint8(a):2===r?s=i.getUint16(a,!1):3===r?s=(0,m.getUint24)(i,a,!1):4===r?s=i.getUint32(a,!1):((0,m.assertNever)(r),(0,m.assert)(!1)),a+=r;var o=e.subarray(a,a+s);n.push(o),a+=s}return n},k=function(e){for(var r=[],n=e.length,a=0;a>8),r.push(255&u);for(var l=0;l>8),r.push(255&k);for(var _=0;_>8),r.push(255&E);for(var j=0;j>1&63},P=function(e){try{var r=g(e),n=r.filter(function(e){return j(e)===u.VPS_NUT}),a=r.filter(function(e){return j(e)===u.SPS_NUT}),i=r.filter(function(e){return j(e)===u.PPS_NUT}),s=r.filter(function(e){return j(e)===u.PREFIX_SEI_NUT||j(e)===u.SUFFIX_SEI_NUT});if(0===a.length||0===i.length)return null;var o=a[0],c=new(0,m.Bitstream)(k(o));c.skipBits(16),c.readBits(4);var l=c.readBits(3),d=c.readBits(1),h=C(c,l),p=h.general_profile_space,b=h.general_tier_flag,_=h.general_profile_idc,y=h.general_profile_compatibility_flags,S=h.general_constraint_indicator_flags,w=h.general_level_idc;(0,m.readExpGolomb)(c);var T=(0,m.readExpGolomb)(c);3===T&&c.skipBits(1),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.readBits(1)&&((0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c));var x=(0,m.readExpGolomb)(c),I=(0,m.readExpGolomb)(c);(0,m.readExpGolomb)(c);for(var E=c.readBits(1)?0:l,P=E;P<=l;P++)(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c);(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.readBits(1)&&c.readBits(1)&&A(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&(c.skipBits(4),c.skipBits(4),(0,m.readExpGolomb)(c),(0,m.readExpGolomb)(c),c.skipBits(1));var M=(0,m.readExpGolomb)(c);if(B(c,M),c.readBits(1))for(var F=(0,m.readExpGolomb)(c),R=0;R0){var L=i[0],N=new(0,m.Bitstream)(k(L));N.skipBits(16),(0,m.readExpGolomb)(N),(0,m.readExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(3),N.skipBits(1),N.skipBits(1),(0,m.readExpGolomb)(N),(0,m.readExpGolomb)(N),(0,m.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.readBits(1)&&(0,m.readExpGolomb)(N),(0,m.readSignedExpGolomb)(N),(0,m.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(1),N.skipBits(1);var V=N.readBits(1),z=N.readBits(1);O=V||z?V&&!z?2:!V&&z?3:0:0}var H=(0,f._)(n.length?[{arrayCompleteness:1,nalUnitType:u.VPS_NUT,nalUnits:n}]:[]).concat((0,f._)(a.length?[{arrayCompleteness:1,nalUnitType:u.SPS_NUT,nalUnits:a}]:[]),(0,f._)(i.length?[{arrayCompleteness:1,nalUnitType:u.PPS_NUT,nalUnits:i}]:[]),(0,f._)(s.length?[{arrayCompleteness:1,nalUnitType:j(s[0]),nalUnits:s}]:[]));return{configurationVersion:1,generalProfileSpace:p,generalTierFlag:b,generalProfileIdc:_,generalProfileCompatibilityFlags:y,generalConstraintIndicatorFlags:S,generalLevelIdc:w,minSpatialSegmentationIdc:U,parallelismType:O,chromaFormatIdc:T,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:l+1,temporalIdNested:d,lengthSizeMinusOne:3,arrays:H}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},C=function(e,r){for(var n=e.readBits(2),a=e.readBits(1),i=e.readBits(5),s=0,o=0;o<32;o++)s=s<<1|e.readBits(1);for(var c=new Uint8Array(6),u=0;u<6;u++)c[u]=e.readBits(8);for(var l=e.readBits(8),d=[],f=[],h=0;h0)for(var p=r;p<8;p++)e.skipBits(2);for(var m=0;m1&&(0,m.readSignedExpGolomb)(e);for(var i=0;i>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push.apply(r,(0,f._)(e.generalConstraintIndicatorFlags)),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length);var n=!0,a=!1,i=void 0;try{for(var s,o=e.arrays[Symbol.iterator]();!(n=(s=o.next()).done);n=!0){var c=s.value;r.push((1&c.arrayCompleteness)<<7|63&c.nalUnitType),r.push(c.nalUnits.length>>8&255),r.push(255&c.nalUnits.length);var u=!0,l=!1,d=void 0;try{for(var h,p=c.nalUnits[Symbol.iterator]();!(u=(h=p.next()).done);u=!0){var m=h.value;r.push(m.length>>8&255),r.push(255&m.length);for(var g=0;g=2&&(i=r.readBits(1)?12:10);var s=r.readBits(3),o=0,c=0;if(7!==s)if(c=r.readBits(1),1===a||3===a){var u=r.readBits(1),l=r.readBits(1);o=u||l?u&&!l?2:1:3,r.skipBits(1)}else o=1;else o=3,c=1;var d=(r.readBits(16)+1)*(r.readBits(16)+1),f=(0,m.last)(p.VP9_LEVEL_TABLE).level,h=!0,g=!1,b=void 0;try{for(var k,_=p.VP9_LEVEL_TABLE[Symbol.iterator]();!(h=(k=_.next()).done);h=!0){var y=k.value;if(d<=y.maxPictureSize){f=y.level;break}}}catch(e){g=!0,b=e}finally{try{h||null==_.return||_.return()}finally{if(g)throw b}}return{profile:a,level:f,bitDepth:i,chromaSubsampling:o,videoFullRangeFlag:c,colourPrimaries:2===s?1:1===s?6:2,transferCharacteristics:2===s?1:1===s?6:2,matrixCoefficients:7===s?0:2===s?1:1===s?6:2}},L=function(e){var r,n,a,i,s,o,c;return(0,h._)(this,function(u){switch(u.label){case 0:r=new(0,m.Bitstream)(e),n=function(){for(var e=0,n=0;n<8;n++){var a=r.readAlignedByte();if(e|=(127&a)<<7*n,!(128&a))break;if(7===n&&128&a)return null}return e>=0xffffffff?null:e},u.label=1;case 1:if(!(r.getBitsLeft()>=8))return[3,3];if(r.skipBits(1),a=r.readBits(4),i=r.readBits(1),s=r.readBits(1),r.skipBits(1),i&&r.skipBits(8),o=void 0,s){if(null===(c=n()))return[2];o=c}else o=Math.floor(r.getBitsLeft()/8);return(0,m.assert)(r.pos%8==0),[4,{type:a,data:e.subarray(r.pos/8,r.pos/8+o)}];case 2:return u.sent(),r.skipBits(8*o),[3,1];case 3:return[2]}})},N=function(e){var r=!0,n=!1,a=void 0;try{for(var i,s=L(e)[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value,c=o.type,u=o.data;if(1===c){var l=new(0,m.Bitstream)(u),d=l.readBits(3);l.readBits(1);var f=l.readBits(1),h=0,p=0,g=0;if(f)h=l.readBits(5);else{if(l.readBits(1)&&(l.skipBits(32),l.skipBits(32),l.readBits(1)))return null;var b=l.readBits(1);b&&(g=l.readBits(5),l.skipBits(32),l.skipBits(5),l.skipBits(5));for(var k=l.readBits(5),_=0;_<=k;_++){l.skipBits(12);var y=l.readBits(5);if(0===_&&(h=y),y>7){var S=l.readBits(1);0===_&&(p=S)}if(b&&l.readBits(1)){var w=g+1;l.skipBits(w),l.skipBits(w),l.skipBits(1)}l.readBits(1)&&l.skipBits(4)}}var T=l.readBits(4),x=l.readBits(4),I=T+1;l.skipBits(I);var E=x+1;l.skipBits(E);if((f?0:l.readBits(1))&&(l.skipBits(4),l.skipBits(3)),l.skipBits(1),l.skipBits(1),l.skipBits(1),!f){l.skipBits(1),l.skipBits(1),l.skipBits(1),l.skipBits(1);var j=l.readBits(1);j&&(l.skipBits(1),l.skipBits(1));var P=l.readBits(1);(P?2:l.readBits(1))>0&&(l.readBits(1)||l.skipBits(1)),j&&l.skipBits(3)}l.skipBits(1),l.skipBits(1),l.skipBits(1);var C=l.readBits(1),A=8;2===d&&C?A=l.readBits(1)?12:10:d<=2&&(A=C?10:8);var B=0;1!==d&&(B=l.readBits(1));var M=1,D=1,F=0;return!B&&(0===d?(M=1,D=1):1===d?(M=0,D=0):12===A&&(M=l.readBits(1))&&(D=l.readBits(1)),M&&D&&(F=l.readBits(2))),{profile:d,level:h,tier:p,bitDepth:A,monochrome:B,chromaSubsamplingX:M,chromaSubsamplingY:D,chromaSamplePosition:F}}}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}return null},V=function(e){var r=(0,m.toDataView)(e),n=r.getUint8(9),a=r.getUint16(10,!0),i=r.getUint32(12,!0),s=r.getInt16(16,!0),o=r.getUint8(18),c=null;return o&&(c=e.subarray(19,21+n)),{outputChannelCount:n,preSkip:a,inputSampleRate:i,outputGain:s,channelMappingFamily:o,channelMappingTable:c}},z=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],H=function(e){return{durationInSamples:z[e[0]>>3]}},G=function(e){if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==(r=String).fromCharCode.apply(r,(0,f._)(e.slice(1,7))))throw Error("Invalid packet signature in Setup header.");for(var r,n=e.length,a=new Uint8Array(n),i=0;i97;)if(1===s.readBits(1)){o=s.pos;break}if(0===o)throw Error("Invalid Setup header: framing bit not found.");for(var c=0,u=!1,l=0;s.getBitsLeft()>=97;){var d=s.pos,h=s.readBits(8),p=s.readBits(16),g=s.readBits(16);if(h>63||0!==p||0!==g){s.pos=d;break}if(s.skipBits(1),++c>64)break;s.clone().readBits(6)+1===c&&(u=!0,l=c)}if(!u)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error("Unsupported mode count: ".concat(l,"."));var b=l;s.pos=0,s.skipBits(o);for(var k=Array(b).fill(0),_=b-1;_>=0;_--)s.skipBits(40),k[_]=s.readBits(1);return{modeBlockflags:k}},q=function(e,r,n){switch(e){case"avc":var a=y(n,r),i=a.some(function(e){return S(e)===c.IDR}),s=!0,o=!1,l=void 0;if(!i&&(!(0,m.isChromium)()||(0,m.getChromiumVersion)()>=144))try{for(var d,f=a[Symbol.iterator]();!(s=(d=f.next()).done);s=!0){var h=d.value;if(S(h)===c.SEI){var p=k(h),g=1;do{for(var b=0;;){var _=p[g++];if(void 0===_||(b+=_,_<255))break}for(var w=0;;){var T=p[g++];if(void 0===T||(w+=T,T<255))break}if(6===b){var x=new(0,m.Bitstream)(p);x.pos=8*g;var I=(0,m.readExpGolomb)(x),P=x.readBits(1);if(0===I&&1===P){i=!0;break}}g+=w}while(g0&&(null!=r.raw||(r.raw={}),null!=(g=r.raw)[b="vendor"]||(g[b]=s));var o=n.getUint32(a,!0);a+=4;for(var c=0;c0&&(null!=r.trackNumber||(r.trackNumber=y)),S&&Number.isInteger(S)&&S>0&&(null!=r.tracksTotal||(r.tracksTotal=S));break;case"TRACKTOTAL":var w=Number.parseInt(p,10);Number.isInteger(w)&&w>0&&(null!=r.tracksTotal||(r.tracksTotal=w));break;case"DISCNUMBER":var T=p.split("/"),x=Number.parseInt(T[0],10),I=T[1]&&Number.parseInt(T[1],10);Number.isInteger(x)&&x>0&&(null!=r.discNumber||(r.discNumber=x)),I&&Number.isInteger(I)&&I>0&&(null!=r.discsTotal||(r.discsTotal=I));break;case"DISCTOTAL":var E=Number.parseInt(p,10);Number.isInteger(E)&&E>0&&(null!=r.discsTotal||(r.discsTotal=E));break;case"DATE":var j=new Date(p);Number.isNaN(j.getTime())||null!=r.date||(r.date=j);break;case"GENRE":null!=r.genre||(r.genre=p);break;case"METADATA_BLOCK_PICTURE":var P,C=(0,m.base64ToBytes)(p),A=(0,m.toDataView)(C),B=A.getUint32(0,!1),M=A.getUint32(4,!1),D=(P=String).fromCharCode.apply(P,(0,f._)(C.subarray(8,8+M))),F=A.getUint32(8+M,!1),R=m.textDecoder.decode(C.subarray(12+M,12+M+F)),U=A.getUint32(M+F+28),O=C.subarray(M+F+32,M+F+32+U);null!=r.images||(r.images=[]),r.images.push({data:O,mimeType:D,kind:3===B?"coverFront":4===B?"coverBack":"unknown",name:void 0,description:R||void 0})}}}},K=function(e,r,n){var a=[e],i=m.textEncoder.encode("Mediabunny"),s=new Uint8Array(4+i.length),o=new DataView(s.buffer);o.setUint32(0,i.length,!0),s.set(i,4),a.push(s);var c=new Set,u=function(e,r){var n="".concat(e,"=").concat(r),i=m.textEncoder.encode(n);(o=new DataView((s=new Uint8Array(4+i.length)).buffer)).setUint32(0,i.length,!0),s.set(i,4),a.push(s),c.add(e)},l=!0,d=!1,f=void 0;try{for(var h,p=(0,m.keyValueIterator)(r)[Symbol.iterator]();!(l=(h=p.next()).done);l=!0){var g=h.value,b=g.key,k=g.value;switch(b){case"title":u("TITLE",k);break;case"description":u("DESCRIPTION",k);break;case"artist":u("ARTIST",k);break;case"album":u("ALBUM",k);break;case"albumArtist":u("ALBUMARTIST",k);break;case"genre":u("GENRE",k);break;case"date":var _,y,S,w=null!=(S=null==(_=r.raw)?void 0:_.DATE)?S:null==(y=r.raw)?void 0:y.date;u("DATE",w&&"string"==typeof w?w:k.toISOString().slice(0,10));break;case"comment":u("COMMENT",k);break;case"lyrics":u("LYRICS",k);break;case"trackNumber":u("TRACKNUMBER",k.toString());break;case"tracksTotal":u("TRACKTOTAL",k.toString());break;case"discNumber":u("DISCNUMBER",k.toString());break;case"discsTotal":u("DISCTOTAL",k.toString());break;case"images":if(!n)break;var T=!0,x=!1,I=void 0;try{for(var E,j=k[Symbol.iterator]();!(T=(E=j.next()).done);T=!0){for(var P,C=E.value,A="coverFront"===C.kind?3:4*("coverBack"===C.kind),B=new Uint8Array(C.mimeType.length),M=0;M0&&void 0!==b[0]?b[0]:1/0,r=new(0,m.EncodedPacketSink)(this),n=1/0,a=-1/0,i=0,o=0,c=!1,u=!1,f.label=1;case 1:f.trys.push([1,6,7,12]),d=(0,s._)(r.packets(void 0,void 0,{metadataOnly:!0})),f.label=2;case 2:return[4,d.next()];case 3:if(!(c=!(h=f.sent()).done)||(p=h.value,i>=e&&p.timestamp>=a))return[3,5];n=Math.min(n,p.timestamp),a=Math.max(a,p.timestamp+p.duration),i++,o+=p.byteLength,f.label=4;case 4:return c=!1,[3,2];case 5:return[3,12];case 6:return g=f.sent(),u=!0,l=g,[3,12];case 7:if(f.trys.push([7,,10,11]),!(c&&null!=d.return))return[3,9];return[4,d.return()];case 8:f.sent(),f.label=9;case 9:return[3,11];case 10:if(u)throw l;return[7];case 11:return[7];case 12:return[2,{packetCount:i,averagePacketRate:i?Number((i/(a-n)).toPrecision(16)):0,averageBitrate:i?Number((8*o/(a-n)).toPrecision(16)):0}]}})}).apply(this,arguments)}}]),e}(),_=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"video"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"codedWidth",get:function(){return this._backing.getCodedWidth()}},{key:"codedHeight",get:function(){return this._backing.getCodedHeight()}},{key:"rotation",get:function(){return this._backing.getRotation()}},{key:"displayWidth",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}},{key:"displayHeight",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}},{key:"getColorSpace",value:function(){return this._backing.getColorSpace()}},{key:"hasHighDynamicRange",value:function(){return(0,o._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this._backing.getColorSpace()];case 1:return[2,"bt2020"===(e=r.sent()).primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix]}})}).call(this)}},{key:"canBeTransparent",value:function(){return this._backing.canBeTransparent()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,,4]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),p.customVideoDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if("undefined"==typeof VideoDecoder)return[2,!1];return[4,VideoDecoder.isConfigSupported(e)];case 2:return[2,!0===n.sent().supported];case 3:return console.error("Error during decodability check:",n.sent()),[2,!1];case 4:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){var r;return(0,f._)(this,function(n){switch(n.label){case 0:if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return[2,null];return[4,this.getDecoderConfig()];case 1:return r=n.sent(),(0,g.assert)(r),[2,(0,h.determineVideoPacketType)(this.codec,r,e.data)]}})}).call(this)}}]),r}(k),y=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"audio"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"numberOfChannels",get:function(){return this._backing.getNumberOfChannels()}},{key:"sampleRate",get:function(){return this._backing.getSampleRate()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,5,,6]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),p.customAudioDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if(!e.codec.startsWith("pcm-"))return[3,2];return[2,!0];case 2:if("undefined"==typeof AudioDecoder)return[2,!1];return[4,AudioDecoder.isConfigSupported(e)];case 3:return[2,!0===n.sent().supported];case 4:return[3,6];case 5:return console.error("Error during decodability check:",n.sent()),[2,!1];case 6:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){return(0,f._)(this,function(r){if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?[2,null]:[2,"key"]})}).call(this)}}]),r}(k)},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./media-sink.js":"k0V9R","./misc.js":"j7iGm","./packet.js":"QfqGG","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hAl48:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"CustomVideoDecoder",function(){return c}),i.export(n,"CustomAudioDecoder",function(){return u}),i.export(n,"CustomVideoEncoder",function(){return l}),i.export(n,"CustomAudioEncoder",function(){return d}),i.export(n,"customVideoDecoders",function(){return f}),i.export(n,"customAudioDecoders",function(){return h}),i.export(n,"customVideoEncoders",function(){return p}),i.export(n,"customAudioEncoders",function(){return m}),i.export(n,"registerDecoder",function(){return g}),i.export(n,"registerEncoder",function(){return b});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),u=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),l=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),d=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),f=[],h=[],p=[],m=[],g=function(e){if(e.prototype instanceof c){if(f.includes(e))return void console.warn("Video decoder already registered.");f.push(e)}else if(e.prototype instanceof u){if(h.includes(e))return void console.warn("Audio decoder already registered.");h.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},b=function(e){if(e.prototype instanceof l){if(p.includes(e))return void console.warn("Video encoder already registered.");p.push(e)}else if(e.prototype instanceof d){if(m.includes(e))return void console.warn("Audio encoder already registered.");m.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],k0V9R:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"EncodedPacketSink",function(){return A}),i.export(n,"BaseMediaSampleSink",function(){return M}),i.export(n,"VideoSampleSink",function(){return U}),i.export(n,"CanvasSink",function(){return O}),i.export(n,"AudioSampleSink",function(){return V}),i.export(n,"AudioBufferSink",function(){return z});var s=e("@swc/helpers/cjs/_async_iterator.cjs"),o=e("@swc/helpers/cjs/_async_to_generator.cjs"),c=e("@swc/helpers/cjs/_call_super.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),p=e("@swc/helpers/cjs/_object_spread_props.cjs"),m=e("@swc/helpers/cjs/_sliced_to_array.cjs"),g=e("@swc/helpers/cjs/_type_of.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("./codec.js"),_=e("./codec-data.js"),y=e("./custom-coder.js"),S=e("./input.js"),w=e("./input-track.js"),T=e("./misc.js"),x=e("./packet.js"),I=e("./pcm.js"),E=e("./sample.js"),j=function(e){if(!e||(void 0===e?"undefined":(0,g._)(e))!=="object")throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},P=function(e){if(!(0,T.isNumber)(e))throw TypeError("timestamp must be a number.")},C=function(e,r,n){return n.verifyKeyPackets?r.then(function(r){return(0,o._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:if(!r||"delta"===r.type)return[2,r];return[4,e.determinePacketType(r)];case 1:return(n=a.sent())&&(r.type=n),[2,r]}})})()}):r},A=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof w.InputTrack))throw TypeError("track must be an InputTrack.");this._track=r}return(0,l._)(e,[{key:"getFirstPacket",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(j(e),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getFirstPacket(e),e)}},{key:"getPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(P(e),j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getPacket(e,r),r)}},{key:"getNextPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);return C(this._track,this._track._backing.getNextPacket(e,r),r)}},{key:"getKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},P(e),j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getKeyPacket(e,r)];return[4,this._track._backing.getKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getKeyPacket(n.timestamp-1/this._track.timeResolution,r)];return[2,n]}})}).apply(this,arguments)}},{key:"getNextKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,S.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getNextKeyPacket(e,r)];return[4,this._track._backing.getNextKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getNextKeyPacket(n,r)];return[2,n]}})}).apply(this,arguments)}},{key:"packets",value:function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(void 0!==e&&!(e instanceof x.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!(null==n?void 0:n.metadataOnly))throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof x.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(j(n),this._track.input._disposed)throw new(0,S.InputDisposedError);var a=[],i=(0,T.promiseWithResolvers)(),s=i.promise,c=i.resolve,u=(0,T.promiseWithResolvers)(),l=u.promise,f=u.resolve,h=!1,p=!1,m=null,g=[];(0,o._)(function(){var i,o,u,d;return(0,b._)(this,function(m){switch(m.label){case 0:if(null==e)return[3,1];return o=e,[3,3];case 1:return[4,this.getFirstPacket(n)];case 2:o=m.sent(),m.label=3;case 3:i=o,m.label=4;case 4:if(!(i&&!p&&!this._track.input._disposed)||r&&i.sequenceNumber>=(null==r?void 0:r.sequenceNumber))return[3,8];if(!(a.length>Math.max(2,g.length)))return[3,6];return l=(u=(0,T.promiseWithResolvers)()).promise,f=u.resolve,[4,l];case 5:return m.sent(),[3,4];case 6:return a.push(i),c(),s=(d=(0,T.promiseWithResolvers)()).promise,c=d.resolve,[4,this.getNextPacket(i,n)];case 7:return i=m.sent(),[3,4];case 8:return h=!0,c(),[2]}})}).call(this).catch(function(e){m||(m=e,c())});var k=this._track;return(0,d._)({next:function(){return(0,o._)(function(){var e,r;return(0,b._)(this,function(n){switch(n.label){case 0:if(!k.input._disposed)return[3,1];throw new(0,S.InputDisposedError);case 1:if(!p)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!m)return[3,3];throw m;case 3:if(!(a.length>0))return[3,4];for(e=a.shift(),r=performance.now(),g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return f(),[2,{value:e,done:!1}];case 4:if(!h)return[3,5];return[2,{value:void 0,done:!0}];case 5:return[4,s];case 6:n.sent(),n.label=7;case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return p=!0,f(),c(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),B=function e(r,n){"use strict";(0,u._)(this,e),this.onSample=r,this.onError=n},M=function(){"use strict";function e(){(0,u._)(this,e)}return(0,l._)(e,[{key:"mediaSamplesInRange",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;P(e),P(r);var n=[],a=!1,i=null,s=(0,T.promiseWithResolvers)(),c=s.promise,u=s.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,p=!1,m=!1,g=!1,k=null;(0,o._)(function(){var s,o,l,d,_,y,S,w,x,I,E,j,P,C,A,B;return(0,b._)(this,function(b){switch(b.label){case 0:return s=Error(),[4,this._createDecoder(function(s){if(h(),s.timestamp>=r&&(m=!0),m)return void s.close();if(i&&(s.timestamp>e?(n.push(i),a=!0):i.close()),s.timestamp>=e&&(n.push(s),a=!0),i=a?null:s,n.length>0){var o;u(),c=(o=(0,T.promiseWithResolvers)()).promise,u=o.resolve}},function(e){k||(e.stack=s.stack,k=e,u())})];case 1:return o=b.sent(),[4,(l=this._createPacketSink()).getKeyPacket(e,{verifyKeyPackets:!0})];case 2:if(null==(d=b.sent()))return[3,3];return y=d,[3,5];case 3:return[4,l.getFirstPacket()];case 4:y=b.sent(),b.label=5;case 5:if(S=_=y,w=void 0,!(r<1/0))return[3,12];return[4,l.getPacket(r)];case 6:if(x=b.sent())return[3,7];return E=null,[3,11];case 7:if("key"!==x.type||x.timestamp!==r)return[3,8];return j=x,[3,10];case 8:return[4,l.getNextKeyPacket(x,{verifyKeyPackets:!0})];case 9:j=b.sent(),b.label=10;case 10:E=j,b.label=11;case 11:(I=E)&&(w=I),b.label=12;case 12:return[4,(P=l.packets(null!=_?_:void 0,w)).next()];case 13:b.sent(),b.label=14;case 14:if(!(S&&!m&&!this._track.input._disposed))return[3,18];if(C=D(n.length),!(n.length+o.getDecodeQueueSize()>C))return[3,16];return f=(A=(0,T.promiseWithResolvers)()).promise,h=A.resolve,[4,f];case 15:return b.sent(),[3,14];case 16:return o.decode(S),[4,P.next()];case 17:if((B=b.sent()).done)return[3,18];return S=B.value,[3,14];case 18:return[4,P.return()];case 19:if(b.sent(),!(!g&&!this._track.input._disposed))return[3,21];return[4,o.flush()];case 20:b.sent(),b.label=21;case 21:return o.close(),!a&&i&&n.push(i),p=!0,u(),[2]}})}).call(this).catch(function(e){k||(k=e,u())});var _=this._track,y=function(){null==i||i.close();var e=!0,r=!1,a=void 0;try{for(var s,o=n[Symbol.iterator]();!(e=(s=o.next()).done);e=!0)s.value.close()}catch(e){r=!0,a=e}finally{try{e||null==o.return||o.return()}finally{if(r)throw a}}};return(0,d._)({next:function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:if(!_.input._disposed)return[3,1];throw y(),new(0,S.InputDisposedError);case 1:if(!g)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!k)return[3,3];throw y(),k;case 3:if(!(n.length>0))return[3,4];return e=n.shift(),h(),[2,{value:e,done:!1}];case 4:if(p)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return g=!0,m=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}},{key:"mediaSamplesAtTimestamps",value:function(e){(0,T.validateAnyIterable)(e);var r=(0,T.toAsyncIterator)(e),n=[],a=[],i=(0,T.promiseWithResolvers)(),c=i.promise,u=i.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,p=!1,m=!1,g=null,k=function(e){var r;a.push(e),u(),c=(r=(0,T.promiseWithResolvers)()).promise,u=r.resolve};(0,o._)(function(){var e,i,c,l,d,_,y,S,w,x,I,E,j,C,A,B,M,F;return(0,b._)(this,function(R){switch(R.label){case 0:return e=Error(),[4,this._createDecoder(function(e){if(h(),m)return void e.close();for(var r=0;n.length>0&&e.timestamp-n[0]>-1e-10;)r++,n.shift();if(r>0)for(var a=0;ar&&!m))return[3,4];return f=(n=(0,T.promiseWithResolvers)()).promise,h=n.resolve,[4,f];case 3:return o.sent(),[3,2];case 4:if(m)return[3,6];return[4,c.getNextPacket(e)];case 5:return s=o.sent(),(0,T.assert)(s),i.decode(s),e=s,[3,1];case 6:return _=-1,[2]}})})()},S=function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:return[4,i.flush()];case 1:for(r.sent(),e=0;e0))return[3,4];return e=a.shift(),(0,T.assert)(void 0!==e),h(),[2,{value:e,done:!1}];case 4:if(p)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return m=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),D=function(e){return 0===e?40:8},F=function(e){"use strict";function r(e,n,a,i,s,o){(0,u._)(this,r),(l=(0,c._)(this,r,[e,n])).codec=a,l.decoderConfig=i,l.rotation=s,l.timeResolution=o,l.decoder=null,l.customDecoder=null,l.customDecoderCallSerializer=new(0,T.CallSerializer),l.customDecoderQueueSize=0,l.inputTimestamps=[],l.sampleQueue=[],l.currentPacketIndex=0,l.raslSkipped=!1,l.alphaDecoder=null,l.alphaHadKeyframe=!1,l.colorQueue=[],l.alphaQueue=[],l.merger=null,l.mergerCreationFailed=!1,l.decodedAlphaChunkCount=0,l.alphaDecoderQueueSize=0,l.nullAlphaFrameQueue=[],l.currentAlphaPacketIndex=0,l.alphaRaslSkipped=!1;var l,d=y.customVideoDecoders.find(function(e){return e.supports(a,i)});if(d)l.customDecoder=new d,l.customDecoder.codec=a,l.customDecoder.config=i,l.customDecoder.onSample=function(e){if(!(e instanceof E.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");l.finalizeAndEmitSample(e)},l.customDecoderCallSerializer.call(function(){return l.customDecoder.init()});else{var f=function(e){if(l.alphaQueue.length>0){var r=l.alphaQueue.shift();(0,T.assert)(void 0!==r),l.mergeAlpha(e,r)}else l.colorQueue.push(e)};if("avc"===a&&l.decoderConfig.description&&(0,T.isChromium)()){var m=(0,_.deserializeAvcDecoderConfigurationRecord)((0,T.toUint8Array)(l.decoderConfig.description));if(m&&m.sequenceParameterSets.length>0){var g=(0,_.parseAvcSps)(m.sequenceParameterSets[0]);g&&0===g.frameMbsOnlyFlag&&(l.decoderConfig=(0,p._)((0,h._)({},l.decoderConfig),{hardwareAcceleration:"prefer-software"}))}}l.decoder=new VideoDecoder({output:function(e){try{f(e)}catch(e){l.onError(e)}},error:n}),l.decoder.configure(l.decoderConfig)}return l}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){var e,r;return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,null!=(r=null==(e=this.alphaDecoder)?void 0:e.decodeQueueSize)?r:0))}},{key:"decode",value:function(e){var r=this;if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),(0,T.isWebKit)()||(0,T.insertSorted)(this.inputTimestamps,e.timestamp,function(e){return e}),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}},{key:"decodeAlphaData",value:function(e){var r=this;if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new R}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){var n=function(e){if(r.alphaDecoderQueueSize--,r.colorQueue.length>0){var n=r.colorQueue.shift();(0,T.assert)(void 0!==n),r.mergeAlpha(n,e)}else r.alphaQueue.push(e);for(r.decodedAlphaChunkCount++;r.nullAlphaFrameQueue.length>0&&r.nullAlphaFrameQueue[0]===r.decodedAlphaChunkCount;)if(r.nullAlphaFrameQueue.shift(),r.colorQueue.length>0){var a=r.colorQueue.shift();(0,T.assert)(void 0!==a),r.mergeAlpha(a,null)}else r.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:function(e){try{n(e)}catch(e){r.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}var a=(0,_.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===a),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(null!=a?a:e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}},{key:"pushNullAlphaFrame",value:function(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}},{key:"hasHevcRaslPicture",value:function(e){return(0,_.extractHevcNalUnits)(e,this.decoderConfig).some(function(e){var r=(0,_.extractNalUnitTypeForHevc)(e);return r===_.HevcNalUnitType.RASL_N||r===_.HevcNalUnitType.RASL_R})}},{key:"sampleHandler",value:function(e){if((0,T.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,T.last)(this.sampleQueue).timestamp){var r=!0,n=!1,a=void 0;try{for(var i,s=this.sampleQueue[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.finalizeAndEmitSample(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}this.sampleQueue.length=0}(0,T.insertSorted)(this.sampleQueue,e,function(e){return e.timestamp})}else{var c=this.inputTimestamps.shift();(0,T.assert)(void 0!==c),e.setTimestamp(c),this.finalizeAndEmitSample(e)}}},{key:"finalizeAndEmitSample",value:function(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}},{key:"mergeAlpha",value:function(e,r){if(!r){var n,a=new(0,E.VideoSample)(e);this.sampleHandler(a);return}(0,T.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();var i=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:null!=(n=e.duration)?n:void 0}),s=new(0,E.VideoSample)(i);this.sampleHandler(s)}},{key:"flush",value:function(){return(0,o._)(function(){var e,r,n,a,i,s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:if(e=this,!this.customDecoder)return[3,2];return[4,this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()})];case 1:return u.sent(),[3,4];case 2:return(0,T.assert)(this.decoder),[4,Promise.all([this.decoder.flush(),null==(r=this.alphaDecoder)?void 0:r.flush()])];case 3:u.sent(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1,u.label=4;case 4:if((0,T.isWebKit)()){n=!0,a=!1,i=void 0;try{for(s=this.sampleQueue[Symbol.iterator]();!(n=(o=s.next()).done);n=!0)c=o.value,this.finalizeAndEmitSample(c)}catch(e){a=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(a)throw i}}this.sampleQueue.length=0}return this.currentPacketIndex=0,this.raslSkipped=!1,[2]}})}).call(this)}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close(),null==(i=this.alphaDecoder)||i.close(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,null==(s=this.merger)||s.close());var r=!0,n=!1,a=void 0;try{for(var i,s,o,c=this.sampleQueue[Symbol.iterator]();!(r=(o=c.next()).done);r=!0)o.value.close()}catch(e){n=!0,a=e}finally{try{r||null==c.return||c.return()}finally{if(n)throw a}}this.sampleQueue.length=0}}]),r}(B),R=function(){"use strict";function e(){(0,u._)(this,e),"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");var r=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!r)throw Error("Couldn't acquire WebGL 2 context.");this.gl=r,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}return(0,l._)(e,[{key:"createProgram",value:function(){var e=this.createShader(this.gl.VERTEX_SHADER,"#version 300 es\n in vec2 a_position;\n in vec2 a_texCoord;\n out vec2 v_texCoord;\n \n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n "),r=this.createShader(this.gl.FRAGMENT_SHADER,"#version 300 es\n precision highp float;\n \n uniform sampler2D u_colorTexture;\n uniform sampler2D u_alphaTexture;\n in vec2 v_texCoord;\n out vec4 fragColor;\n \n void main() {\n vec3 color = texture(u_colorTexture, v_texCoord).rgb;\n float alpha = texture(u_alphaTexture, v_texCoord).r;\n fragColor = vec4(color, alpha);\n }\n "),n=this.gl.createProgram();return this.gl.attachShader(n,e),this.gl.attachShader(n,r),this.gl.linkProgram(n),n}},{key:"createShader",value:function(e,r){var n=this.gl.createShader(e);return this.gl.shaderSource(n,r),this.gl.compileShader(n),n}},{key:"createVAO",value:function(){var e=this.gl.createVertexArray();this.gl.bindVertexArray(e);var r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),n=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,n),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);var a=this.gl.getAttribLocation(this.program,"a_position"),i=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(a),this.gl.vertexAttribPointer(a,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,8),e}},{key:"createTexture",value:function(){var e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}},{key:"update",value:function(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}},{key:"close",value:function(){var e;null==(e=this.gl.getExtension("WEBGL_lose_context"))||e.loseContext(),this.gl=null}}]),e}(),U=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof w.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:return[4,this._track.canDecode()];case 1:if(!o.sent())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,a=this._track.rotation,[4,this._track.getDecoderConfig()];case 2:return i=o.sent(),s=this._track.timeResolution,(0,T.assert)(n&&i),[2,new F(e,r,n,i,a,s)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),O=function(){"use strict";function e(r){var n,a,i,s,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,u._)(this,e),this._nextCanvasIndex=0,!(r instanceof w.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(o&&(void 0===o?"undefined":(0,g._)(o))!=="object")throw TypeError("options must be an object.");if(void 0!==o.alpha&&"boolean"!=typeof o.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==o.width&&(!Number.isInteger(o.width)||o.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==o.height&&(!Number.isInteger(o.height)||o.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==o.fit&&!["fill","contain","cover"].includes(o.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==o.width&&void 0!==o.height&&void 0===o.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==o.rotation&&![0,90,180,270].includes(o.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==o.crop&&(0,E.validateCropRectangle)(o.crop,"options."),void 0!==o.poolSize&&("number"!=typeof o.poolSize||!Number.isInteger(o.poolSize)||o.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");var c=null!=(n=o.rotation)?n:r.rotation,l=(0,m._)(c%180==0?[r.codedWidth,r.codedHeight]:[r.codedHeight,r.codedWidth],2),d=l[0],f=l[1],h=o.crop;h&&(0,E.clampCropRectangle)(h,d,f);var p=(0,m._)(h?[h.width,h.height]:[d,f],2),b=p[0],k=p[1],_=b/k;void 0!==o.width&&void 0===o.height?k=Math.round((b=o.width)/_):void 0===o.width&&void 0!==o.height?b=Math.round((k=o.height)*_):void 0!==o.width&&void 0!==o.height&&(b=o.width,k=o.height),this._videoTrack=r,this._alpha=null!=(a=o.alpha)&&a,this._width=b,this._height=k,this._rotation=c,this._crop=h,this._fit=null!=(i=o.fit)?i:"fill",this._videoSampleSink=new U(r),this._canvasPool=Array.from({length:null!=(s=o.poolSize)?s:0},function(){return null})}return(0,l._)(e,[{key:"_videoSampleToWrappedCanvas",value:function(e){var r=this._canvasPool[this._nextCanvasIndex],n=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),n=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);var a=r.getContext("2d",{alpha:this._alpha||(0,T.isFirefox)()});(0,T.assert)(a),a.resetTransform(),n||(!this._alpha&&(0,T.isFirefox)()?(a.fillStyle="black",a.fillRect(0,0,this._width,this._height)):a.clearRect(0,0,this._width,this._height)),e.drawWithFit(a,{fit:this._fit,rotation:this._rotation,crop:this._crop});var i={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),i}},{key:"getCanvas",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._videoSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._videoSampleToWrappedCanvas(r)]}})}).call(this)}},{key:"canvases",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samples(r,n),function(r){return e._videoSampleToWrappedCanvas(r)})}},{key:"canvasesAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),function(e){return e&&r._videoSampleToWrappedCanvas(e)})}}]),e}(),L=function(e){"use strict";function r(e,n,a,i){(0,u._)(this,r),(s=(0,c._)(this,r,[e,n])).decoder=null,s.customDecoder=null,s.customDecoderCallSerializer=new(0,T.CallSerializer),s.customDecoderQueueSize=0,s.currentTimestamp=null;var s,o=function(r){(null===s.currentTimestamp||Math.abs(r.timestamp-s.currentTimestamp)>=r.duration)&&(s.currentTimestamp=r.timestamp);var n=s.currentTimestamp;if(s.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();var a=i.sampleRate;r.setTimestamp(Math.round(n*a)/a),e(r)},l=y.customAudioDecoders.find(function(e){return e.supports(a,i)});return l?(s.customDecoder=new l,s.customDecoder.codec=a,s.customDecoder.config=i,s.customDecoder.onSample=function(e){if(!(e instanceof E.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");o(e)},s.customDecoderCallSerializer.call(function(){return s.customDecoder.init()})):(s.decoder=new AudioDecoder({output:function(e){try{o(new(0,E.AudioSample)(e))}catch(e){s.onError(e)}},error:n}),s.decoder.configure(i)),s}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),this.decoder.decodeQueueSize)}},{key:"decode",value:function(e){var r=this;this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}},{key:"flush",value:function(){var e=this;return this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()}):((0,T.assert)(this.decoder),this.decoder.flush())}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close())}}]),r}(B),N=function(e){"use strict";function r(e,n,a){(0,u._)(this,r),(i=(0,c._)(this,r,[e,n])).decoderConfig=a,i.currentTimestamp=null,(0,T.assert)(k.PCM_AUDIO_CODECS.includes(a.codec)),i.codec=a.codec;var i,s=(0,k.parsePcmCodec)(i.codec),o=s.dataType,l=s.sampleSize,d=s.littleEndian;switch(i.inputSampleSize=l,l){case 1:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint8(r)-128}:"signed"===o?i.readInputValue=function(e,r){return e.getInt8(r)}:"ulaw"===o?i.readInputValue=function(e,r){return(0,I.fromUlaw)(e.getUint8(r))}:"alaw"===o?i.readInputValue=function(e,r){return(0,I.fromAlaw)(e.getUint8(r))}:(0,T.assert)(!1);break;case 2:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint16(r,d)-32768}:"signed"===o?i.readInputValue=function(e,r){return e.getInt16(r,d)}:(0,T.assert)(!1);break;case 3:"unsigned"===o?i.readInputValue=function(e,r){return(0,T.getUint24)(e,r,d)-8388608}:"signed"===o?i.readInputValue=function(e,r){return(0,T.getInt24)(e,r,d)}:(0,T.assert)(!1);break;case 4:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint32(r,d)-0x80000000}:"signed"===o?i.readInputValue=function(e,r){return e.getInt32(r,d)}:"float"===o?i.readInputValue=function(e,r){return e.getFloat32(r,d)}:(0,T.assert)(!1);break;case 8:"float"===o?i.readInputValue=function(e,r){return e.getFloat64(r,d)}:(0,T.assert)(!1);break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}switch(l){case 1:"ulaw"===o||"alaw"===o?(i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)}):(i.outputSampleSize=1,i.outputFormat="u8",i.writeOutputValue=function(e,r,n){return e.setUint8(r,n+128)});break;case 2:i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)};break;case 3:i.outputSampleSize=4,i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n<<8,!0)};break;case 4:i.outputSampleSize=4,"float"===o?(i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)}):(i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n,!0)});break;case 8:i.outputSampleSize=4,i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)};break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}return i}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return 0}},{key:"decode",value:function(e){for(var r=(0,T.toDataView)(e.data),n=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,a=new ArrayBuffer(n*this.decoderConfig.numberOfChannels*this.outputSampleSize),i=new DataView(a),s=0;s=l)&&(this.currentTimestamp=e.timestamp);var d=this.currentTimestamp;this.currentTimestamp+=l;var f=new(0,E.AudioSample)({format:this.outputFormat,data:a,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:n,timestamp:d});this.onSample(f)}},{key:"flush",value:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return[2]})})()}},{key:"close",value:function(){}}]),r}(B),V=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof w.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a;return(0,b._)(this,function(i){switch(i.label){case 0:return[4,this._track.canDecode()];case 1:if(!i.sent())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,[4,this._track.getDecoderConfig()];case 2:if(a=i.sent(),(0,T.assert)(n&&a),k.PCM_AUDIO_CODECS.includes(a.codec))return[2,new N(e,r,a)];return[2,new L(e,r,n,a)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),z=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof w.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new V(r)}return(0,l._)(e,[{key:"_audioSampleToWrappedArrayBuffer",value:function(e){var r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}},{key:"getBuffer",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._audioSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._audioSampleToWrappedArrayBuffer(r)]}})}).call(this)}},{key:"buffers",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samples(r,n),function(r){return e._audioSampleToWrappedArrayBuffer(r)})}},{key:"buffersAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),function(e){return e&&r._audioSampleToWrappedArrayBuffer(e)})}}]),e}()},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_define_property.cjs":"ltU3W","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec.js":"fXWqW","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./input.js":"3sapy","./input-track.js":"b22CJ","./misc.js":"j7iGm","./packet.js":"QfqGG","./pcm.js":"501Zr","./sample.js":"1oMH7","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3G1wX":[function(e,r,n,a){"use strict";n._=function(e,r){return r=null!=r?r:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):(function(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n.push.apply(n,a)}return n})(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}),e}},{}],QfqGG:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"PLACEHOLDER_DATA",function(){return l}),i.export(n,"EncodedPacket",function(){return d});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_type_of.cjs"),u=e("./misc.js"),l=new Uint8Array(0),d=function(){"use strict";function e(r,n,a,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1,u=arguments.length>5?arguments[5]:void 0,d=arguments.length>6?arguments[6]:void 0;if((0,s._)(this,e),this.data=r,this.type=n,this.timestamp=a,this.duration=i,this.sequenceNumber=o,r===l&&void 0===u)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===u&&(u=r.byteLength),!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==n&&"delta"!==n)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(o))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(u)||u<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==d&&((void 0===d?"undefined":(0,c._)(d))!=="object"||!d))throw TypeError("sideData, when provided, must be an object.");if((null==d?void 0:d.alpha)!==void 0&&!(d.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if((null==d?void 0:d.alphaByteLength)!==void 0&&(!Number.isInteger(d.alphaByteLength)||d.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=u,this.sideData=null!=d?d:{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}return(0,o._)(e,[{key:"isMetadataOnly",get:function(){return this.data===l}},{key:"microsecondTimestamp",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"toEncodedVideoChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"alphaToEncodedVideoChunk",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.type;if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"toEncodedAudioChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"clone",value:function(r){var n,a;if(void 0!==r&&((void 0===r?"undefined":(0,c._)(r))!=="object"||null===r))throw TypeError("options, when provided, must be an object.");if((null==r?void 0:r.timestamp)!==void 0&&!Number.isFinite(r.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if((null==r?void 0:r.duration)!==void 0&&!Number.isFinite(r.duration))throw TypeError("options.duration, when provided, must be a number.");return new e(this.data,this.type,null!=(n=null==r?void 0:r.timestamp)?n:this.timestamp,null!=(a=null==r?void 0:r.duration)?a:this.duration,this.sequenceNumber,this.byteLength)}}],[{key:"fromEncodedChunk",value:function(r,n){if(!(r instanceof EncodedVideoChunk||r instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");var a,i=new Uint8Array(r.byteLength);return r.copyTo(i),new e(i,r.type,r.timestamp/1e6,(null!=(a=r.duration)?a:0)/1e6,void 0,void 0,n)}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"501Zr":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"toUlaw",function(){return s}),i.export(n,"fromUlaw",function(){return o}),i.export(n,"toAlaw",function(){return c}),i.export(n,"fromAlaw",function(){return u});var s=function(e){var r=e,n=4096,a=0,i=12,s=0;for(r<0&&(r=-r,a=128),(r+=33)>8191&&(r=8191);(r&n)!==n&&i>=5;)n>>=1,i--;return s=r>>i-4&15,255&~(a|i-5<<4|s)},o=function(e){var r=0,n=0,a=~e;128&a&&(a&=-129,r=-1);var i=(1<<(n=((240&a)>>4)+5)|(15&a)<4095&&(s=4095);(s&r)!==r&&a>=5;)r>>=1,a--;return i=s>>(4===a?1:a-4)&15,(n|a-4<<4|i)^85},u=function(e){var r=0,n=0,a=85^e;128&a&&(a&=-129,r=-1);var i=0;return i=4!=(n=((240&a)>>4)+4)?1<=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),h=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-p>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),p=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));var g=function(){"use strict";function e(r,n){if((0,o._)(this,e),this._closed=!1,r instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&r instanceof SharedArrayBuffer||ArrayBuffer.isView(r)){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(!("format"in n)||"string"!=typeof n.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(n.codedWidth)||n.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(n.codedHeight)||n.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,f.toUint8Array)(r).slice(),this.format=n.format,this.codedWidth=n.codedWidth,this.codedHeight=n.codedHeight,this.rotation=null!=(a=n.rotation)?a:0,this.timestamp=n.timestamp,this.duration=null!=(i=n.duration)?i:0,this.colorSpace=new VideoColorSpace(n.colorSpace)}else if("undefined"!=typeof VideoFrame&&r instanceof VideoFrame){if((null==n?void 0:n.rotation)!==void 0&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if((null==n?void 0:n.timestamp)!==void 0&&!Number.isFinite(null==n?void 0:n.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if((null==n?void 0:n.duration)!==void 0&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=r,this.format=r.format,this.codedWidth=r.displayWidth,this.codedHeight=r.displayHeight,this.rotation=null!=(s=null==n?void 0:n.rotation)?s:0,this.timestamp=null!=(c=null==n?void 0:n.timestamp)?c:r.timestamp/1e6,this.duration=null!=(d=null==n?void 0:n.duration)?d:(null!=(u=r.duration)?u:0)/1e6,this.colorSpace=r.colorSpace}else if("undefined"!=typeof HTMLImageElement&&r instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&r instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&r instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&r instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&r instanceof OffscreenCanvas){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new e(new VideoFrame(r,{timestamp:Math.trunc(n.timestamp*f.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((null!=(h=n.duration)?h:0)*f.SECOND_TO_MICROSECOND_FACTOR)||void 0}),n);var a,i,s,c,u,d,h,p,g,b=0,k=0;if("naturalWidth"in r?(b=r.naturalWidth,k=r.naturalHeight):"videoWidth"in r?(b=r.videoWidth,k=r.videoHeight):"width"in r&&(b=Number(r.width),k=Number(r.height)),!b||!k)throw TypeError("Could not determine dimensions.");var _=new OffscreenCanvas(b,k),y=_.getContext("2d",{alpha:(0,f.isFirefox)(),willReadFrequently:!0});(0,f.assert)(y),y.drawImage(r,0,0),this._data=_,this.format="RGBX",this.codedWidth=b,this.codedHeight=k,this.rotation=null!=(p=n.rotation)?p:0,this.timestamp=n.timestamp,this.duration=null!=(g=n.duration)?g:0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");null==m||m.register(this,{type:"video",data:this._data},this)}return(0,c._)(e,[{key:"displayWidth",get:function(){return this.rotation%180==0?this.codedWidth:this.codedHeight}},{key:"displayHeight",get:function(){return this.rotation%180==0?this.codedHeight:this.codedWidth}},{key:"microsecondTimestamp",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"hasAlpha",get:function(){return this.format&&this.format.includes("A")}},{key:"clone",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new e(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new e(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new e(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}},{key:"close",value:function(){this._closed||(null==m||m.unregister(this),b(this._data)?this._data.close():this._data=null,this._closed=!0)}},{key:"allocationSize",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}},{key:"copyTo",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!b(this._data))return[3,2];return[4,this._data.copyTo(e)];case 1:return a.sent(),[3,3];case 2:this._data instanceof Uint8Array?(0,f.toUint8Array)(e).set(this._data):(r=this._data.getContext("2d"),(0,f.assert)(r),n=r.getImageData(0,0,this.codedWidth,this.codedHeight),(0,f.toUint8Array)(e).set(n.data)),a.label=3;case 3:return[2]}})}).call(this)}},{key:"toVideoFrame",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}},{key:"draw",value:function(e,r,n,a,i,s,o,c,u){var l,d=0,f=0,h=this.displayWidth,p=this.displayHeight,m=0,g=0,b=this.displayWidth,k=this.displayHeight;if(void 0!==s?(d=r,f=n,h=a,p=i,m=s,g=o,void 0!==c?(b=c,k=u):(b=h,k=p)):(m=r,g=n,void 0!==a&&(b=a,k=i)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(f))throw TypeError("sy must be a number.");if(!Number.isFinite(h)||h<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(p)||p<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(m))throw TypeError("dx must be a number.");if(!Number.isFinite(g))throw TypeError("dy must be a number.");if(!Number.isFinite(b)||b<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");d=(l=this._rotateSourceRegion(d,f,h,p,this.rotation)).sx,f=l.sy,h=l.sWidth,p=l.sHeight;var _=this.toCanvasImageSource();e.save();var y=m+b/2,S=g+k/2;e.translate(y,S),e.rotate(this.rotation*Math.PI/180);var w=this.rotation%180==0?1:b/k;e.scale(1/w,w),e.drawImage(_,d,f,h,p,-b/2,-k/2,b,k),e.restore()}},{key:"drawWithFit",value:function(e,r){if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&_(r.crop,"options.");var n,a,i,s,o,c,d,f,h,p,m,g,b,y=e.canvas.width,S=e.canvas.height,w=null!=(o=r.rotation)?o:this.rotation,T=(0,u._)(w%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth],2),x=T[0],I=T[1];r.crop&&k(r.crop,x,I);var E=this._rotateSourceRegion(null!=(p=null==(n=r.crop)?void 0:n.left)?p:0,null!=(m=null==(a=r.crop)?void 0:a.top)?m:0,null!=(g=null==(i=r.crop)?void 0:i.width)?g:x,null!=(b=null==(s=r.crop)?void 0:s.height)?b:I,w),j=E.sx,P=E.sy,C=E.sWidth,A=E.sHeight;if("fill"===r.fit)c=0,d=0,f=y,h=S;else{var B=(0,u._)(r.crop?[r.crop.width,r.crop.height]:[x,I],2),M=B[0],D=B[1],F="contain"===r.fit?Math.min(y/M,S/D):Math.max(y/M,S/D);f=M*F,h=D*F,c=(y-f)/2,d=(S-h)/2}e.save();var R=w%180==0?1:f/h;e.translate(y/2,S/2),e.rotate(w*Math.PI/180),e.scale(1/R,R),e.translate(-y/2,-S/2),e.drawImage(this.toCanvasImageSource(),j,P,C,A,c,d,f,h),e.restore()}},{key:"_rotateSourceRegion",value:function(e,r,n,a,i){var s,o,c;return 90===i?(e=(s=[r,this.codedHeight-e-n,a,n])[0],r=s[1],n=s[2],a=s[3]):180===i?(e=(o=[this.codedWidth-e-n,this.codedHeight-r-a])[0],r=o[1]):270===i&&(e=(c=[this.codedWidth-r-a,e,a,n])[0],r=c[1],n=c[2],a=c[3]),{sx:e,sy:r,sWidth:n,sHeight:a}}},{key:"toCanvasImageSource",value:function(){if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;var e=this.toVideoFrame();return queueMicrotask(function(){return e.close()}),e}},{key:"setRotation",value:function(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}},{key:"setTimestamp",value:function(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}},{key:"setDuration",value:function(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}},{key:Symbol.dispose,value:function(){this.close()}}]),e}(),b=function(e){return"undefined"!=typeof VideoFrame&&e instanceof VideoFrame},k=function(e,r,n){e.left=Math.min(e.left,r),e.top=Math.min(e.top,n),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,n-e.top),(0,f.assert)(e.width>=0),(0,f.assert)(e.height>=0)},_=function(e,r){if(!e||(void 0===e?"undefined":(0,l._)(e))!=="object")throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},y=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]),S=function(){"use strict";function e(r){if((0,o._)(this,e),this._closed=!1,E(r)){if(null===r.format)throw TypeError("AudioData with null format is not supported.");this._data=r,this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=r.numberOfFrames,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp/1e6,this.duration=r.numberOfFrames/r.sampleRate}else{if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("Invalid AudioDataInit: must be an object.");if(!y.has(r.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(r.sampleRate)||r.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(r.numberOfChannels)||0===r.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(null==r?void 0:r.timestamp))throw TypeError("init.timestamp must be a number.");var n,a=r.data.byteLength/(w(r.format)*r.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=a,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp,this.duration=a/r.sampleRate,r.data instanceof ArrayBuffer)n=new Uint8Array(r.data);else if(ArrayBuffer.isView(r.data))n=new Uint8Array(r.data.buffer,r.data.byteOffset,r.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");var i=this.numberOfFrames*this.numberOfChannels*w(this.format);if(n.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");var s=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-i;if(s>this.numberOfFrames-i)throw RangeError("frameCount out of range");var o=w(a),c=T(a);if(c&&e.planeIndex>=this.numberOfChannels||!c&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(c?s:s*this.numberOfChannels)*o}},{key:"copyTo",value:function(e,r){if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!y.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");var n=r.planeIndex,a=r.format,i=r.frameCount,s=r.frameOffset,o=null!=a?a:this.format;if(!o)throw Error("Destination format not determined");var c=this.numberOfFrames,u=this.numberOfChannels,d=null!=s?s:0;if(d>=c)throw RangeError("frameOffset out of range");var h=void 0!==i?i:c-d;if(h>c-d)throw RangeError("frameCount out of range");var p=w(o),m=T(o);if(m&&n>=u||!m&&0!==n)throw RangeError("planeIndex out of range");var g=m?h:h*u;if(e.byteLength0))return[3,3];for(h=0,f=new Float32Array(a*(l=Math.min(o,u)));h0;){for(var d=Math.min(o,u),f=new Float32Array(a*d),h=0;h0){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fSW0K:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_BOX_HEADER_SIZE",function(){return u}),i.export(n,"MAX_BOX_HEADER_SIZE",function(){return l}),i.export(n,"readBoxHeader",function(){return d}),i.export(n,"readFixed_16_16",function(){return f}),i.export(n,"readFixed_2_30",function(){return h}),i.export(n,"readIsomVariableInteger",function(){return p}),i.export(n,"readMetadataStringShort",function(){return m}),i.export(n,"readDataBox",function(){return g});var s=e("../metadata.js"),o=e("../misc.js"),c=e("../reader.js"),u=8,l=16,d=function(e){var r=(0,c.readU32Be)(e),n=(0,c.readAscii)(e,4),a=8;1===r&&(r=(0,c.readU64Be)(e),a=16);var i=r-a;return i<0?null:{name:n,totalSize:r,headerSize:a,contentSize:i}},f=function(e){return(0,c.readI32Be)(e)/65536},h=function(e){return(0,c.readI32Be)(e)/0x40000000},p=function(e){for(var r=0,n=0;n<4;n++){r<<=7;var a=(0,c.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},m=function(e){var r=(0,c.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,c.readBytes)(e,r))},g=function(e){var r=d(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;var n=(0,c.readU32Be)(e);e.skip(4);var a=(0,c.readBytes)(e,r.contentSize-8);switch(n){case 1:return o.textDecoder.decode(a);case 2:return new TextDecoder("utf-16be").decode(a);case 13:return new(0,s.RichImageData)(a,"image/jpeg");case 14:return new(0,s.RichImageData)(a,"image/png");case 27:return new(0,s.RichImageData)(a,"image/bmp");default:return a}}},{"../metadata.js":"eSjom","../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],eSjom:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"RichImageData",function(){return c}),i.export(n,"AttachedFile",function(){return u}),i.export(n,"validateMetadataTags",function(){return l}),i.export(n,"metadataTagsAreEmpty",function(){return d}),i.export(n,"DEFAULT_TRACK_DISPOSITION",function(){return f}),i.export(n,"validateTrackDisposition",function(){return h});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_type_of.cjs"),c=function e(r,n){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof n)throw TypeError("mimeType must be a string.")},u=function e(r,n,a,i){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,this.name=a,this.description=i,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==n&&"string"!=typeof n)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")},l=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");var r=!0,n=!1,a=void 0;try{for(var i,s=e.images[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var l=i.value;if(!l||(void 0===l?"undefined":(0,o._)(l))!=="object")throw TypeError("Each image in tags.images must be an object.");if(!(l.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof l.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(l.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!==(0,o._)(e.raw))throw TypeError("tags.raw, when provided, must be an object.");var d=!0,f=!1,h=void 0;try{for(var p,m=Object.values(e.raw)[Symbol.iterator]();!(d=(p=m.next()).done);d=!0){var g=p.value;if(null!==g&&"string"!=typeof g&&!(g instanceof Uint8Array)&&!(g instanceof c)&&!(g instanceof u))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}}catch(e){f=!0,h=e}finally{try{d||null==m.return||m.return()}finally{if(f)throw h}}}},d=function(e){return void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length)},f={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},h=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KRfO":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Reader",function(){return l}),i.export(n,"FileSlice",function(){return d}),i.export(n,"readBytes",function(){return h}),i.export(n,"readU8",function(){return p}),i.export(n,"readU16",function(){return m}),i.export(n,"readU16Be",function(){return g}),i.export(n,"readU24Be",function(){return b}),i.export(n,"readI16Be",function(){return k}),i.export(n,"readU32",function(){return _}),i.export(n,"readU32Be",function(){return y}),i.export(n,"readU32Le",function(){return S}),i.export(n,"readI32Be",function(){return w}),i.export(n,"readI32Le",function(){return T}),i.export(n,"readU64",function(){return x}),i.export(n,"readU64Be",function(){return I}),i.export(n,"readI64Be",function(){return E}),i.export(n,"readI64Le",function(){return j}),i.export(n,"readF32Be",function(){return P}),i.export(n,"readF64Be",function(){return C}),i.export(n,"readAscii",function(){return A});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=e("./input.js"),u=e("./misc.js"),l=function(){"use strict";function e(r){(0,s._)(this,e),this.source=r}return(0,o._)(e,[{key:"requestSlice",value:function(e,r){if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;var n=e+r,a=this.source._read(e,n);return a instanceof Promise?a.then(function(r){return r?new d(r.bytes,r.view,r.offset,e,n):null}):a?new d(a.bytes,a.view,a.offset,e,n):null}},{key:"requestSliceRange",value:function(e,r,n){var a=this;if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,u.clamp)(this.fileSize-e,r,n));var i=this.requestSlice(e,n),s=function(i){if(i)return i;var s=function(i){return(0,u.assert)(null!==i),a.requestSlice(e,(0,u.clamp)(i-e,r,n))},o=a.source._retrieveSize();return o instanceof Promise?o.then(s):s(o)};return i instanceof Promise?i.then(s):s(i)}}]),e}(),d=function(){"use strict";function e(r,n,a,i,o){(0,s._)(this,e),this.bytes=r,this.view=n,this.offset=a,this.start=i,this.end=o,this.bufferPos=i-a}return(0,o._)(e,[{key:"length",get:function(){return this.end-this.start}},{key:"filePos",get:function(){return this.offset+this.bufferPos},set:function(e){this.bufferPos=e-this.offset}},{key:"remainingLength",get:function(){return Math.max(this.end-this.filePos,0)}},{key:"skip",value:function(e){this.bufferPos+=e}},{key:"slice",value:function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.end-r;if(rthis.end)throw RangeError("Slicing outside of original slice.");return new e(this.bytes,this.view,this.offset,r,r+n)}}],[{key:"tempFromBytes",value:function(r){return new e(r,(0,u.toDataView)(r),0,0,r.length)}}]),e}(),f=function(e,r){if(e.filePose.end)throw RangeError("Tried reading [".concat(e.filePos,", ").concat(e.filePos+r,"), but slice is")+" [".concat(e.start,", ").concat(e.end,"). This is likely an internal error, please report it alongside the file")+" that caused it.")},h=function(e,r){f(e,r);var n=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,n},p=function(e){return f(e,1),e.view.getUint8(e.bufferPos++)},m=function(e,r){f(e,2);var n=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,n},g=function(e){f(e,2);var r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},b=function(e){f(e,3);var r=(0,u.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},k=function(e){f(e,2);var r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},_=function(e,r){f(e,4);var n=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,n},y=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},S=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},w=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},T=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=function(e,r){var n,a;return r?(n=_(e,!0),a=_(e,!0)):(a=_(e,!1),n=_(e,!1)),0x100000000*a+n},I=function(e){return 0x100000000*y(e)+y(e)},E=function(e){return 0x100000000*w(e)+y(e)},j=function(e){var r=S(e);return 0x100000000*T(e)+r},P=function(e){f(e,4);var r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},C=function(e){f(e,8);var r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=function(e,r){f(e,r);for(var n="",a=0;a=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},E=function(e){if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x7ffffffff)return 5;else if(e<0x3ffffffffff)return 6;else throw Error("EBML varint size not supported "+e)},j=function(){"use strict";function e(r){(0,u._)(this,e),this.writer=r,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}return(0,l._)(e,[{key:"writeByte",value:function(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}},{key:"writeFloat32",value:function(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeFloat64",value:function(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}},{key:"writeUnsignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:T(e),n=0;switch(r){case 6:this.helperView.setUint8(n++,e/0x10000000000|0);case 5:this.helperView.setUint8(n++,e/0x100000000|0);case 4:this.helperView.setUint8(n++,e>>24);case 3:this.helperView.setUint8(n++,e>>16);case 2:this.helperView.setUint8(n++,e>>8);case 1:this.helperView.setUint8(n++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeUnsignedBigInt",value:function(e){for(var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x(e),n=0,a=r-1;a>=0;a--)this.helperView.setUint8(n++,Number(e>>BigInt(8*a)&255n));this.writer.write(this.helper.subarray(0,n))}},{key:"writeSignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I(e);e<0&&(e+=Math.pow(2,8*r)),this.writeUnsignedInt(e,r)}},{key:"writeVarInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E(e),n=0;switch(r){case 1:this.helperView.setUint8(n++,128|e);break;case 2:this.helperView.setUint8(n++,64|e>>8),this.helperView.setUint8(n++,e);break;case 3:this.helperView.setUint8(n++,32|e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 4:this.helperView.setUint8(n++,16|e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 5:this.helperView.setUint8(n++,8|e/0x100000000&7),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 6:this.helperView.setUint8(n++,4|e/0x10000000000&3),this.helperView.setUint8(n++,e/0x100000000|0),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeAsciiString",value:function(e){this.writer.write(new Uint8Array(e.split("").map(function(e){return e.charCodeAt(0)})))}},{key:"writeEBML",value:function(e){if(null!==e){var r=!0,n=!1,a=void 0;if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))try{for(var i,s=e[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.writeEBML(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){var c,u=this.writer.getPos(),l=-1===e.size?1:null!=(c=e.size)?c:4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+l);var d=this.writer.getPos();if(this.dataOffsets.set(e,d),this.writeEBML(e.data),-1!==e.size){var h=this.writer.getPos()-d,m=this.writer.getPos();this.writer.seek(u),this.writeVarInt(h,l),this.writer.seek(m)}}else if("number"==typeof e.data){var y,S=null!=(y=e.size)?y:T(e.data);this.writeVarInt(S),this.writeUnsignedInt(e.data,S)}else if("bigint"===(0,f._)(e.data)){var w,E=null!=(w=e.size)?w:x(e.data);this.writeVarInt(E),this.writeUnsignedBigInt(e.data,E)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof g)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof b)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof k){var j,P=null!=(j=e.size)?j:I(e.data.value);this.writeVarInt(P),this.writeSignedInt(e.data.value,P)}else if(e.data instanceof _){var C=p.textEncoder.encode(e.data.value);this.writeVarInt(C.length),this.writer.write(C)}else(0,p.assertNever)(e.data)}}}]),e}(),P=8,C=2,A=16,B=function(e){var r=(0,m.readU8)(e);if(e.skip(-1),0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;return n},M=function(e){var r=(0,m.readU8)(e);if(0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;for(var i=r&a-1,s=1;s8)throw Error("Bad unsigned int size "+r);for(var n=0,a=0;as?a:s,found:!1}]}})})()},G=function(e,r,n,a){return(0,c._)(function(){var i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:i=65536,s=new Set(n),o=r,d.label=1;case 1:if(!(oU&&(U=H.cuePoints.length,R=H)}catch(e){L=!0,N=e}finally{try{O||null==V.return||V.return()}finally{if(L)throw N}}G=!0,q=!1,W=void 0;try{for(K=this.currentSegment.tracks[Symbol.iterator]();!(G=(X=K.next()).done);G=!0)Q=X.value,0===Q.cuePoints.length&&(Q.cuePoints=R.cuePoints)}catch(e){q=!0,W=e}finally{try{G||null==K.return||K.return()}finally{if(q)throw W}}return this.currentSegment=null,[2]}})}).call(this)}},{key:"readCluster",value:function(e,r){return(0,f._)(function(){var n,a,i,s,o,u,l,d,f,h,p,m,g,b,_,S,w,T,x,I,E,P,A,B,M;return(0,y._)(this,function(y){switch(y.label){case 0:if((null==(n=r.lastReadCluster)?void 0:n.elementStartPos)===e)return[2,r.lastReadCluster];if(!((a=this.reader.requestSliceRange(e,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,a];case 1:a=y.sent(),y.label=2;case 2:if((0,j.assert)(a),i=e,s=(0,C.readElementHeader)(a),(0,j.assert)(s),o=s.id,(0,j.assert)(o===C.EBMLId.Cluster),u=s.size,l=a.filePos,null!==u)return[3,4];return[4,(0,C.searchForNextElementId)(this.reader,l,C.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)];case 3:u=y.sent().pos-l,y.label=4;case 4:if(!((d=this.reader.requestSlice(l,u))instanceof Promise))return[3,6];return[4,d];case 5:d=y.sent(),y.label=6;case 6:f={segment:r,elementStartPos:i,elementEndPos:l+u,dataStartPos:l,timestamp:-1,trackData:new Map},this.currentCluster=f,d&&(f.elementEndPos=this.readContiguousElements(d,C.LEVEL_0_AND_1_EBML_IDS)),h=!0,p=!1,m=void 0;try{for(g=f.trackData[Symbol.iterator]();!(h=(b=g.next()).done);h=!0){for(S=(_=(0,k._)(b.value,2)[1]).track,(0,j.assert)(_.blocks.length>0),w=!1,T=0;T<_.blocks.length;T++)x=_.blocks[T],x.timestamp+=f.timestamp,w||(w=x.lacing!==c.None);for(I=0,_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp});I<_.presentationTimestamps.length;I++)E=_.presentationTimestamps[I],P=_.blocks[E.blockIndex],null===_.firstKeyFrameTimestamp&&P.isKeyFrame&&(_.firstKeyFrameTimestamp=P.timestamp),I<_.presentationTimestamps.length-1?P.duration=_.presentationTimestamps[I+1].timestamp-P.timestamp:0===P.duration&&null!=S.defaultDuration&&P.lacing===c.None&&(P.duration=S.defaultDuration);w&&(this.expandLacedBlocks(_.blocks,S),_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp})),A=_.blocks[_.presentationTimestamps[0].blockIndex],B=_.blocks[(0,j.last)(_.presentationTimestamps).blockIndex],_.startTimestamp=A.timestamp,_.endTimestamp=B.timestamp+B.duration,M=(0,j.binarySearchLessOrEqual)(S.clusterPositionCache,_.startTimestamp,function(e){return e.startTimestamp}),(-1===M||S.clusterPositionCache[M].elementStartPos!==i)&&S.clusterPositionCache.splice(M+1,0,{elementStartPos:f.elementStartPos,startTimestamp:_.startTimestamp})}}catch(e){p=!0,m=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw m}}return r.lastReadCluster=f,[2,f]}})}).call(this)}},{key:"getTrackDataInCluster",value:function(e,r){var n=e.trackData.get(r);if(!n){var a=e.segment.tracks.find(function(e){return e.id===r});if(!a)return null;n={track:a,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,n)}return n}},{key:"expandLacedBlocks",value:function(e,r){for(var n=0;n0;eP.blocks.push({timestamp:eC,duration:0,isKeyFrame:eB,data:eM,lacing:eA>>1&3,decoded:!eD,mainAdditional:null});break;case C.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(f,d)),this.currentBlock=null;break;case C.EBMLId.Block:if(!this.currentCluster)break;var eF=(0,C.readVarInt)(e);if(null===eF)break;var eR=this.getTrackDataInCluster(this.currentCluster,eF);if(!eR)break;var eU=(0,B.readI16Be)(e),eO=(0,B.readU8)(e),eL=(0,B.readBytes)(e,d-(e.filePos-f)),eN=eR.track.decodingInstructions.length>0;this.currentBlock={timestamp:eU,duration:0,isKeyFrame:!0,data:eL,lacing:eO>>1&3,decoded:!eN,mainAdditional:null},eR.blocks.push(this.currentBlock);break;case C.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(f,d)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case C.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,B.readBytes)(e,d);break;case C.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case C.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.Targets:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TargetTypeValue:50!==(0,C.readUnsignedInt)(e,d)&&(this.currentTagTargetIsMovie=!1);break;case C.EBMLId.TagTrackUID:case C.EBMLId.TagEditionUID:case C.EBMLId.TagChapterUID:case C.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case C.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TagName:this.currentSimpleTagName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.TagString:if(!this.currentSimpleTagName)break;var eV=(0,C.readUnicodeString)(e,d);this.processTagValue(this.currentSimpleTagName,eV);break;case C.EBMLId.TagBinary:if(!this.currentSimpleTagName)break;var ez=(0,B.readBytes)(e,d);this.processTagValue(this.currentSimpleTagName,ez);break;case C.EBMLId.AttachedFile:if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(f,d));var eH=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(null!=eH.raw||(eH.raw={}),eH.raw[this.currentAttachedFile.fileUid.toString()]=new(0,E.AttachedFile)(this.currentAttachedFile.fileData,null!=(eq=this.currentAttachedFile.fileMediaType)?eq:void 0,null!=(eW=this.currentAttachedFile.fileName)?eW:void 0,null!=(eK=this.currentAttachedFile.fileDescription)?eK:void 0)),(null==(eG=this.currentAttachedFile.fileMediaType)?void 0:eG.startsWith("image/"))&&this.currentAttachedFile.fileData){var eG,eq,eW,eK,eX,eQ,eZ=this.currentAttachedFile.fileName,eY="unknown";if(eZ){var eJ=eZ.toLowerCase();eJ.startsWith("cover.")?eY="coverFront":eJ.startsWith("back.")&&(eY="coverBack")}null!=eH.images||(eH.images=[]),eH.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:eY,name:null!=(eX=this.currentAttachedFile.fileName)?eX:void 0,description:null!=(eQ=this.currentAttachedFile.fileDescription)?eQ:void 0})}this.currentAttachedFile=null;break;case C.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,C.readUnsignedBigInt)(e,d);break;case C.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,C.readAsciiString)(e,d);break;case C.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,B.readBytes)(e,d);break;case C.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(f,d)),this.currentTrack.decodingInstructions.sort(function(e,r){return r.order-e.order});break;case C.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:u.Block,data:null},this.readContiguousElements(e.slice(f,d)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case C.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:l.Zlib,settings:null},this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.ContentCompAlgo:if((null==(a=this.currentDecodingInstruction)||null==(n=a.data)?void 0:n.type)!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompSettings:if((null==(s=this.currentDecodingInstruction)||null==(i=s.data)?void 0:i.type)!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,B.readBytes)(e,d);break;case C.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=f+d,!0}},{key:"decodeBlockData",value:function(e,r){(0,j.assert)(e.decodingInstructions.length>0);var n=r,a=!0,i=!1,s=void 0;try{for(var o,c=e.decodingInstructions[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value;if((0,j.assert)(u.data),"decompress"===u.data.type&&u.data.algorithm===l.HeaderStripping&&u.data.settings&&u.data.settings.length>0){var d=u.data.settings,f=new Uint8Array(d.length+n.length);f.set(d,0),f.set(n,d.length),n=f}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return n}},{key:"processTagValue",value:function(e,r){if(null==(a=this.currentSegment)?void 0:a.metadataTags){var n=this.currentSegment.metadataTags;if(null!=n.raw||(n.raw={}),null!=(i=n.raw)[e]||(i[e]=r),"string"==typeof r)switch(e.toLowerCase()){case"title":null!=n.title||(n.title=r);break;case"description":null!=n.description||(n.description=r);break;case"artist":null!=n.artist||(n.artist=r);break;case"album":null!=n.album||(n.album=r);break;case"album_artist":null!=n.albumArtist||(n.albumArtist=r);break;case"genre":null!=n.genre||(n.genre=r);break;case"comment":null!=n.comment||(n.comment=r);break;case"lyrics":null!=n.lyrics||(n.lyrics=r);break;case"date":var a,i,s=new Date(r);Number.isNaN(s.getTime())||null!=n.date||(n.date=s);break;case"track_number":case"part_number":var o=r.split("/"),c=Number.parseInt(o[0],10),u=o[1]&&Number.parseInt(o[1],10);Number.isInteger(c)&&c>0&&(null!=n.trackNumber||(n.trackNumber=c)),u&&Number.isInteger(u)&&u>0&&(null!=n.tracksTotal||(n.tracksTotal=u));break;case"disc_number":case"disc":var l=r.split("/"),d=Number.parseInt(l[0],10),f=l[1]&&Number.parseInt(l[1],10);Number.isInteger(d)&&d>0&&(null!=n.discNumber||(n.discNumber=d)),f&&Number.isInteger(f)&&f>0&&(null!=n.discsTotal||(n.discsTotal=f))}}}}]),r}(x.Demuxer),F=function(){"use strict";function e(r){(0,p._)(this,e),this.internalTrack=r,this.packetToClusterLocation=new WeakMap}return(0,m._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.codecId}},{key:"computeDuration",value:function(){return(0,f._)(function(){var e,r,n;return(0,y._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getFirstTimestamp",value:function(){return(0,f._)(function(){var e,r;return(0,y._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getTimeResolution",value:function(){return this.internalTrack.segment.timestampFactor}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"getFirstPacket",value:function(e){return(0,f._)(function(){var r;return(0,y._)(this,function(n){return r=this,[2,this.performClusterLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,e)]})}).call(this)}},{key:"intoTimescale",value:function(e){return(0,j.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}},{key:"getPacket",value:function(e,r){return(0,f._)(function(){var n,a;return(0,y._)(this,function(i){return n=this,a=this.intoTimescale(e),[2,this.performClusterLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};var i=(0,j.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.timestamp});return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&aa.blockIndex});if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{var i=e.trackData.get(n.internalTrack.id);if(i&&null!==i.firstKeyFrameTimestamp){var s=i.blocks.findIndex(function(e){return e.isKeyFrame});return(0,j.assert)(-1!==s),{blockIndex:s,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketInCluster",value:function(e,r,n){return(0,f._)(function(){var a,i,s,o,c,u,l;return(0,y._)(this,function(d){return -1===r?[2,null]:(i=e.trackData.get(this.internalTrack.id).blocks[r],(0,j.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0),s=n.metadataOnly?P.PLACEHOLDER_DATA:i.data,o=i.timestamp/this.internalTrack.segment.timestampFactor,c=i.duration/this.internalTrack.segment.timestampFactor,u={},i.mainAdditional&&(null==(a=this.internalTrack.info)?void 0:a.type)==="video"&&this.internalTrack.info.alphaMode&&(u.alpha=n.metadataOnly?P.PLACEHOLDER_DATA:i.mainAdditional,u.alphaByteLength=i.mainAdditional.byteLength),l=new(0,P.EncodedPacket)(s,i.isKeyFrame?"key":"delta",o,c,e.dataStartPos+r,i.data.byteLength,u),this.packetToClusterLocation.set(l,{cluster:e,blockIndex:r}),[2,l])})}).call(this)}},{key:"performClusterLookup",value:function(e,r,n,a,i){return(0,f._)(function(){var s,o,c,u,l,d,f,h,p,m,g,b,k,_,S,w,T,x,I,E,P,A,B,M,D,F,R,U,O,L,N,V;return(0,y._)(this,function(y){switch(y.label){case 0:if(o=(s=this.internalTrack).demuxer,c=s.segment,u=null,l=null,d=-1,e){if(h=(f=r(e)).blockIndex,f.correctBlockFound)return[2,this.fetchPacketInCluster(e,h,i)];-1!==h&&(l=e,d=h)}m=-1!==(p=(0,j.binarySearchLessOrEqual)(this.internalTrack.cuePoints,n,function(e){return e.time}))?this.internalTrack.cuePoints[p]:null,b=-1!==(g=(0,j.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.clusterPositionCache[g]:null,S=Math.max(null!=(k=null==m?void 0:m.clusterPosition)?k:0,null!=(_=null==b?void 0:b.elementStartPos)?_:0)||null,e?null===S||e.elementStartPos>=S?(w=e.elementEndPos,u=e):w=S:w=null!=S?S:c.clusterSeekStartPos,y.label=1;case 1:if(!(null===c.elementEndPos||w<=c.elementEndPos-C.MIN_HEADER_SIZE)||u&&(T=u.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,13];if(!((x=o.reader.requestSliceRange(w,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=y.sent(),y.label=3;case 3:if(!x)return[3,13];if(I=w,!(!(E=(0,C.readElementHeader)(x))||!C.LEVEL_1_EBML_IDS.includes(E.id)&&E.id!==C.EBMLId.Void))return[3,5];return[4,(0,C.resync)(o.reader,I,C.LEVEL_1_EBML_IDS,Math.min(null!=(P=c.elementEndPos)?P:1/0,I+0xa00000))];case 4:if(A=y.sent())return w=A,[3,1];return[3,13];case 5:if(B=E.id,M=E.size,D=x.filePos,B!==C.EBMLId.Cluster)return[3,7];return[4,o.readCluster(I,c)];case 6:if(M=(u=y.sent()).elementEndPos-D,R=(F=r(u)).blockIndex,F.correctBlockFound)return[2,this.fetchPacketInCluster(u,R,i)];-1!==R&&(l=u,d=R),y.label=7;case 7:if(null!==M)return[3,9];return(0,j.assert)(B!==C.EBMLId.Cluster),[4,(0,C.searchForNextElementId)(o.reader,D,C.LEVEL_0_AND_1_EBML_IDS,c.elementEndPos)];case 8:M=y.sent().pos-D,y.label=9;case 9:if(U=D+M,null!==c.elementEndPos)return[3,12];if(!((O=o.reader.requestSliceRange(U,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,11];return[4,O];case 10:O=y.sent(),y.label=11;case 11:if(!O)return[3,13];if((0,C.readElementId)(O)===C.EBMLId.Segment)return c.elementEndPos=U,[3,13];y.label=12;case 12:return w=U,[3,1];case 13:if(m&&(!l||l.elementStartPos0){var n=(0,s._)(new Set(e.codecStrings.filter(Boolean)));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ifShX:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Mp3Demuxer",function(){return w});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../demuxer.js"),p=e("../input-track.js"),m=e("../metadata.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../../shared/mp3-misc.js"),_=e("../id3.js"),y=e("./mp3-reader.js"),S=e("../reader.js"),w=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.metadataTags=null,n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");return this.tracks=[new(0,p.InputAudioTrack)(this.input,new T(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u;return(0,f._)(this,function(l){switch(l.label){case 0:if(0!==this.lastLoadedPos)return[3,4];l.label=1;case 1:if(!((e=this.reader.requestSlice(this.lastLoadedPos,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,3];return[4,e];case 2:e=l.sent(),l.label=3;case 3:if(!e)return this.lastSampleLoaded=!0,[2];if(!(r=(0,_.readId3V2Header)(e)))return[3,4];return this.lastLoadedPos=e.filePos+r.size,[3,1];case 4:return[4,(0,y.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize)];case 5:if(!(n=l.sent()))return this.lastSampleLoaded=!0,[2];if(a=n.header,this.lastLoadedPos=n.startPos+a.totalSize-1,i=(0,k.getXingOffset)(a.mpegVersionId,a.channel),!((s=this.reader.requestSlice(n.startPos+i,4))instanceof Promise))return[3,7];return[4,s];case 6:s=l.sent(),l.label=7;case 7:if(s&&((o=(0,S.readU32Be)(s))===k.XING||o===k.INFO))return[2];return this.firstFrameHeader||(this.firstFrameHeader=a),a.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn("MP3 changed sample rate mid-file: ".concat(this.firstFrameHeader.sampleRate," Hz to ").concat(a.sampleRate," Hz.")+" Might be a bug, so please report this file."),c=a.audioSamplesInFrame/this.firstFrameHeader.sampleRate,u={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:c,dataStart:n.startPos,dataSize:a.totalSize},this.loadedSamples.push(u),this.nextTimestampInSamples+=a.audioSamplesInFrame,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/mpeg"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:return[4,this.readingMutex.acquire()];case 1:e=c.sent(),c.label=2;case 2:return c.trys.push([2,,13,14]),[4,this.readMetadata()];case 3:if(c.sent(),this.metadataTags)return[2,this.metadataTags];this.metadataTags={},r=0,n=!1,c.label=4;case 4:if(!((a=this.reader.requestSlice(r,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,6];return[4,a];case 5:a=c.sent(),c.label=6;case 6:if(!a||!(i=(0,_.readId3V2Header)(a)))return[3,9];if(n=!0,!((s=this.reader.requestSlice(a.filePos,i.size))instanceof Promise))return[3,8];return[4,s];case 7:s=c.sent(),c.label=8;case 8:if(!s)return[3,9];return(0,_.parseId3V2Tag)(s,i,this.metadataTags),r=a.filePos+i.size,[3,4];case 9:if(!(!n&&null!==this.reader.fileSize&&this.reader.fileSize>=_.ID3_V1_TAG_SIZE))return[3,12];if(!((o=this.reader.requestSlice(this.reader.fileSize-_.ID3_V1_TAG_SIZE,_.ID3_V1_TAG_SIZE))instanceof Promise))return[3,11];return[4,o];case 10:o=c.sent(),c.label=11;case 11:(0,g.assert)(o),"TAG"===(0,S.readAscii)(o,3)&&(0,_.parseId3V1Tag)(o,this.metadataTags),c.label=12;case 12:return[2,this.metadataTags];case 13:return e(),[7];case 14:return[2]}})}).call(this)}}]),r}(h.Demuxer),T=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"mp3"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},m.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.firstFrameHeader),[2,{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,S.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1>>24,i=e>>>16&255,s=e>>>8&255,u=255&e;if(255!==a&&255!==i&&255!==s&&255!==u)return{header:null,bytesAdvanced:4};if(255!==a||(224&i)!=224)return{header:null,bytesAdvanced:1};var l=0,f=0;16&i?l=8&i?0:1:(l=1,f=1);var h=i>>3&3,p=i>>1&3,m=(s>>2&3)%3,g=c[64*l+16*p+(s>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};var b=1e3*g,k=o[m]>>l+f,_=d(l,p,b,k,s>>1&1);return null!==r&&r<_?{header:null,bytesAdvanced:1}:(n=3===h?3===p?384:1152:3===p?384:2===p?1152:576,{header:{totalSize:_,mpegVersionId:h,layer:p,bitrate:b,frequencyIndex:m,sampleRate:k,channel:u>>6&3,modeExtension:u>>4&3,copyright:u>>3&1,original:u>>2&1,emphasis:3&u,audioSamplesInFrame:n},bytesAdvanced:1})},p=function(e){for(var r=127,n=0,a=e;(0x7fffffff^r)!=0;)n=(a&~r)<<1|a&r,r=(r+1<<8)-1,a=n;return n},m=function(e){for(var r=0x7f000000,n=0;0!==r;)n>>=1,n|=e&r,r>>=8;return n}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"42Y2c":[function(e,r,n,a){var i,s,o,c,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(n),u.export(n,"Id3V2HeaderFlags",function(){return o}),u.export(n,"Id3V2TextEncoding",function(){return c}),u.export(n,"ID3_V1_TAG_SIZE",function(){return m}),u.export(n,"ID3_V2_HEADER_SIZE",function(){return g}),u.export(n,"ID3_V1_GENRES",function(){return b}),u.export(n,"parseId3V1Tag",function(){return k}),u.export(n,"readId3V1String",function(){return _}),u.export(n,"readId3V2Header",function(){return y}),u.export(n,"parseId3V2Tag",function(){return S}),u.export(n,"Id3V2Reader",function(){return w}),u.export(n,"Id3V2Writer",function(){return T});var l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("../shared/mp3-misc.js"),h=e("./misc.js"),p=e("./reader.js");(i=o||(o={}))[i.Unsynchronisation=128]="Unsynchronisation",i[i.ExtendedHeader=64]="ExtendedHeader",i[i.ExperimentalIndicator=32]="ExperimentalIndicator",i[i.Footer=16]="Footer",(s=c||(c={}))[s.ISO_8859_1=0]="ISO_8859_1",s[s.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",s[s.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",s[s.UTF_8=3]="UTF_8";var m=128,g=10,b=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],k=function(e,r){var n=e.filePos;null!=r.raw||(r.raw={}),null!=(u=r.raw).TAG||(u.TAG=(0,p.readBytes)(e,m-3)),e.filePos=n;var a=_(e,30);a&&(null!=r.title||(r.title=a));var i=_(e,30);i&&(null!=r.artist||(r.artist=i));var s=_(e,30);s&&(null!=r.album||(r.album=s));var o=Number.parseInt(_(e,4),10);Number.isInteger(o)&&o>0&&(null!=r.date||(r.date=new Date(o,0,1)));var c=(0,p.readBytes)(e,30);if(0===c[28]&&0!==c[29]){var u,l,d=c[29];d>0&&(null!=r.trackNumber||(r.trackNumber=d)),e.skip(-30),l=_(e,28),e.skip(2)}else e.skip(-30),l=_(e,30);l&&(null!=r.comment||(r.comment=l));var f=(0,p.readU8)(e);f0&&(null!=n.trackNumber||(n.trackNumber=S)),T&&Number.isInteger(T)&&T>0&&(null!=n.tracksTotal||(n.tracksTotal=T));break;case"TPOS":case"TPA":var x=i.readId3V2EncodingAndText(l).split("/"),I=Number.parseInt(x[0],10),E=x[1]&&Number.parseInt(x[1],10);Number.isInteger(I)&&I>0&&(null!=n.discNumber||(n.discNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=n.discsTotal||(n.discsTotal=E));break;case"TCON":case"TCO":var j=i.readId3V2EncodingAndText(l),P=/^\((\d+)\)/.exec(j);if(P){var C=Number.parseInt(P[1]);if(void 0!==b[C]){null!=n.genre||(n.genre=b[C]);break}}if(P=/^\d+$/.exec(j)){var A=Number.parseInt(P[0]);if(void 0!==b[A]){null!=n.genre||(n.genre=b[A]);break}}null!=n.genre||(n.genre=j);break;case"TDRC":case"TDAT":var B=new Date(i.readId3V2EncodingAndText(l));Number.isNaN(B.getTime())||null!=n.date||(n.date=B);break;case"TYER":case"TYE":var M=Number.parseInt(i.readId3V2EncodingAndText(l),10);Number.isInteger(M)&&(null!=n.date||(n.date=new Date(M,0,1)));break;case"USLT":case"ULT":var D=i.readU8();i.pos+=3,i.readId3V2Text(D,l),null!=n.lyrics||(n.lyrics=i.readId3V2Text(D,l));break;case"COMM":case"COM":var F=i.readU8();i.pos+=3,i.readId3V2Text(F,l),null!=n.comment||(n.comment=i.readId3V2Text(F,l));break;case"APIC":case"PIC":var R=i.readId3V2TextEncoding(),U=void 0;if(2===r.majorVersion){var O=i.readAscii(3);U="PNG"===O?"image/png":"JPG"===O?"image/jpeg":"image/*"}else U=i.readId3V2Text(R,l);var L=i.readU8(),N=i.readId3V2Text(R,l).trimEnd(),V=l-i.pos;if(V>=0){var z=i.readBytes(V);n.images||(n.images=[]),n.images.push({data:z,mimeType:U,kind:3===L?"coverFront":4===L?"coverBack":"unknown",description:N})}break;default:i.pos+=c.size}i.pos=l}},w=function(){"use strict";function e(r,n){(0,l._)(this,e),this.header=r,this.bytes=n,this.pos=0,this.view=new DataView(n.buffer,n.byteOffset,n.byteLength)}return(0,d._)(e,[{key:"frameHeaderSize",value:function(){return 2===this.header.majorVersion?6:10}},{key:"ununsynchronizeAll",value:function(){for(var e=[],r=0;re.bytes.length)return!1;if(n<=e.bytes.length-e.frameHeaderSize()){e.pos+=r;var a=e.readAscii(4);if("\0\0\0\0"!==a&&!/[0-9A-Z]{4}/.test(a))return!1}return!0};if(!c(i)){var u=4===this.header.majorVersion?a:(0,f.decodeSynchsafe)(a);c(u)&&(i=u)}return this.pos=o,{id:n,size:i,flags:s}}},{key:"readId3V2TextEncoding",value:function(){var e=this.readU8();if(e>3)throw Error("Unsupported text encoding: ".concat(e));return e}},{key:"readId3V2Text",value:function(e,r){var n=this.pos,a=this.readBytes(r-this.pos);switch(e){case c.ISO_8859_1:for(var i="",s=0;s=e)return"";var r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}]),e}(),T=function(){"use strict";function e(r){(0,l._)(this,e),this.helper=new Uint8Array(8),this.helperView=(0,h.toDataView)(this.helper),this.writer=r}return(0,d._)(e,[{key:"writeId3V2Tag",value:function(e){var r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);var n=this.writer.getPos(),a=new Set,i=!0,s=!1,o=void 0;try{for(var u,l=(0,h.keyValueIterator)(e)[Symbol.iterator]();!(i=(u=l.next()).done);i=!0){var d=u.value,f=d.key,p=d.value;switch(f){case"title":this.writeId3V2TextFrame("TIT2",p),a.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",p),a.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",p),a.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",p),a.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",p),a.add("TPE2");break;case"trackNumber":var m=void 0!==e.tracksTotal?"".concat(p,"/").concat(e.tracksTotal):p.toString();this.writeId3V2TextFrame("TRCK",m),a.add("TRCK");break;case"discNumber":var g=void 0!==e.discsTotal?"".concat(p,"/").concat(e.discsTotal):p.toString();this.writeId3V2TextFrame("TPOS",g),a.add("TPOS");break;case"genre":this.writeId3V2TextFrame("TCON",p),a.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",p.toISOString().slice(0,10)),a.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(p),a.add("USLT");break;case"comment":this.writeId3V2CommentFrame(p),a.add("COMM");break;case"images":var b={coverFront:3,coverBack:4,unknown:0},k=!0,_=!1,y=void 0;try{for(var S,w=p[Symbol.iterator]();!(k=(S=w.next()).done);k=!0){var T,x,I=S.value,E=null!=(T=b[I.kind])?T:0,j=null!=(x=I.description)?x:"";this.writeId3V2ApicFrame(I.mimeType,E,j,I.data)}}catch(e){_=!0,y=e}finally{try{k||null==w.return||w.return()}finally{if(_)throw y}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,h.assertNever)(f)}}}catch(e){s=!0,o=e}finally{try{i||null==l.return||l.return()}finally{if(s)throw o}}if(e.raw)for(var P in e.raw){var C=e.raw[P];if(!(null==C||4!==P.length||a.has(P))){var A=void 0;if("string"==typeof C){var B=h.textEncoder.encode(C);(A=new Uint8Array(B.byteLength+2))[0]=c.UTF_8,A.set(B,1)}else{if(!(C instanceof Uint8Array))continue;A=C}this.writeAscii(P),this.writeSynchsafeU32(A.byteLength),this.writeU16(0),this.writer.write(A)}}var M=this.writer.getPos(),D=M-n;return this.writer.seek(r+6),this.writeSynchsafeU32(D),this.writer.seek(M),D+10}},{key:"writeU8",value:function(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}},{key:"writeU16",value:function(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}},{key:"writeU32",value:function(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeAscii",value:function(e){for(var r=0;r=7&&1===l.data[0]&&118===l.data[1]&&111===l.data[2]&&114===l.data[3]&&98===l.data[4]&&105===l.data[5]&&115===l.data[6]))return[3,9];return[4,this.readVorbisMetadata(l,u)];case 8:return f.sent(),[3,11];case 9:if(!(l.data.byteLength>=8&&79===l.data[0]&&112===l.data[1]&&117===l.data[2]&&115===l.data[3]&&72===l.data[4]&&101===l.data[5]&&97===l.data[6]&&100===l.data[7]))return[3,11];return[4,this.readOpusMetadata(l,u)];case 10:f.sent(),f.label=11;case 11:null!==u.codecInfo.codec&&this.tracks.push(new(0,b.InputAudioTrack)(this.input,new I(u,this))),f.label=12;case 12:return a=!0,[3,6];case 13:return[3,16];case 14:return d=f.sent(),i=!0,s=d,[3,16];case 15:try{a||null==o.return||o.return()}finally{if(i)throw s}return[7];case 16:return[2]}})}).call(e)]})}).call(this)}},{key:"readVorbisMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.findNextPacketStart(e)];case 1:case 3:if(!(n=d.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=d.sent()))return[2];return[4,this.findNextPacketStart(a)];case 4:if(!(i=d.sent())||3!==a.data[0]||5!==i.data[0])return[2];return s=[],(o=function(e){for(;s.push(Math.min(255,e)),!(e<255);)e-=255})(e.data.length),o(a.data.length),(c=new Uint8Array(1+s.length+e.data.length+a.data.length+i.data.length))[0]=2,c.set(s,1),c.set(e.data,1+s.length),c.set(a.data,1+s.length+e.data.length),c.set(i.data,1+s.length+e.data.length+a.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=i,r.numberOfChannels=(u=(0,_.toDataView)(e.data)).getUint8(11),r.sampleRate=u.getUint32(12,!0),l=u.getUint8(28),r.codecInfo.vorbisInfo={blocksizes:[1<<(15&l),1<<(l>>4)],modeBlockflags:(0,m.parseModesFromVorbisSetupPacket)(i.data).modeBlockflags},(0,m.readVorbisComments)(a.data.subarray(7),this.metadataTags),[2]}})}).call(this)}},{key:"readOpusMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,h._)(this,function(s){switch(s.label){case 0:return[4,this.findNextPacketStart(e)];case 1:if(!(n=s.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=s.sent()))return[2];return r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=a,r.numberOfChannels=(i=(0,m.parseOpusIdentificationHeader)(e.data)).outputChannelCount,r.sampleRate=p.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:i.preSkip},(0,m.readVorbisComments)(a.data.subarray(8),this.metadataTags),[2]}})}).call(this)}},{key:"readPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,d,f,p,m,g,b,k,y;return(0,h._)(this,function(h){switch(h.label){case 0:for((0,_.assert)(rn?s=p.headerStartPos:(i=p,o.push(p)),[3,2];case 12:return[3,2];case 13:k=a.startPage,x=!0,I=!1,P=void 0;try{for(C=o[Symbol.iterator]();!(x=(A=C.next()).done)&&(B=A.value).granulePosition!==i.granulePosition;x=!0)(!k||B.headerStartPos>k.headerStartPos)&&(k=B)}catch(e){I=!0,P=e}finally{try{x||null==C.return||C.return()}finally{if(I)throw P}}D=[M=k],h.label=14;case 14:if(M.serialNumber===this.bitstream.serialNumber&&M.granulePosition===i.granulePosition)return[3,17];if(F=M.headerStartPos+M.totalSize,!((R=this.demuxer.reader.requestSliceRange(F,T.MIN_PAGE_HEADER_SIZE,T.MAX_PAGE_HEADER_SIZE))instanceof Promise))return[3,16];return[4,R];case 15:R=h.sent(),h.label=16;case 16:return(0,_.assert)(R),U=(0,T.readPageHeader)(R),(0,_.assert)(U),(M=U).serialNumber===this.bitstream.serialNumber&&D.push(M),[3,14];case 17:if((0,_.assert)(-1!==M.granulePosition),O=null,V=M,z=0,M.headerStartPos!==a.startPage.headerStartPos)return[3,18];return L=this.granulePositionToTimestampInSamples(0),N=!0,O=0,[3,20];case 18:for(L=0,N=!1,H=M.lacingValues.length-1;H>=0;H--)if(M.lacingValues[H]<255){O=H+1;break}if(null===O)throw Error("Invalid page with granule position: no packets end on this page.");return z=O-1,G={data:y.PLACEHOLDER_DATA,endPage:V,endSegmentIndex:z},[4,this.demuxer.findNextPacketStart(G)];case 19:if(h.sent())q=j(D,M,O),(0,_.assert)(q),(W=E(D,q.page,q.segmentIndex))&&(M=W.page,O=W.segmentIndex);else for(;(K=j(D,M,O))&&(X=E(D,K.page,K.segmentIndex));)if(M=X.page,O=X.segmentIndex,K.page.headerStartPos!==V.headerStartPos){V=K.page,z=K.segmentIndex;break}h.label=20;case 20:Q=null,Z=null,h.label=21;case 21:if(null===M)return[3,24];return(0,_.assert)(null!==O),[4,this.demuxer.readPacket(M,O)];case 22:if(!(Y=h.sent())||!(M.headerStartPos===a.startPage.headerStartPos&&On||Math.max(ee.timestampInSamples,0)===n)))return[3,24];return[4,this.demuxer.findNextPacketStart(Y)];case 23:if(!(er=h.sent()))return[3,24];return M=er.startPage,O=er.startSegmentIndex,[3,21];case 24:return[2,Q]}})}).call(this)}},{key:"getPacketSequential",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.sequentialScanMutex.acquire()];case 1:n=d.sent(),d.label=2;case 2:if(d.trys.push([2,,9,10]),e=(a=(0,_.roundIfAlmostInteger)(e*this.internalSampleRate))/this.internalSampleRate,-1===(i=(0,_.binarySearchLessOrEqual)(this.sequentialScanCache,a,function(e){return e.timestampInSamples})))return[3,3];return o=this.sequentialScanCache[i],s=this.createEncodedPacketFromOggPacket(o.packet,{timestampInSamples:o.timestampInSamples,vorbisLastBlocksize:o.vorbisLastBlockSize},r),[3,5];case 3:return[4,this.getFirstPacket(r)];case 4:s=d.sent(),d.label=5;case 5:c=0,d.label=6;case 6:if(!(s&&s.timestampe)return[3,8];return s=u,100==++c&&(c=0,l=this.encodedPacketToMetadata.get(s),(0,_.assert)(l),this.sequentialScanCache.length>0&&(0,_.assert)((0,_.last)(this.sequentialScanCache).timestampInSamples<=l.timestampInSamples),this.sequentialScanCache.push(l)),[3,6];case 8:return[2,s];case 9:return n(),[7];case 10:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}(),E=function(e,r,n){var a=r,i=n;e:for(;;){for(i--;i>=0;i--)if(a.lacingValues[i]<255){i++;break e}if((0,_.assert)(-1===i),!(1&a.headerType)){i=0;break}var s=(0,_.findLast)(e,function(e){return e.headerStartPos0)return{page:r,segmentIndex:n-1};var a=(0,_.findLast)(e,function(e){return e.headerStartPos>>0}var p=function(e){var r=(0,c.toDataView)(e),n=r.getUint32(22,!0);r.setUint32(22,0,!0);for(var a=0,i=0;i>>24^e[i]])>>>0;return r.setUint32(22,n,!0),a},m=function(e,r,n){var a=0,i=null;if(e.length>0)if("vorbis"===r.codec){(0,c.assert)(r.vorbisInfo);var s=r.vorbisInfo.modeBlockflags.length,u=(1<<(0,c.ilog)(s-1))-1<<1,l=(e[0]&u)>>1;if(l>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");var d=n,f=r.vorbisInfo.modeBlockflags[l];if(i=r.vorbisInfo.blocksizes[f],1===f){var h=e[0]&(1|u)+1?1:0;d=r.vorbisInfo.blocksizes[h]}a=null!==d?d+i>>2:0}else"opus"===r.codec&&(a=(0,o.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:a,vorbisBlockSize:i}},g=function(e){var r="audio/ogg";if(e.codecStrings){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","../codec-data.js":"kWTYV","../misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fY5up:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_PAGE_HEADER_SIZE",function(){return c}),i.export(n,"MAX_PAGE_HEADER_SIZE",function(){return u}),i.export(n,"MAX_PAGE_SIZE",function(){return l}),i.export(n,"readPageHeader",function(){return d}),i.export(n,"findNextPageHeader",function(){return f});var s=e("../reader.js"),o=e("./ogg-misc.js"),c=27,u=282,l=65307,d=function(e){var r=e.filePos;if((0,s.readU32Le)(e)!==o.OGGS)return null;e.skip(1);for(var n=(0,s.readU8)(e),a=(0,s.readI64Le)(e),i=(0,s.readU32Le)(e),c=(0,s.readU32Le)(e),u=(0,s.readU32Le)(e),l=(0,s.readU8)(e),d=new Uint8Array(l),f=0;f>>8&255,c=n>>>16&255,u=n>>>24&255;if(79===a||79===i||79===c||79===u){if(e.skip(-4),n===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"8KRfO","./ogg-misc.js":"g1LsD","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cokSU:[function(e,r,n,a){var i,s,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(n),o.export(n,"WaveFormat",function(){return s}),o.export(n,"WaveDemuxer",function(){return T});var c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_call_super.cjs"),l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),p=e("@swc/helpers/cjs/_to_consumable_array.cjs"),m=e("@swc/helpers/cjs/_ts_generator.cjs"),g=e("../demuxer.js"),b=e("../input-track.js"),k=e("../metadata.js"),_=e("../misc.js"),y=e("../packet.js"),S=e("../reader.js"),w=e("../id3.js");(i=s||(s={}))[i.PCM=1]="PCM",i[i.IEEE_FLOAT=3]="IEEE_FLOAT",i[i.ALAW=6]="ALAW",i[i.MULAW=7]="MULAW",i[i.EXTENSIBLE=65534]="EXTENSIBLE";var T=function(e){"use strict";function r(e){var n;return(0,l._)(this,r),(n=(0,u._)(this,r,[e])).metadataPromise=null,n.dataStart=-1,n.dataSize=-1,n.audioInfo=null,n.tracks=[],n.lastKnownPacketIndex=0,n.metadataTags={},n.reader=e._reader,n}return(0,f._)(r,e),(0,d._)(r,[{key:"readMetadata",value:function(){return(0,c._)(function(){var e,r;return(0,m._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,c._)(function(){var e,r,n,a,i,s,o,c,u,l,d,f,h,p,g,k,y,w;return(0,m._)(this,function(m){switch(m.label){case 0:if(!((e=this.reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,e];case 1:e=m.sent(),m.label=2;case 2:if((0,_.assert)(e),n="RIFX"!==(r=(0,S.readAscii)(e,4)),a="RF64"===r,i=(0,S.readU32)(e,n),o=a?this.reader.fileSize:Math.min(i+8,null!=(s=this.reader.fileSize)?s:1/0),"WAVE"!==(0,S.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");c=0,u=null,l=e.filePos,m.label=3;case 3:if(!(null===o||l=18&&357!==i&&Math.min(r-18,(0,S.readU16)(a,n))>=22&&i===s.EXTENSIBLE&&(a.skip(6),i=(d=(0,S.readBytes)(a,16))[0]|d[1]<<8),(i===s.MULAW||i===s.ALAW)&&(l=8),this.audioInfo={format:i,numberOfChannels:o,sampleRate:c,sampleSizeInBytes:Math.ceil(l/8),blockSizeInBytes:u},[2]}})}).call(this)}},{key:"parseListChunk",value:function(e,r,n){return(0,c._)(function(){var a,i,s,o,c,u,l,d,f,h,g,b,k,_,y,w,T,x,I,E,j,P,C,A,B,M;return(0,m._)(this,function(m){switch(m.label){case 0:if(!((a=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,a];case 1:a=m.sent(),m.label=2;case 2:if(!a||"INFO"!==(i=(0,S.readAscii)(a,4))&&"INF0"!==i)return[2];for(s=a.filePos;s<=e+r-8;){for(h=0,a.filePos=s,u=(0,S.readAscii)(a,4),l=(0,S.readU32)(a,n),d=(0,S.readBytes)(a,l),f=0;h0&&(null!=(w=this.metadataTags).trackNumber||(w.trackNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=(T=this.metadataTags).tracksTotal||(T.tracksTotal=E));break;case"ICRD":case"IDIT":Number.isNaN((P=new Date(g)).getTime())||null!=(j=this.metadataTags).date||(j.date=P);break;case"YEAR":Number.isInteger(A=Number.parseInt(g,10))&&A>0&&(null!=(C=this.metadataTags).date||(C.date=new Date(A,0,1)));break;case"IGNR":case"GENR":null!=(B=this.metadataTags).genre||(B.genre=g);break;case"ICMT":case"CMNT":case"COMM":null!=(M=this.metadataTags).comment||(M.comment=g)}s+=8+l+(1&l)}return[2]}})}).call(this)}},{key:"parseId3Chunk",value:function(e,r){return(0,c._)(function(){var n,a,i;return(0,m._)(this,function(s){switch(s.label){case 0:if(!((n=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,n];case 1:n=s.sent(),s.label=2;case 2:if(!n)return[2];return(a=(0,w.readId3V2Header)(n))&&(i=n.slice(e+10,a.size),(0,w.parseId3V2Tag)(i,a,this.metadataTags)),[2]}})}).call(this)}},{key:"getCodec",value:function(){if((0,_.assert)(this.audioInfo),this.audioInfo.format===s.MULAW)return"ulaw";if(this.audioInfo.format===s.ALAW)return"alaw";if(this.audioInfo.format===s.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===s.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}},{key:"getMimeType",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){return[2,"audio/wav"]})})()}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e;return(0,m._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,_.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getTracks",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.metadataTags]}})}).call(this)}}]),r}(g.Demuxer),x=function(){"use strict";function e(r){(0,l._)(this,e),this.demuxer=r}return(0,d._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return this.demuxer.getCodec()}},{key:"getInternalCodecId",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}},{key:"getDecoderConfig",value:function(){return(0,c._)(function(){var e;return(0,m._)(this,function(r){return(e=this.demuxer.getCodec())?((0,_.assert)(this.demuxer.audioInfo),[2,{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}]):[2,null]})}).call(this)}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e,r,n;return(0,m._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getNumberOfChannels",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"getSampleRate",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getTimeResolution",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return _.UNDETERMINED_LANGUAGE}},{key:"getDisposition",value:function(){return(0,h._)({},k.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,c._)(function(){return(0,m._)(this,function(e){return[2,0]})})()}},{key:"getPacketAtIndex",value:function(e,r){return(0,c._)(function(){var n,a,i,s,o,c,u;return(0,m._)(this,function(l){switch(l.label){case 0:if((0,_.assert)(this.demuxer.audioInfo),(n=2048*e*this.demuxer.audioInfo.blockSizeInBytes)>=this.demuxer.dataSize)return[2,null];if(a=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-n),null!==this.demuxer.reader.fileSize)return[3,3];if(!((i=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,2];return[4,i];case 1:i=l.sent(),l.label=2;case 2:if(!i)return[2,null];l.label=3;case 3:if(!r.metadataOnly)return[3,4];return s=y.PLACEHOLDER_DATA,[3,7];case 4:if(!((o=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,6];return[4,o];case 5:o=l.sent(),l.label=6;case 6:(0,_.assert)(o),s=(0,S.readBytes)(o,a),l.label=7;case 7:return c=2048*e/this.demuxer.audioInfo.sampleRate,u=a/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate,this.demuxer.lastKnownPacketIndex=Math.max(e,c),[2,new(0,y.EncodedPacket)(s,"key",c,u,e,a)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getPacket",value:function(e,r){return(0,c._)(function(){var n,a,i,s;return(0,m._)(this,function(o){switch(o.label){case 0:return(0,_.assert)(this.demuxer.audioInfo),n=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),[4,this.getPacketAtIndex(n,r)];case 1:if(a=o.sent())return[2,a];if(0===n)return[2,null];return(0,_.assert)(null===this.demuxer.reader.fileSize),[4,this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r)];case 2:i=o.sent(),o.label=3;case 3:if(!i)return[3,5];return[4,this.getNextPacket(i,r)];case 4:if(!(s=o.sent()))return[3,5];return i=s,[3,3];case 5:return[2,i]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){(0,_.assert)(this.demuxer.audioInfo);var n=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(n+1,r)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../metadata.js":"eSjom","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../id3.js":"42Y2c","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"5AUBv":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_FRAME_HEADER_SIZE",function(){return c}),i.export(n,"MAX_FRAME_HEADER_SIZE",function(){return u}),i.export(n,"readFrameHeader",function(){return l});var s=e("../misc.js"),o=e("../reader.js"),c=7,u=9,l=function(e){var r=e.filePos,n=(0,o.readBytes)(e,9),a=new(0,s.Bitstream)(n);if(4095!==a.readBits(12)||(a.skipBits(1),0!==a.readBits(2)))return null;var i=a.readBits(1),c=a.readBits(2)+1,u=a.readBits(4);if(15===u)return null;a.skipBits(1);var l=a.readBits(3);if(0===l)throw Error("ADTS frames with channel configuration 0 are not supported.");a.skipBits(1),a.skipBits(1),a.skipBits(1),a.skipBits(1);var d=a.readBits(13);a.skipBits(11);var f=a.readBits(2)+1;if(1!==f)throw Error("ADTS frames with more than one AAC frame are not supported.");var h=null;return 1===i?e.filePos-=2:h=a.readBits(16),{objectType:c,samplingFrequencyIndex:u,channelConfiguration:l,frameLength:d,numberOfAacFrames:f,crcCheck:h,startPos:r}}},{"../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3t0bF":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"AdtsDemuxer",function(){return S});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../codec.js"),p=e("../demuxer.js"),m=e("../input-track.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../reader.js"),_=e("../metadata.js"),y=e("./adts-reader.js"),S=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:return(0,g.assert)(this.firstFrameHeader),this.tracks=[new(0,m.InputAudioTrack)(this.input,new w(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(!((e=this.reader.requestSliceRange(this.lastLoadedPos,y.MIN_FRAME_HEADER_SIZE,y.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,e];case 1:e=o.sent(),o.label=2;case 2:if(!e||!(r=(0,y.readFrameHeader)(e))||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize)return this.lastSampleLoaded=!0,[2];return this.firstFrameHeader||(this.firstFrameHeader=r),n=h.aacFrequencyTable[r.samplingFrequencyIndex],(0,g.assert)(void 0!==n),a=1024/n,i=r.crcCheck?y.MAX_FRAME_HEADER_SIZE:y.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/n,duration:a,dataStart:r.startPos+i,dataSize:r.frameLength-i},this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/aac"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,{}]})})()}}]),r}(p.Demuxer),w=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return this.getSampleRate()/1024}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"aac"}},{key:"getInternalCodecId",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}},{key:"getNumberOfChannels",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,g.assert)(void 0!==e),e}},{key:"getSampleRate",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,g.assert)(void 0!==e),e}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){return(0,g.assert)(this.demuxer.firstFrameHeader),e=new Uint8Array(3),r=new(0,g.Bitstream)(e),a=(n=this.demuxer.firstFrameHeader).objectType,i=n.samplingFrequencyIndex,s=n.channelConfiguration,a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),[2,{codec:"mp4a.40.".concat(this.demuxer.firstFrameHeader.objectType),numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1s.end-a)return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:s.end-r,isLastFrame:!0}];if(255===(0,k.readU8)(s)){if(c=s.filePos,(0,k.readU8)(s)!==(1===this.blockingBit?249:248)||(s.skip(-2),u=s.filePos-r,!(l=this.readFlacFrameHeader({slice:s,isFirstPacket:!1})))){s.filePos=c;continue}if(0===this.blockingBit){if(l.num-o.num!=1){s.filePos=c;continue}}else if(l.num-o.num!==o.blockSize){s.filePos=c;continue}return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:u,isLastFrame:!1}]}}return[2]}})}).apply(this,arguments)}},{key:"readFlacFrameHeader",value:function(e){var r=e.slice,n=e.isFirstPacket,a=r.filePos,i=(0,k.readBytes)(r,4),s=new(0,g.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,g.assert)(n);var o=s.readBits(1);this.blockingBit=o}else if(1===this.blockingBit){if((0,g.assert)(!n),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,g.assert)(!n),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");var c=(0,y.getBlockSizeOrUncommon)(s.readBits(4));if(!c)return null;(0,g.assert)(this.audioInfo);var u=(0,y.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!u||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;var l=(0,y.readCodedNumber)(r),d=(0,y.readBlockSize)(r,c),f=(0,y.readSampleRate)(r,u);if(null===f||f!==this.audioInfo.sampleRate)return null;var h=r.filePos-a,p=(0,k.readU8)(r);return(r.skip(-h),r.skip(-1),p!==(0,y.calculateCrc8)((0,k.readBytes)(r,h)))?null:{num:l,blockSize:d,sampleRate:f}}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.readMetadata()];case 1:return i.sent(),(0,g.assert)(null!==this.lastLoadedPos),(0,g.assert)(this.audioInfo),e=this.lastLoadedPos,[4,this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length})];case 2:if(!(r=i.sent()))return this.lastSampleLoaded=!0,[2];return a={blockOffset:(n=this.loadedSamples[this.loadedSamples.length-1])?n.blockOffset+n.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size},this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(a),r.isLastFrame&&(this.lastSampleLoaded=!0),[2]}})}).call(this)}}]),r}(p.Demuxer),w=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return"flac"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.audioInfo),[2,{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}]})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(n=this,(0,g.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");return[4,this.demuxer.readingMutex.acquire()];case 1:a=o.sent(),o.label=2;case 2:o.trys.push([2,,9,10]),o.label=3;case 3:if(-1!==(i=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.blockOffset/n.demuxer.audioInfo.sampleRate})))return[3,5];return[4,this.demuxer.advanceReader()];case 4:case 6:return o.sent(),[3,3];case 5:if(!((s=this.demuxer.loadedSamples[i]).blockOffset/this.demuxer.audioInfo.sampleRate+s.blockSize/this.demuxer.audioInfo.sampleRate<=e))return[3,7];if(this.demuxer.lastSampleLoaded)return[2,this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r)];return[4,this.demuxer.advanceReader()];case 7:return[2,this.getPacketAtIndex(i,r)];case 8:return[3,10];case 9:return a(),[7];case 10:return[2]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:if(i.trys.push([2,,6,7]),a=e.sequenceNumber+1,this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return[2,null];i.label=3;case 3:if(!(a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return i.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(a,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:if(!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.byteOffset,n.byteSize))instanceof Promise))return[3,3];return[4,i];case 2:i=c.sent(),c.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.byteSize),c.label=4;case 4:return(0,g.assert)(this.demuxer.audioInfo),s=n.blockOffset/this.demuxer.audioInfo.sampleRate,o=n.blockSize/this.demuxer.audioInfo.sampleRate,[2,new(0,b.EncodedPacket)(a,"key",s,o,e,n.byteSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:if(!(0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,2];return[4,this.demuxer.advanceReader()];case 1:return r.sent(),[3,0];case 2:return[2,this.getPacketAtIndex(0,e)]}})}).call(this)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../codec-data.js":"kWTYV","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../metadata.js":"eSjom","./flac-misc.js":"4iR5P","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4iR5P":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"getBlockSizeOrUncommon",function(){return c}),i.export(n,"getSampleRateOrUncommon",function(){return u}),i.export(n,"readCodedNumber",function(){return l}),i.export(n,"readBlockSize",function(){return d}),i.export(n,"readSampleRate",function(){return f}),i.export(n,"calculateCrc8",function(){return h});var s=e("../misc.js"),o=e("../reader.js"),c=function(e){if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*Math.pow(2,e);if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return Math.pow(2,e);else return null},u=function(e,r){switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},l=function(e){for(var r=0,n=new(0,s.Bitstream)((0,o.readBytes)(e,1));1===n.readBits(1);)r++;if(0===r)return n.readBits(7);for(var a=[],i=r-1,c=new(0,s.Bitstream)((0,o.readBytes)(e,i)),u=8-r-1,l=0;l=u&&(a.emit("timeupdate"),P=i),Number.isFinite(E)&&e>=E){L(),a.emit("ended");return}S&&S.timestamp<=e?(n.clearRect(0,0,r.width,r.height),n.drawImage(S.canvas,0,0),S=null,U(T),C&&(a.emit("canplay"),a.emit("playing"),C=!1)):!S&&(U(T),!S&&Number.isFinite(E)&&e=0&&a.splice(i,1)}},emit:function(r,n){var a=new Event(r);a.detail=n;var i=e.get(r);i&&i.forEach(function(e){return e(a)})}}}i.defineInteropFlag(n),i.export(n,"createVideoEventTarget",function(){return s})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}]},["OIaIB"],"OIaIB","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs new file mode 100644 index 000000000..b2a72829b --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs @@ -0,0 +1,8 @@ + +/*! + * artplayer-proxy-mediabunny.js v1.0.0 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2025 Harvey Zack + * Released under the MIT License. + */ +!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},m=d.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!m[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=m[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return m[r].exports;function u(e){var r=u.resolve(e);return!1===r?{}:p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=h,this.exports={}},p.modules=e,p.cache=m,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"dQEB4","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dQEB4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"1TXLF","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1TXLF":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,m=!!i.muted,h=1;n.setVolume(u,m);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return h},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;h=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),m=!1,n.setVolume(u,m),s.emit("volumechange")},get muted(){return m},set muted(v){m=!!v,n.setVolume(u,m),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"6K82w","../utils/clamp.js":"3foPY","./videoEvents.js":"3OoKk","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6K82w":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,m=0,h=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,h=null,m=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,m=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;h={code:4,message:e.message},m=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,h={code:4,message:e.message},m=3,a.emit("error")}else await p}async function k(){l&&(l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return m},get error(){return h},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"ijI2X","./videoEngine.js":"8Stti","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ijI2X:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,m=!0,h=.7,p=!1,f=1,g=0,k=new Set;function b(){return m?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:h;s.gain.value=e*e}function S(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function y(){for(let e of k)e.stop();k.clear()}async function x(){await o?.return(),o=null}async function I(r){if(a)for(await x(),o=a.buffers(b());;){let a;if(r!==g||m)return;let n=o.next(),u=setInterval(()=>{if(r!==g||m)return void clearInterval(u);"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||m)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:h,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=h,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,S=T+h.duration/f;S>d&&(d=S),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function w(){m||(c=b(),m=!0,x(),y())}return{load:async function e(e,i){let s=++g;await x(),y(),m=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,S(),i&&i();return}S(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){m&&(i||S(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,m=!1,I(++g))},pause:w,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,m||I(g)},destroy:function(){g++,w(),i?.close(),i=null,r=null,a=null},setVolume(e,r){h=e,p=r,T()},setPlaybackRate(e){e!==f&&(m||(c=b(),l=i.currentTime),f=e,m||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return m}}}},{mediabunny:"6tWT7","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6tWT7":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Output",()=>n.Output),s.export(a,"OutputFormat",()=>o.OutputFormat),s.export(a,"AdtsOutputFormat",()=>o.AdtsOutputFormat),s.export(a,"FlacOutputFormat",()=>o.FlacOutputFormat),s.export(a,"IsobmffOutputFormat",()=>o.IsobmffOutputFormat),s.export(a,"MkvOutputFormat",()=>o.MkvOutputFormat),s.export(a,"MovOutputFormat",()=>o.MovOutputFormat),s.export(a,"Mp3OutputFormat",()=>o.Mp3OutputFormat),s.export(a,"Mp4OutputFormat",()=>o.Mp4OutputFormat),s.export(a,"OggOutputFormat",()=>o.OggOutputFormat),s.export(a,"WavOutputFormat",()=>o.WavOutputFormat),s.export(a,"WebMOutputFormat",()=>o.WebMOutputFormat),s.export(a,"MediaSource",()=>l.MediaSource),s.export(a,"VideoSource",()=>l.VideoSource),s.export(a,"AudioSource",()=>l.AudioSource),s.export(a,"SubtitleSource",()=>l.SubtitleSource),s.export(a,"AudioBufferSource",()=>l.AudioBufferSource),s.export(a,"AudioSampleSource",()=>l.AudioSampleSource),s.export(a,"CanvasSource",()=>l.CanvasSource),s.export(a,"EncodedAudioPacketSource",()=>l.EncodedAudioPacketSource),s.export(a,"EncodedVideoPacketSource",()=>l.EncodedVideoPacketSource),s.export(a,"MediaStreamAudioTrackSource",()=>l.MediaStreamAudioTrackSource),s.export(a,"MediaStreamVideoTrackSource",()=>l.MediaStreamVideoTrackSource),s.export(a,"TextSubtitleSource",()=>l.TextSubtitleSource),s.export(a,"VideoSampleSource",()=>l.VideoSampleSource),s.export(a,"VIDEO_CODECS",()=>c.VIDEO_CODECS),s.export(a,"AUDIO_CODECS",()=>c.AUDIO_CODECS),s.export(a,"PCM_AUDIO_CODECS",()=>c.PCM_AUDIO_CODECS),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c.NON_PCM_AUDIO_CODECS),s.export(a,"SUBTITLE_CODECS",()=>c.SUBTITLE_CODECS),s.export(a,"canEncode",()=>d.canEncode),s.export(a,"canEncodeVideo",()=>d.canEncodeVideo),s.export(a,"canEncodeAudio",()=>d.canEncodeAudio),s.export(a,"canEncodeSubtitles",()=>d.canEncodeSubtitles),s.export(a,"getEncodableCodecs",()=>d.getEncodableCodecs),s.export(a,"getEncodableVideoCodecs",()=>d.getEncodableVideoCodecs),s.export(a,"getEncodableAudioCodecs",()=>d.getEncodableAudioCodecs),s.export(a,"getEncodableSubtitleCodecs",()=>d.getEncodableSubtitleCodecs),s.export(a,"getFirstEncodableVideoCodec",()=>d.getFirstEncodableVideoCodec),s.export(a,"getFirstEncodableAudioCodec",()=>d.getFirstEncodableAudioCodec),s.export(a,"getFirstEncodableSubtitleCodec",()=>d.getFirstEncodableSubtitleCodec),s.export(a,"Quality",()=>d.Quality),s.export(a,"QUALITY_VERY_LOW",()=>d.QUALITY_VERY_LOW),s.export(a,"QUALITY_LOW",()=>d.QUALITY_LOW),s.export(a,"QUALITY_MEDIUM",()=>d.QUALITY_MEDIUM),s.export(a,"QUALITY_HIGH",()=>d.QUALITY_HIGH),s.export(a,"QUALITY_VERY_HIGH",()=>d.QUALITY_VERY_HIGH),s.export(a,"Target",()=>u.Target),s.export(a,"BufferTarget",()=>u.BufferTarget),s.export(a,"FilePathTarget",()=>u.FilePathTarget),s.export(a,"NullTarget",()=>u.NullTarget),s.export(a,"StreamTarget",()=>u.StreamTarget),s.export(a,"ALL_TRACK_TYPES",()=>n.ALL_TRACK_TYPES),s.export(a,"Source",()=>m.Source),s.export(a,"BlobSource",()=>m.BlobSource),s.export(a,"BufferSource",()=>m.BufferSource),s.export(a,"FilePathSource",()=>m.FilePathSource),s.export(a,"StreamSource",()=>m.StreamSource),s.export(a,"ReadableStreamSource",()=>m.ReadableStreamSource),s.export(a,"UrlSource",()=>m.UrlSource),s.export(a,"InputFormat",()=>h.InputFormat),s.export(a,"AdtsInputFormat",()=>h.AdtsInputFormat),s.export(a,"IsobmffInputFormat",()=>h.IsobmffInputFormat),s.export(a,"MatroskaInputFormat",()=>h.MatroskaInputFormat),s.export(a,"Mp3InputFormat",()=>h.Mp3InputFormat),s.export(a,"Mp4InputFormat",()=>h.Mp4InputFormat),s.export(a,"OggInputFormat",()=>h.OggInputFormat),s.export(a,"QuickTimeInputFormat",()=>h.QuickTimeInputFormat),s.export(a,"WaveInputFormat",()=>h.WaveInputFormat),s.export(a,"WebMInputFormat",()=>h.WebMInputFormat),s.export(a,"FlacInputFormat",()=>h.FlacInputFormat),s.export(a,"ALL_FORMATS",()=>h.ALL_FORMATS),s.export(a,"ADTS",()=>h.ADTS),s.export(a,"MATROSKA",()=>h.MATROSKA),s.export(a,"MP3",()=>h.MP3),s.export(a,"MP4",()=>h.MP4),s.export(a,"OGG",()=>h.OGG),s.export(a,"QTFF",()=>h.QTFF),s.export(a,"WAVE",()=>h.WAVE),s.export(a,"WEBM",()=>h.WEBM),s.export(a,"FLAC",()=>h.FLAC),s.export(a,"Input",()=>p.Input),s.export(a,"InputDisposedError",()=>p.InputDisposedError),s.export(a,"InputTrack",()=>f.InputTrack),s.export(a,"InputVideoTrack",()=>f.InputVideoTrack),s.export(a,"InputAudioTrack",()=>f.InputAudioTrack),s.export(a,"EncodedPacket",()=>g.EncodedPacket),s.export(a,"AudioSample",()=>k.AudioSample),s.export(a,"VideoSample",()=>k.VideoSample),s.export(a,"AudioBufferSink",()=>b.AudioBufferSink),s.export(a,"AudioSampleSink",()=>b.AudioSampleSink),s.export(a,"BaseMediaSampleSink",()=>b.BaseMediaSampleSink),s.export(a,"CanvasSink",()=>b.CanvasSink),s.export(a,"EncodedPacketSink",()=>b.EncodedPacketSink),s.export(a,"VideoSampleSink",()=>b.VideoSampleSink),s.export(a,"Conversion",()=>T.Conversion),s.export(a,"CustomVideoDecoder",()=>S.CustomVideoDecoder),s.export(a,"CustomVideoEncoder",()=>S.CustomVideoEncoder),s.export(a,"CustomAudioDecoder",()=>S.CustomAudioDecoder),s.export(a,"CustomAudioEncoder",()=>S.CustomAudioEncoder),s.export(a,"registerDecoder",()=>S.registerDecoder),s.export(a,"registerEncoder",()=>S.registerEncoder),s.export(a,"RichImageData",()=>y.RichImageData),s.export(a,"AttachedFile",()=>y.AttachedFile);var n=e("./output.js"),o=e("./output-format.js"),l=e("./media-source.js"),c=e("./codec.js"),d=e("./encode.js"),u=e("./target.js"),m=e("./source.js"),h=e("./input-format.js"),p=e("./input.js"),f=e("./input-track.js"),g=e("./packet.js"),k=e("./sample.js"),b=e("./media-sink.js"),T=e("./conversion.js"),S=e("./custom-coder.js"),y=e("./metadata.js")},{"./output.js":!1,"./output-format.js":!1,"./media-source.js":!1,"./codec.js":!1,"./encode.js":!1,"./target.js":!1,"./source.js":"108pa","./input-format.js":"gFGfd","./input.js":"6K6yf","./input-track.js":!1,"./packet.js":!1,"./sample.js":!1,"./media-sink.js":"6e2oW","./conversion.js":!1,"./custom-coder.js":!1,"./metadata.js":!1,"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4GUiq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>S),s.export(a,"extractVideoCodecString",()=>y),s.export(a,"buildAudioCodecString",()=>x),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>w),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>C),s.export(a,"buildAacAudioSpecificConfig",()=>P),s.export(a,"OPUS_SAMPLE_RATE",()=>A),s.export(a,"parsePcmCodec",()=>B),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>M),s.export(a,"getAudioEncoderConfigExtension",()=>F),s.export(a,"validateVideoChunkMetadata",()=>N),s.export(a,"validateAudioChunkMetadata",()=>z),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],m=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],h=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=m.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(m),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=h.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(h);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split("."),a=Number(r[1]),i=Number(r[2]);return[1,1,a,2,1,i,3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},S=e=>{let r=e.split("."),a=Number(r[1]),i=r[2],s=Number(i.slice(0,-1)),n=+("H"===i.slice(-1)),o=Number(r[3]),l=r[4]?Number(r[4]):0,c=r[5]?Number(r[5][0]):1;return[129,(a<<5)+s,(n<<7)+((8!==o)<<6)+0+(l<<4)+(c<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},y=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),m=`vp09.${r}.${a}.${i}.${s}`;return(m+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(m=m.slice(0,-g.length)),m}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,m=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,h=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},x=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=C(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},w=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],C=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},P=e=>{let r=w.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},A=48e3,_=/^pcm-([usf])(\d+)+(be)?$/,B=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=_.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(_.test(e))return e;return"webvtt"===e?"webvtt":null},M=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},F=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,O=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,j=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,N=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!O.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!j.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},V=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],z=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!V.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jrq2g:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>m),s.export(a,"writeBits",()=>h),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>S),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>y),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>x),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>w),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>C),s.export(a,"isAllowSharedBufferSource",()=>P),s.export(a,"AsyncMutex",()=>A),s.export(a,"bytesToHexString",()=>_),s.export(a,"reverseBitsU32",()=>B),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>M),s.export(a,"insertSorted",()=>F),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>O),s.export(a,"toAsyncIterator",()=>j),s.export(a,"validateAnyIterable",()=>N),s.export(a,"assertNever",()=>V),s.export(a,"getUint24",()=>z),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>q),s.export(a,"setInt24",()=>W),s.export(a,"setInt64",()=>G),s.export(a,"mapAsyncGenerator",()=>K),s.export(a,"clamp",()=>X),s.export(a,"UNDETERMINED_LANGUAGE",()=>Q),s.export(a,"roundIfAlmostInteger",()=>$),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>em),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>eS),s.export(a,"uint8ArraysAreEqual",()=>ey),s.export(a,"polyfillSymbolDispose",()=>ex),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},h=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),S={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},y=T(S),x={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(x),w={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(w),C=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,P=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class A{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let _=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),B=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},F=(e,r,a)=>{let i=M(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},O=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},j=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},N=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},V=e=>{throw Error(`Unexpected value: ${e}`)},z=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>z(e,r,a)<<8>>8,q=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},W=(e,r,a,i)=>{(a=X(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),q(e,r,a,i)},G=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},K=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),X=(e,r,a)=>Math.max(r,Math.min(a,e)),Q="und",$=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,em=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),eh=null,ep=()=>{if(null!==eh)return eh;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eh=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],"108pa":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Source",()=>d),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>m),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class m extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??h,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),m=0,h=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),h=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ad),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"gFGfd","./misc.js":"jrq2g","./reader.js":"6AkKg","./source.js":"108pa","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gFGfd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>S),s.export(a,"Mp4InputFormat",()=>y),s.export(a,"QuickTimeInputFormat",()=>x),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>w),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>C),s.export(a,"OggInputFormat",()=>P),s.export(a,"FlacInputFormat",()=>A),s.export(a,"AdtsInputFormat",()=>_),s.export(a,"MP4",()=>B),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>M),s.export(a,"WEBM",()=>F),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>O),s.export(a,"FLAC",()=>j),s.export(a,"ALL_FORMATS",()=>N);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),m=e("./mp3/mp3-reader.js"),h=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class S extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class y extends S{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class x extends S{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class w extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,m.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,m.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,h.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class A extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class _ extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let B=new y,D=new x,M=new I,F=new w,R=new E,U=new C,L=new P,O=new _,j=new A,N=[B,D,M,F,U,L,j,R,O]},{"./isobmff/isobmff-demuxer.js":"kdFjc","./matroska/ebml.js":"4qt3Y","./matroska/matroska-demuxer.js":"fO0Ln","./mp3/mp3-demuxer.js":"1xfyp","../shared/mp3-misc.js":"jGy7Y","./id3.js":"8coNE","./mp3/mp3-reader.js":"ixvHZ","./ogg/ogg-demuxer.js":"lRP3H","./wave/wave-demuxer.js":"lP1MW","./adts/adts-reader.js":"iNEYI","./adts/adts-demuxer.js":"b3bBY","./reader.js":"6AkKg","./flac/flac-demuxer.js":"4fsLo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kdFjc:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),m=e("./isobmff-misc.js"),h=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,m.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,h.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-h.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,h.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),m=r.sampleTimingEntries[u],h=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[h],f=m.startDecodeTimestamp+(l-m.startIndex)*m.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)w(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&w(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-h.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,h.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_16_16)(e),(0,h.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,h.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,h.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,h.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let m=null;4&i&&(m=(0,p.readU32Be)(e));let h=u;if(0===c){this.currentFragment.implicitBaseDataOffset=h;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=S(i,a),n=await this.fetchPacketForSampleIndex(s,r);return C(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=x(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let m=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==m?this.internalTrack.fragmentLookupTable[m]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,h.MIN_BOX_HEADER_SIZE,h.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,h.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let S=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},y=(e,r)=>{if(!e.keySampleIndices)return S(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=S(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},x=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let m=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),h=e.chunkOffsets[m],p=u.startSampleIndex+(m-u.startChunkIndex)*u.samplesPerChunk,f=0,g=h;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},w=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},C=e=>0===e.sampleSizes.length},{"../codec.js":"4GUiq","../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","./isobmff-misc.js":"fHhRy","./isobmff-reader.js":"8zjcB","../reader.js":"6AkKg","../metadata.js":"1RzS5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],zx4dz:[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>S),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>y),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>x),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>w),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>C),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>O),u.export(a,"parseOpusIdentificationHeader",()=>j),u.export(a,"parseOpusTocByte",()=>V),u.export(a,"parseModesFromVorbisSetupPacket",()=>z),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>q),u.export(a,"createVorbisComments",()=>W);var m=e("./codec.js"),h=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,h.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,h.assertNever)(r),(0,h.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,h.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],S=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,h.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},y=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,h.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,h.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,h.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,h.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,h.readExpGolomb)(r),c=(0,h.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,h.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,C=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,h.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:m,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:S}=P(l,d);(0,h.readExpGolomb)(l);let y=(0,h.readExpGolomb)(l);3===y&&l.skipBits(1),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&((0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l));let x=(0,h.readExpGolomb)(l),I=(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l);let w=l.readBits(1)?0:d;for(let e=w;e<=d;e++)(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l);(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&A(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,h.readExpGolomb)(l),(0,h.readExpGolomb)(l),l.skipBits(1));let C=(0,h.readExpGolomb)(l);if(_(l,C),l.readBits(1)){let e=(0,h.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,h.Bitstream)(g(e));r.skipBits(16),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,h.readExpGolomb)(r),(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,h.readExpGolomb)(r),(0,h.readSignedExpGolomb)(r),(0,h.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);M=a||i?a&&!i?2:!a&&i?3:0:0}let F=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:m,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:S,minSpatialSegmentationIdc:B,parallelismType:M,chromaFormatIdc:y,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:F}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},P=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,h.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,h.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,h.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,h.readExpGolomb)(e),a=(0,h.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,h.readExpGolomb)(e),e.readBits(1)&&M(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,h.readExpGolomb)(e);return(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),(0,h.readExpGolomb)(e),r}return 0},M=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,h.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,h.readExpGolomb)(e)+1),i&&F(e,l,n),s&&F(e,l,n)}},F=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,h.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=r.readBits(16),d=(c+1)*(r.readBits(16)+1),u=(0,h.last)(m.VP9_LEVEL_TABLE).level;for(let e of m.VP9_LEVEL_TABLE)if(d<=e.maxPictureSize){u=e.level;break}return{profile:i,level:u,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,h.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,h.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},O=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,h.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let m=d+1;e.skipBits(m);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},j=e=>{let r=(0,h.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},N=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],V=e=>({durationInSamples:N[e[0]>>3]}),z=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,h.isChromium)()||(0,h.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,h.Bitstream)(e);r.pos=8*a;let s=(0,h.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,h.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,h.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,h.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,h.assertNever)(e),(0,h.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let q=(e,r)=>{let a=(0,h.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=h.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,h.base64ToBytes)(c),a=(0,h.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=h.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},W=(e,r,a)=>{let i=[e],s=h.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=h.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,h.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),m=0;for(let e of i)u.set(e,m),m+=e.length;return u}},{"./codec.js":"4GUiq","./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"73Qqp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aU0uf:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>m),s.export(a,"InputAudioTrack",()=>h);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof m}isAudioTrack(){return this instanceof h}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./media-sink.js":"6e2oW","./misc.js":"jrq2g","./packet.js":"8dQhf","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"57K5K":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>m),s.export(a,"customAudioEncoders",()=>h),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],m=[],h=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(m.includes(e))return void console.warn("Video encoder already registered.");m.push(e)}else if(e.prototype instanceof c){if(h.includes(e))return void console.warn("Audio encoder already registered.");h.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6e2oW":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>S),s.export(a,"VideoSampleSink",()=>w),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>A),s.export(a,"AudioBufferSink",()=>_);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),m=e("./packet.js"),h=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof m.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof m.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof m.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!h&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class S{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),m=!1,h=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{if(d(),l.timestamp>=r&&(h=!0),h)return void l.close();s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)())},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),S=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let x=b.packets(T??void 0,c);for(await x.next();S&&!h&&!this._track.input._disposed;){let e=y(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(S);let r=await x.next();if(r.done)break;S=r.value}await x.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),m=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(m)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,h=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,h=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),m)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{h||(r.stack=e.stack,h=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!m;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(m)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},S=async()=>{await s.flush();for(let e=0;e{h||(h=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(h)throw k(),h;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let y=e=>0===e?40:8;class x extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;let c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{let e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){let e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){let r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");let e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class w extends S{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new x(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");let a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s],c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new w(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class C extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;let s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class P extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;let{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,h.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,h.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class A extends S{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new P(e,r,i):new C(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class _{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new A(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"4GUiq","./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./input.js":"6K6yf","./input-track.js":"aU0uf","./misc.js":"jrq2g","./packet.js":"8dQhf","./pcm.js":"3X3Vq","./sample.js":"1yEK7","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8dQhf":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"PLACEHOLDER_DATA",()=>o),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3X3Vq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>m),s.export(a,"validateCropRectangle",()=>h),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");let s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,m=this.displayWidth,h=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,m=i,h=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=m,k=h)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(m)||m<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(h)||h<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:m,sHeight:h}=this._rotateSourceRegion(d,u,m,h,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,S=f+k/2;e.translate(T,S),e.rotate(this.rotation*Math.PI/180);let y=this.rotation%180==0?1:g/k;e.scale(1/y,y),e.drawImage(b,d,u,m,h,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&h(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&m(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],m="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*m,n=c*m,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,m=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},h=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,S(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");let a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");let i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let m=void 0!==s?s:c-u;if(m>c-u)throw RangeError("frameCount out of range");let h=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let y=f?m:m*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},S=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fHhRy:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8zjcB":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>m),s.export(a,"readFixed_2_30",()=>h),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},m=e=>(0,l.readI32Be)(e)/65536,h=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"1RzS5","../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1RzS5":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6AkKg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>m),s.export(a,"readU16",()=>h),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>S),s.export(a,"readI32Le",()=>y),s.export(a,"readU64",()=>x),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>w),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>C),s.export(a,"readF64Be",()=>P),s.export(a,"readAscii",()=>A);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},m=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),h=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),w=e=>0x100000000*S(e)+b(e),E=e=>{let r=T(e);return 0x100000000*y(e)+r},C=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},P=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=(e,r)=>{d(e,r);let a="";for(let i=0;id),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>m),o.export(a,"EBMLUnicodeString",()=>h),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>S),o.export(a,"EBMLWriter",()=>y),o.export(a,"MAX_VAR_INT_SIZE",()=>x),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>w),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>C),o.export(a,"readUnsignedInt",()=>P),o.export(a,"readUnsignedBigInt",()=>A),o.export(a,"readSignedInt",()=>_),o.export(a,"readElementId",()=>B),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>M),o.export(a,"readAsciiString",()=>F),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>O),o.export(a,"CODEC_STRING_MAP",()=>j),o.export(a,"assertDefinedSize",()=>N);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},S=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class y{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=S(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof m){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof h){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let x=8,I=2,w=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},C=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=P(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},B=e=>{let r=E(e);return null===r?null:P(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=C(e))&&(r=null)),r},M=e=>{let r=B(e);return null===r?null:{id:r,size:D(e)}},F=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},O=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var m=e("../codec-data.js"),h=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),S=e("./matroska-misc.js"),y=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let x=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,S.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=x[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=x.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=h.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new C(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,y.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,y.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,y.readI16Be)(e),o=(0,y.readU8)(e),l=(0,y.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,y.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,y.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,y.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,y.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class w{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let m=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),h=-1!==m?this.internalTrack.cuePoints[m]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(h?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,m=(0,T.readElementHeader)(e);if(!m||!T.LEVEL_1_EBML_IDS.includes(m.id)&&m.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let h=m.id,p=m.size,f=e.filePos;if(h===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(h!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(h&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,h.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,m.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,m.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,m.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,m.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class C extends w{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,h.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"zx4dz","../codec.js":"4GUiq","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","./ebml.js":"4qt3Y","./matroska-misc.js":"civYS","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],civYS:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1xfyp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),m=e("../id3.js"),h=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,m.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,h.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,m.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,m.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,m.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=m.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-m.ID3_V1_TAG_SIZE,m.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,m.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>m),s.export(a,"readFrameHeader",()=>h),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,h=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,m=0;16&s?d=8&s?0:1:(d=1,m=1);let h=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+m,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8coNE":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>h),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>S),c.export(a,"Id3V2Writer",()=>y);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),m=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let h=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,m.readBytes)(e,h-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,m.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,m.readU8)(e);d{let a=(0,m.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,m.readAscii)(e,3),i=(0,m.readU8)(e),s=(0,m.readU8)(e),n=(0,m.readU8)(e),o=(0,m.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,m.readBytes)(e,r.size),s=new S(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class S{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class y{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let m=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&m),1<<(m>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,m.EncodedPacket)(a.metadataOnly?m.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let S=null,y=g,x=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,S=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){S=e+1;break}if(null===S)throw Error("Invalid page with granule position: no packets end on this page.");x=S-1;let e={data:m.PLACEHOLDER_DATA,endPage:y,endSegmentIndex:x};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,S);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,S=r.segmentIndex)}else for(;;){let e=T(k,g,S);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,S=r.segmentIndex,e.page.headerStartPos!==y.headerStartPos){y=e.page,x=e.segmentIndex;break}}}let I=null,w=null;for(;null!==g;){(0,u.assert)(null!==S);let e=await this.demuxer.readPacket(g,S);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&Ss||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,S=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>m);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},m=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"zx4dz","../misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],frvPd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>m);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:m+h,dataStartPos:r+m,dataSize:h,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},m=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"6AkKg","./ogg-misc.js":"lbYXN","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lP1MW:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),m=e("../packet.js"),h=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,h.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,h.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,h.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,h.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,h.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,h.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,h.readAscii)(i,4),r=(0,h.readU32)(i,a),s=(0,h.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=m.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,h.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,m.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../id3.js":"8coNE","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNEYI:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let m=i.readBits(2)+1;if(1!==m)throw Error("ADTS frames with more than one AAC frame are not supported.");let h=null;return 1===s?e.filePos-=2:h=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:m,crcCheck:h,startPos:r}}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],b3bBY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,h.MIN_FRAME_HEADER_SIZE,h.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?h.MAX_FRAME_HEADER_SIZE:h.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),m=e("../metadata.js"),h=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,h.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,h.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,h.readCodedNumber)(e),d=(0,h.readBlockSize)(e,n),m=(0,h.readSampleRate)(e,o);if(null===m||m!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,h.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:m}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...m.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../metadata.js":"1RzS5","./flac-misc.js":"G9NqQ","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],G9NqQ:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>m),s.export(a,"calculateCrc8",()=>h);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),m=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,h=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8Stti":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,m=null,h=null,p=0,f=0,g=0,k=0,b=NaN,T=null,S=0,y=!1,x=1,I=!1;async function w(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function C(){await m?.return(),m=null}function P(){r.clearRect(0,0,e.width,e.height)}async function A(e){if(await C(),!u)return;m=u.canvases(e);let i=(await m.next()).value??null;h=(await m.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function _(a){if(m)for(;;){let i=(await m.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,x));if(i.timestamp=i&&(a.emit("timeupdate"),S=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}h&&h.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(h.canvas,0,0),h=null,_(f),y&&(a.emit("canplay"),a.emit("playing"),y=!1)):!h&&(_(f),!h&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3OoKk":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}]},["2x2Ir"],"2x2Ir","parcelRequire4dc0",{});let{default:e}=parcelRequire4dc0("2x2Ir");export{e as default}; \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt b/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt new file mode 100644 index 000000000..7488c6f42 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt @@ -0,0 +1,5067 @@ +--- +url: /guide/extensions/mp3-encoder.md +--- +# @mediabunny/mp3-encoder + +Browsers typically have no support for MP3 encoding in their WebCodecs implementations. Given the ubiquity of the format, this extension package provides an MP3 encoder for use with Mediabunny. It is implemented using Mediabunny's [custom coder API](../supported-formats-and-codecs#custom-coders) and uses a highly-performant WASM build of the [LAME MP3 Encoder](https://lame.sourceforge.io/) under the hood. + +## Installation + +This library peer-depends on Mediabunny. Install both using npm: + +```bash +npm install mediabunny @mediabunny/mp3-encoder +``` + +Alternatively, directly include them using a script tag: + +```html + + +``` + +This will expose the global objects `Mediabunny` and `MediabunnyMp3Encoder`. Use `mediabunny-mp3-encoder.d.ts` to provide types for these globals. You can download the built distribution files from the [releases page](https://github.com/Vanilagy/mediabunny/releases). + +## Usage + +```ts +import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; + +registerMp3Encoder(); +``` + +That's it - Mediabunny now uses the registered MP3 encoder automatically. + +If you want to be more correct, check for native browser support first: + +```ts +import { canEncodeAudio } from 'mediabunny'; +import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; + +if (!(await canEncodeAudio('mp3'))) { + registerMp3Encoder(); +} +``` + +## Example + +Here, we convert an input file to an MP3: + +```ts +import { + Input, + ALL_FORMATS, + BlobSource, + Output, + BufferTarget, + Mp3OutputFormat, + canEncodeAudio, + Conversion, +} from 'mediabunny'; +import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; + +if (!(await canEncodeAudio('mp3'))) { + // Only register the custom encoder if there's no native support + registerMp3Encoder(); +} + +const input = new Input({ + source: new BlobSource(file), // From a file picker, for example + formats: ALL_FORMATS, +}); +const output = new Output({ + format: new Mp3OutputFormat(), + target: new BufferTarget(), +}); + +const conversion = await Conversion.init({ + input, + output, +}); +await conversion.execute(); + +output.target.buffer; // => ArrayBuffer containing the MP3 file +``` + +## Implementation details + +This library implements an MP3 encoder by registering a custom encoder class with Mediabunny. This class, when initialized, spawns a worker which then immediately loads a WASM build of the LAME MP3 encoder. Then, raw data is sent to the worker and encoded data is received from it. These encoded chunks are then concatenated in the main thread and properly split into separate MP3 frames. + +Great care was put into ensuring maximum compatibility of this package; it works with bundlers, directly in the browser, as well as in Node, Deno, and Bun. All code (including worker & WASM) are bundled into a single file, eliminating the need for CDNs or WASM path arguments. This packages therefore serves as a reference implementation of WASM-based encoder extensions for Mediabunny. + +The WASM build itself is a performance-optimized, SIMD-enabled build of LAME 3.100, with all unneeded features disabled. Because maximum performance was the priority, the build is slighter bigger, but ~130 kB gzipped is still very reasonable in my opinion. In my tests, it encodes 5 seconds of audio in ~90 milliseconds (55x real-time speed). + +--- + +--- +url: /guide/converting-media-files.md +--- +# Converting media files + +The [reading](./reading-media-files) and [writing](./writing-media-files) primitives in Mediabunny provide everything you need to convert media files. However, since this is such a common operation and the details can be tricky, Mediabunny ships with a built-in file conversion abstraction. + +It has the following features: + +* Transmuxing (changing the container format) +* Transcoding (changing a track's codec) +* Track removal +* Compression +* Trimming +* Video resizing & fitting +* Video rotation +* Video cropping +* Video frame rate adjustment +* Video transparency removal/preservation +* Audio resampling +* Audio up/downmixing +* User-defined video & audio processing + +The conversion API was built to be simple, versatile and extremely performant. + +## Basic usage + +### Running a conversion + +Each conversion process is represented by an instance of `Conversion`. Create a new instance using `Conversion.init(...)`, then run the conversion using `.execute()`. + +Here, we're converting to WebM: + +```ts +import { + Input, + Output, + WebMOutputFormat, + BufferTarget, + Conversion, +} from 'mediabunny'; + +const input = new Input({ ... }); +const output = new Output({ + format: new WebMOutputFormat(), + target: new BufferTarget(), +}); + +const conversion = await Conversion.init({ input, output }); +if (!conversion.isValid) { + // Conversion is invalid and cannot be executed without error. + // This field gives reasons for why tracks were discarded: + conversion.discardedTracks; // => DiscardedTrack[] + + return; +} + +await conversion.execute(); + +// output.target.buffer contains the final file +``` + +That's it! A `Conversion` simply takes an instance of `Input` and `Output`, then reads the data from the input and writes it to the output. If you're unfamiliar with [`Input`](./reading-media-files) and [`Output`](./writing-media-files), check out their respective guides. + +::: info +The `Output` passed to the `Conversion` must be *fresh*; that is, it must have no added tracks or metadata tags and be in the `'pending'` state (not started yet). +::: + +Unconfigured, the conversion process handles all the details automatically, such as: + +* Copying media data whenever possible, otherwise transcoding it +* Dropping tracks that aren't supported in the output format + +You should consider inspecting `isValid` and the [discarded tracks](#discarded-tracks) before executing a `Conversion`. + +### Monitoring progress + +To monitor the progress of a `Conversion`, set its `onProgress` property *before* calling `execute`: + +```ts +const conversion = await Conversion.init({ input, output }); + +conversion.onProgress = (progress: number) => { + // `progress` is a number between 0 and 1 (inclusive) +}; + +await conversion.execute(); +``` + +This callback is called each time the progress of the conversion advances. + +::: warning +A progress of `1` doesn't indicate the conversion has finished; the conversion is only finished once the promise returned by `.execute()` resolves. +::: + +::: warning +Tracking conversion progress can slightly affect performance as it requires knowledge of the input file's total duration. This is usually negligible but should be avoided when using append-only input sources such as [`ReadableStreamSource`](./reading-media-files#readablestreamsource). +::: + +If you want to monitor the output size of the conversion (in bytes), simply use the `onwrite` callback on your `Target`: + +```ts +let currentFileSize = 0; + +output.target.onwrite = (start, end) => { + currentFileSize = Math.max(currentFileSize, end); +}; +``` + +### Canceling a conversion + +Sometimes, you may want to cancel an ongoing conversion process. For this, use the `cancel` method: + +```ts +await conversion.cancel(); // Resolves once the conversion is canceled +``` + +This automatically frees up all resources used by the conversion process. + +## Video options + +You can set the `video` property in the conversion options to configure the converter's behavior for video tracks. The options are: + +```ts +type ConversionVideoOptions = { + discard?: boolean; + width?: number; + height?: number; + fit?: 'fill' | 'contain' | 'cover'; + rotate?: 0 | 90 | 180 | 270; + allowRotationMetadata?: boolean; + crop?: { left: number; top: number; width: number; height: number }; + frameRate?: number; + codec?: VideoCodec; + bitrate?: number | Quality; + alpha?: 'discard' | 'keep'; // Defaults to 'discard' + keyFrameInterval?: number; + forceTranscode?: boolean; + process?: (sample: VideoSample) => MaybePromise< + CanvasImageSource | VideoSample | (CanvasImageSource | VideoSample)[] | null + >; + processedWidth?: number; + processedHeight?: number; +}; + +type MaybePromise = T | Promise; +``` + +For example, here we resize the video track to 720p: + +```ts +const conversion = await Conversion.init({ + input, + output, + video: { + width: 1280, + height: 720, + fit: 'contain', + }, +}); +``` + +::: info +The provided configuration will apply equally to all video tracks of the input. If you want to apply a separate configuration to each video track, check [track-specific options](#track-specific-options). +::: + +### Discarding video + +If you want to get rid of the video track, use `discard: true`. + +### Resizing video + +The `width`, `height` and `fit` properties control how the video is resized. If only `width` or `height` is provided, the other value is deduced automatically to preserve the video's original aspect ratio. If both are used, `fit` must be set to control the fitting algorithm: + +* `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. +* `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to letterboxing. +* `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. + +If `width` or `height` is used in conjunction with `rotation` or `crop`, they control the post-rotation, post-crop dimensions. + +If you want to apply max/min constraints to a video's dimensions, check out [track-specific options](#track-specific-options). + +In the rare case that the input video changes size over time, the `fit` field can be used to control the size change behavior (see [`VideoEncodingConfig`](./media-sources#video-encoding-config)). When unset, the behavior is `'passThrough'`. + +### Rotating video + +`rotation` rotates the video by the specified number of degrees clockwise. This rotation is applied on top of any rotation metadata in the original input file and happens before cropping and resizing. + +By default, Mediabunny will try to make use of rotation metadata in the output file to perform the rotation whenever possible. However, if you don't want this to happen, or you want to use Mediabunny to strip all rotation metadata from a file, you can set `allowRotationMetadata` to `false`. + +### Cropping video + +`crop` can be used to extract a rectangular region from the original video. The rectangle is specified using `left`, `top`, `width` and `height` and is clamped to the dimensions of the video. Cropping is applied after rotation but before resizing. + +### Adjusting frame rate + +The `frameRate` property can be used to set the frame rate of the output video in Hz. If not specified, the original input frame rate will be used (which may be variable). + +### Transcoding video + +Use the `codec` property to control the codec of the output track. This should be set to a [codec](./supported-formats-and-codecs#video-codecs) supported by the output file, or else the track will be [discarded](#discarded-tracks). + +Use the `bitrate` property to control the bitrate of the output video. For example, you can use this field to compress the video track. Accepted values are the number of bits per second or a [subjective quality](./media-sources#subjective-qualities). If this property is set, transcoding will always happen. If this property is not set but transcoding is still required, `QUALITY_HIGH` will be used as the value. + +Use the `keyFrameInterval` property to control the maximum interval in seconds between key frames in the output video. Setting this fields forces a transcode. + +If you want to prevent direct copying of media data and force a transcoding step, use `forceTranscode: true`. + +### Processing video + +The `process` property can be used to define a custom video sample processing function, e.g. for [applying overlays](./quick-start#add-a-video-overlay), color transformations, or timestamp modifications. You are expected to perform this processing yourself, for example using the Canvas API. + +An example: + +```ts +let ctx: CanvasRenderingContext2D | null = null; +const conversion = await Conversion.init({ + video: { + process: (sample) => { + if (!ctx) { + const canvas = new OffscreenCanvas( + sample.displayWidth, + sample.displayHeight, + ); + ctx = canvas.getContext('2d')!; + + // Convert the video to grayscale + ctx.filter = 'saturate(0)'; + } + + sample.draw(ctx, 0, 0); + + return ctx.canvas; + }, + }, +}); +``` + +The function is called for each input video sample after transformations and frame rate corrections. It must return a [`VideoSample`](./packets-and-samples#videosample), something that can convert to a `VideoSample`, an array of them, or `null` for dropping the frame. + +This function can also be used to manually resize frames. When doing so, you should signal the post-process dimensions using the `processedWidth` and `processedHeight` fields, which enables the encoder to better know what to expect. + +## Audio options + +You can set the `audio` property in the conversion options to configure the converter's behavior for audio tracks. The options are: + +```ts +type ConversionAudioOptions = { + discard?: boolean; + codec?: AudioCodec; + bitrate?: number | Quality; + numberOfChannels?: number; + sampleRate?: number; + forceTranscode?: boolean; + process?: (sample: AudioSample) => MaybePromise< + AudioSample | AudioSample[] | null + >; + processedNumberOfChannels?: number; + processedSampleRate?: number; +}; + +type MaybePromise = T | Promise; +``` + +For example, here we convert the audio track to mono and set a specific sample rate: + +```ts +const conversion = await Conversion.init({ + input, + output, + audio: { + numberOfChannels: 1, + sampleRate: 48000, + }, +}); +``` + +::: info +The provided configuration will apply equally to all audio tracks of the input. If you want to apply a separate configuration to each audio track, check [track-specific options](#track-specific-options). +::: + +### Discarding audio + +If you want to get rid of the audio track, use `discard: true`. + +### Resampling audio + +The `numberOfChannels` property controls the channel count of the output audio (e.g., 1 for mono, 2 for stereo). If this value differs from the number of channels in the input track, Mediabunny will perform up/downmixing of the channel data using [the same algorithm as the Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Basic_concepts_behind_Web_Audio_API#audio_channels). + +The `sampleRate` property controls the sample rate in Hz (e.g., 44100, 48000). If this value differs from the input track's sample rate, Mediabunny will resample the audio. + +### Transcoding audio + +Use the `codec` property to control the codec of the output track. This should be set to a [codec](./supported-formats-and-codecs#audio-codecs) supported by the output file, or else the track will be [discarded](#discarded-tracks). + +Use the `bitrate` property to control the bitrate of the output audio. For example, you can use this field to compress the audio track. Accepted values are the number of bits per second or a [subjective quality](./media-sources#subjective-qualities). If this property is set, transcoding will always happen. If this property is not set but transcoding is still required, `QUALITY_HIGH` will be used as the value. + +If you want to prevent direct copying of media data and force a transcoding step, use `forceTranscode: true`. + +### Processing audio + +The `process` property can be used to define a custom audio sample processing function, e.g. for applying audio effects, transformations, or timestamp modifications. You are expected to perform this processing yourself. + +The function is called for each input audio sample after remixing and resampling. It must return an [`AudioSample`](./packets-and-samples#audiosample), an array of them, or `null` for dropping the sample. + +This function can also be used to manually perform remixing or resampling. When doing so, you should signal the post-process parameters using the `processedNumberOfChannels` and `processedSampleRate` fields, which enables the encoder to better know what to expect. + +## Track-specific options + +You may want to configure your video and audio options differently depending on the specifics of the input track. Or, in case a media file has multiple video or audio tracks, you may want to discard only specific tracks or configure each track separately. + +For this, instead of passing an object for `video` and `audio`, you can instead pass a function: + +```ts +const conversion = await Conversion.init({ + input, + output, + + // Function gets invoked for each video track: + video: (videoTrack, n) => { + if (n > 1) { + // Keep only the first video track + return { discard: true }; + } + + return { + // Shrink width to 640 only if the track is wider + width: Math.min(videoTrack.displayWidth, 640), + }; + }, + + // Async functions work too: + audio: async (audioTrack, n) => { + if (audioTrack.languageCode !== 'rus') { + // Keep only Russian audio tracks + return { discard: true }; + } + + return { + codec: 'aac', + }; + }, +}); +``` + +For documentation about the properties of video and audio tracks, refer to [Reading track metadata](./reading-media-files#reading-track-metadata). + +## Trimming + +Use the `trim` property in the conversion options to extract only a section of the input file into the output file: + +```ts +type ConversionOptions = { + // ... + trim?: { + start: number; // in seconds + end: number; // in seconds + }; + // ... +}; +``` + +For example, here we extract a clip from 10s to 25s: + +```ts +const conversion = await Conversion.init({ + input, + output, + trim: { + start: 10, + end: 25, + }, +}); +``` + +In this case, the output will be 15 seconds long. + +If only `start` is set, the clip will run until the end of the input file. If only `end` is set, the clip will start at the beginning of the input file. + +## Metadata tags + +By default, any [descriptive metadata tags](../api/MetadataTags.md) of the input will be copied to the output. If you want to further control the metadata tags written to the output, you can use the `tags` options: + +```ts +// Set your own metadata: +const conversion = await Conversion.init({ + // ... + tags: { + title: 're:Turning', + artist: 'Alexander Panos', + }, + // ... +}); + +// Or, augment the input's metadata: +const conversion = await Conversion.init({ + // ... + tags: (inputTags) => ({ + ...inputTags, // Keep the existing metadata + images: [{ // And add cover art + data: new Uint8Array(...), + mimeType: 'image/jpeg', + kind: 'coverFront', + }], + comment: undefined, // And remove any comments + }), + // ... +}); + +// Or, remove all metadata +const conversion = await Conversion.init({ + // ... + tags: {}, + // ... +}); +``` + +## Discarded tracks + +If an input track is excluded from the output file, it is considered *discarded*. The list of discarded tracks can be accessed after initializing a `Conversion`: + +```ts +const conversion = await Conversion.init({ input, output }); +conversion.discardedTracks; // => DiscardedTrack[] + +type DiscardedTrack = { + // The track that was discarded + track: InputTrack; + // The reason for discarding the track + reason: + | 'discarded_by_user' + | 'max_track_count_reached' + | 'max_track_count_of_type_reached' + | 'unknown_source_codec' + | 'undecodable_source_codec' + | 'no_encodable_target_codec'; +}; +``` + +Since you can inspect this list before executing a `Conversion`, this gives you the option to decide if you still want to move forward with the conversion process. + +If `isValid` is `false`, then the discarded tracks caused the `Conversion` to become invalid. For example, this can happen when a format requires a specific codec but that codec cannot be encoded. + +*** + +The following reasons exist: + +* `discarded_by_user`\ + You discarded this track by setting `discard: true`. +* `max_track_count_reached`\ + The output had no more room for another track. +* `max_track_count_of_type_reached`\ + The output had no more room for another track of this type, or the output doesn't support this track type at all. +* `unknown_source_codec`\ + We don't know the codec of the input track and therefore don't know what to do with it. +* `undecodable_source_codec`\ + The input track's codec is known, but we are unable to decode it. +* `no_encodable_target_codec`\ + We can't find a codec that we are able to encode and that can be contained within the output format. This reason can be hit if the environment doesn't support the necessary encoders, or if you requested a codec that cannot be contained within the output format. + +*** + +On the flip side, you can always query which input tracks made it into the output: + +```ts +const conversion = await Conversion.init({ input, output }); +conversion.utilizedTracks; // => InputTrack[] +``` + +--- + +--- +url: /examples.md +--- + + +--- + +--- +url: /guide/input-formats.md +--- +# Input formats + +Mediabunny supports a wide variety of commonly used container formats for reading input files. These *input formats* are used in two ways: + +* When creating an `Input`, they are used to specify the list of supported container formats. See [Creating a new input](./reading-media-files#creating-a-new-input) for more. +* Given an existing `Input`, its `getFormat` method returns the *actual* format of the file as an `InputFormat`. + +## Input format properties + +Retrieve the full written name of the format like this: + +```ts +inputFormat.name; // => 'MP4' +``` + +You can also retrieve the format's base MIME type: + +```ts +inputFormat.mimeType; // => 'video/mp4' +``` + +If you want a file's full MIME type, which depends on track codecs, use [`getMimeType`](./reading-media-files#reading-file-metadata) on `Input` instead. + +## Input format singletons + +Since input formats don't require any additional configuration, each input format is directly available as an exported singleton instance: + +```ts +import { + MP4, // MP4 input format singleton + QTFF, // QuickTime File Format input format singleton + MATROSKA, // Matroska input format singleton + WEBM, // WebM input format singleton + MP3, // MP3 input format singleton + WAVE, // WAVE input format singleton + OGG, // Ogg input format singleton + ADTS, // ADTS input format singleton + FLAC, // FLAC input format singleton +} from 'mediabunny'; +``` + +You can use these singletons when creating an input: + +```ts +import { Input, MP3, WAVE, OGG } from 'mediabunny'; + +const input = new Input({ + formats: [MP3, WAVE, OGG], + // ... +}); +``` + +You can also use them for checking the actual format of an `Input`: + +```ts +import { MP3 } from 'mediabunny'; + +const isMp3 = (await input.getFormat()) === MP3; +``` + +There is a special `ALL_FORMATS` constant exported by Mediabunny which contains every input format singleton. Use this constant if you want to support as many formats as possible: + +```ts +import { Input, ALL_FORMATS } from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, + // ... +}); +``` + +::: info +Using `ALL_FORMATS` means [demuxers](https://en.wikipedia.org/wiki/Demultiplexer_\(media_file\)) for all formats must be included in the bundle, which can increase the bundle size significantly. Use it only if you need to support all formats. +::: + +## Input format class hierarchy + +In addition to singletons, input format classes are structured hierarchically: + +* `InputFormat` (abstract) + * `IsobmffInputFormat` (abstract) + * `Mp4InputFormat` + * `QuickTimeInputFormat` + * `MatroskaInputFormat` + * `WebMInputFormat` + * `Mp3InputFormat` + * `WaveInputFormat` + * `OggInputFormat` + * `AdtsInputFormat` + * `FlacInputFormat` + +This means you can also perform input format checks using `instanceof` instead of `===` comparisons. For example: + +```ts +import { Mp3InputFormat } from 'mediabunny'; + +// Check if the file is MP3: +(await input.getFormat()) instanceof Mp3InputFormat; + +// Check if the file is Matroska (MKV + WebM): +(await input.getFormat()) instanceof MatroskaInputFormat; + +// Check if the file is MP4 or QuickTime: +(await input.getFormat()) instanceof IsobmffInputFormat; +``` + +::: info +Well, actually 🤓☝️, the QuickTime File Format is technically not an instance of the ISO Base Media File Format (ISOBMFF) - instead, ISOBMFF is a standard originally inspired by QTFF. However, as the two are extremely similar and are used in the same way, we consider QTFF an instance of `IsobmffInputFormat` for convenience. +::: + +--- + +--- +url: /guide/installation.md +--- +# Installation + +Install Mediabunny using your favorite package manager: + +::: code-group + +```bash [npm] +npm install mediabunny +``` + +```bash [yarn] +yarn add mediabunny +``` + +```bash [pnpm] +pnpm add mediabunny +``` + +```bash [bun] +bun add mediabunny +``` + +::: + +::: info +Requires any JavaScript environment that can run ECMAScript 2021 or later. Mediabunny is expected to be run in modern browsers. For types, TypeScript 5.7 or later is required. +::: + +Then, simply import it like this: + +```ts +import { ... } from 'mediabunny'; // ESM +const { ... } = require('mediabunny'); // or CommonJS +``` + +ESM is preferred because it gives you tree shaking. + +You can also just include the library using a script tag in your HTML: + +```html + +``` + +This will add a `Mediabunny` object to the global scope. You can provide types for this global using `mediabunny.d.ts`. + +You can download a built distribution file from the [releases page](https://github.com/Vanilagy/mediabunny/releases). Use the `*.cjs` builds for normal script tag inclusion, or the `*.mjs` builds for script tags with `type="module"` or direct imports via ESM. Including the `mediabunny.d.ts` declaration file in your TypeScript project will declare a global `Mediabunny` namespace. + +--- + +--- +url: /guide/introduction.md +--- +# Introduction + +Mediabunny is a JavaScript library for reading, writing, and converting media files (like MP4 or WebM), directly in the browser. It aims to be a complete toolkit for high-performance media operations on the web. It's written from scratch in pure TypeScript, has zero dependencies, and is extremely tree-shakable, meaning you only include what you use. You can think of it a bit like [FFmpeg](https://ffmpeg.org/), but built for the web's needs. + +## Features + +Here's a long list of stuff this library does: + +* Reading metadata from media files +* Extracting media data from media files +* Creating new media files +* Converting media files +* Hardware-accelerated decoding & encoding (via the WebCodecs API) +* Support for multiple video, audio and subtitle tracks +* Read & write support for many container formats (.mp4, .mov, .webm, .mkv, .mp3, .wav, .ogg, .aac, .flac), including variations such as MP4 with Fast Start, fragmented MP4, streamable Matroska, transparent WebM, etc. +* Support for 25 different codecs +* Lazy, optimized, on-demand file reading +* Input and output streaming, arbitrary file size support +* File location independence (memory, disk, network, ...) +* Utilities for compression, resizing, rotation, cropping, resampling, trimming +* Metadata tag reading & writing (title, artist, cover art, custom tags, attached files, etc.) +* Transmuxing and transcoding +* Microsecond-accurate reading and writing precision +* Efficient seeking through time +* Pipelined design for efficient hardware usage and automatic backpressure +* Custom encoder & decoder support for polyfilling +* Low- & high-level abstractions for different use cases +* Performant everything +* Node.js support + +...and there's probably more. + +## Use cases + +Mediabunny is a general-purpose toolkit and can be used in infinitely many ways. But, here are a few ideas: + +* File conversion & compression +* Displaying file metadata (duration, dimensions, ...) +* Extracting thumbnails +* Creating videos in the browser +* Building a video editor +* Live recording & streaming +* Efficient, sample-accurate playback of large files via the Web Audio API + +Check out the [Examples](/examples) page for demo implementations of many of these ideas! + +## Getting started + +To get going with Mediabunny, here are some starting points: + +* Check out [Quick start](./quick-start) for a collection of useful code snippets +* Start with [Reading media files](./reading-media-files) if you want to do read operations. +* Start with [Writing media files](./writing-media-files) if you want to do write operations. +* Start with [Converting media files](./converting-media-files) if you care about file conversions. +* Dive into [Packets & samples](./packets-and-samples) for a deeper understanding of the concepts underlying this library. + +## Motivation + +Mediabunny is the evolution of my previous libraries, [mp4-muxer](https://github.com/Vanilagy/mp4-muxer) and [webm-muxer](https://github.com/Vanilagy/webm-muxer), which were both created due to the advent of the WebCodecs API. While they fulfilled their job just fine, I saw a few painpoints: + +* Lots of duplicated code between the two libraries, otherwise very similar API. +* No help with the difficulties of navigating the WebCodecs API & related browser APIs. +* "mp4-demuxer when??" + +This library is the result of unifying these libraries into one, solving all the above issues, and expanding the scope. Now: + +* Changing the output file format is a single-line change; the rest of the API is identical. +* Lots of abstractions on top of the WebCodecs API & browser APIs are provided. +* mp4-demuxer now. + +Due to tree shaking, if you only need an MP4 or WebM muxer, this library's bundle size will still be very small. + +### Migration + +If you're coming from mp4-muxer or webm-muxer, you should migrate to Mediabunny. For that, refer to these guides: + +* [Guide: Migrating from mp4-muxer to Mediabunny](https://github.com/Vanilagy/mp4-muxer/blob/main/MIGRATION-GUIDE.md) +* [Guide: Migrating from webm-muxer to Mediabunny](https://github.com/Vanilagy/webm-muxer/blob/main/MIGRATION-GUIDE.md) + +## Technical overview + +At its core, Mediabunny is a collection of multiplexers and demultiplexers, one of each for every container format. Demultiplexers stream data from *sources*, while multiplexers stream data to *targets*. Every demultiplexer is capable of extracting file metadata as well as compressed media data, while multiplexers write metadata and encoded media data into a new file. + +Mediabunny then provides several wrappers around the WebCodecs API to simplify usage: for reading, it creates decoders with the correct codec configuration and efficiently decodes media data in a pipelined way. For writing, it figures out the necessary codec configuration and sets up encoders which are then used to encode raw media data, while respecting the backpressure applied by the encoder. Extracting the right decoder configuration from a media file can be tricky and sometimes involves diving into encoded media packet bitstreams. + +The conversion abstraction is built on top of Mediabunny's reading and writing primitives and combines them both in a heavily-pipelined way, making sure reading and writing happen in lockstep. It also consists of a lot of conditional logic probing output track compatibility, decoding support, and finding encodable codec configurations. It makes use of the Canvas API for video processing operations, and uses a custom implementation for audio resampling and up/downmixing. + +--- + +--- +url: /guide/media-sinks.md +--- +# Media sinks + +## Introduction + +*Media sinks* offer ways to extract media data from an `InputTrack`. Different media sinks provide different levels of abstraction and cater to different use cases. + +For information on how to obtain input tracks, or how to generally read data from media files, refer to [Reading media files](./reading-media-files). + +### General usage + +> General usage patterns of media sinks will be demonstrated using a fictional `FooSink`. + +Media sinks are like miniature "namespaces" for retrieving media data, scoped to a specific track. This means that you'll typically only need to construct one sink per type for a track. + +```ts +const track = await input.getPrimaryVideoTrack(); +const sink = new FooSink(track); +``` + +Constructing the sink is virtually free and does not perform any media data reads. + +To read media data, each sink offers a different set of methods. You can call these methods as many times as you want; their calls will be independent since media sinks are stateless\[^1]. + +```ts +await sink.getFoo(1); +await sink.getFoo(2); +await sink.getFoo(3); +``` + +\[^1]: Almost: `CanvasSink` becomes stateful when using a [canvas pool](#canvas-pool). + +### Async iterators + +Media sinks make heavy use of [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator). They allow you to iterate over a set of media data (like all frames in a video track) efficiently, only having to read small sections of the file at any given point. + +Async iterators are extremely ergonomic with `for await...of` loops: + +```ts +for await (const foo of sink.foos()) { + console.log(foo.timestamp); +} +``` + +Just like in regular `for` loops, the `break` statement can be used to exit the loop early. This will automatically clean up any internal resources (such as decoders) used by the async iterator: + +```ts +// Loop only over the first 5 foos +let count = 0; +for await (const foo of sink.foos()) { + console.log(foo.timestamp); + if (++count === 5) break; +} +``` + +Async iterators are also useful outside of `for` loops. Here, the `next` method is used to retrieve the next item in the iteration: + +```ts +const foos = sink.foos(); + +const foo1Result = await foos.next(); +const foo2Result = await foos.next(); + +const foo1 = foo1Result.value; // Might be `undefined` if the iteration is complete +``` + +::: warning +When you manually use async iterators, make sure to call `return` on them once you're done: + +```ts +await foos.return(); +``` + +This ensures all internally held resources are freed. +::: + +### Decode vs. presentation order + +Packets may appear out-of-order in the file, meaning the order in which they are decoded does not correspond to the order in which the decoded data is displayed (see [B-frames](./media-sources#b-frames)). The methods on media sinks differ with respect to which ordering they use to query and retrieve packets. So, just keep these definitions in mind: + +* **Presentation order:** The order in which the data is to be presented; sorted by timestamp. +* **Decode order:** The order in which packets must be decoded; not always sorted by timestamp. + +## General sinks + +There is one media sink which can be used with any `InputTrack`: + +### `EncodedPacketSink` + +This sink can be used to extract raw, [encoded packets](./packets-and-samples#encodedpacket) from media files and is the most elementary media sink. `EncodedPacketSink` is useful if you don't care about the decoded media data (for example, you're only interested in timestamps), or if you want to roll your own decoding logic. + +Start by constructing the sink from any `InputTrack`: + +```ts +import { EncodedPacketSink } from 'mediabunny'; + +const sink = new EncodedPacketSink(track); +``` + +You can retrieve specific packets given a timestamp in seconds: + +```ts +await sink.getPacket(5); // => EncodedPacket | null + +// Or, retrieving only packets with type 'key': +await sink.getKeyPacket(5); // => EncodedPacket | null +``` + +When retrieving a packet using a timestamp, the last packet (in [presentation order](#decode-vs-presentation-order)) with a timestamp less than or equal to the search timestamp will be returned. The methods return `null` if there exists no such packet. + +There is a special method for retrieving the first packet (in [decode order](#decode-vs-presentation-order)): + +```ts +await sink.getFirstPacket(); // => EncodedPacket | null +``` + +The last packet (in [presentation order](#decode-vs-presentation-order)) can be retrieved like so: + +```ts +await sink.getPacket(Infinity); // => EncodedPacket | null +``` + +Once you have a packet, you can retrieve the packet's successor (in [decode order](#decode-vs-presentation-order)) like so: + +```ts +await sink.getNextPacket(packet); // => EncodedPacket | null + +// Or jump straight to the next packet with type 'key': +await sink.getNextKeyPacket(packet); // => EncodedPacket | null +``` + +These methods return `null` if there is no next packet. + +These methods can be combined to iterate over a range of packets. Starting from an initial packet, call `getNextPacket` in a loop to iterate over packets: + +```ts +let currentPacket = await sink.getFirstPacket(); +while (currentPacket) { + console.log('Packet:', currentPacket); + // Do something with the packet + + currentPacket = await sink.getNextPacket(currentPacket); +} +``` + +While this approach works, `EncodedPacketSink` also provides a dedicated `packets` iterator function, which iterates over packets in [decode order](#decode-vs-presentation-order): + +```ts +for await (const packet of sink.packets()) { + // ... +} +``` + +You can also constrain the iteration using a packet range, where the iteration will go from the starting packet up to (but excluding) the end packet: + +```ts +const start = await sink.getPacket(5); +const end = await sink.getPacket(10, { metadataOnly: true }); + +for await (const packet of sink.packets(start, end)) { + // ... +} +``` + +The `packets` method is more performant than manual iteration as it will intelligently preload future packets before they are needed. + +#### Verifying key packets + +By default, packet types are determined using the metadata provided by the containing file. Some files can erroneously label some delta packets as key packets, leading to potential decoder errors. To be guaranteed that a key packet is actually a key packet, you can enable the `verifyKeyPackets` option: + +```ts +// If the packet returned by this method has type: 'key', it's guaranteed +// to be a key packet. +await sink.getPacket(5, { verifyKeyPackets: true }); + +// Returned packets are guaranteed to be key packets +await sink.getKeyPacket(10, { verifyKeyPackets: true }); +await sink.getNextKeyPacket(packet, { verifyKeyPackets: true }); + +// Also works for the iterator: +for await (const packet of sink.packets( + undefined, + undefined, + { verifyKeyPackets: true }, +)) { + // ... +} +``` + +::: info +`verifyKeyPackets` only works when `metadataOnly` is not also enabled. +::: + +#### Metadata-only packet retrieval + +Sometimes, you're only interested in a packet's metadata (timestamp, duration, type, ...) and not in its encoded media data. All methods on `EncodedPacketSink` accept a final `options` parameter which you can use to retrieve [metadata-only packets](./packets-and-samples#metadata-only-packets): + +```ts +const packet = await sink.getPacket(5, { metadataOnly: true }); + +packet.isMetadataOnly; // => true +packet.data; // => Uint8Array([]) +``` + +Retrieving metadata-only packets is more efficient for some input formats: Only the metadata section of the file must be read, not the media data section. + +## Video data sinks + +These sinks can only be used with an `InputVideoTrack`. + +### `VideoSampleSink` + +Use this sink to extract decoded [video samples](./packets-and-samples#videosample) (frames) from a video track. The sink will automatically handle the decoding internally. + +::: info +All operations of this sink use [presentation order](#decode-vs-presentation-order). +::: + +Create the sink like so: + +```ts +import { VideoSampleSink } from 'mediabunny'; + +const sink = new VideoSampleSink(videoTrack); +``` + +#### Single retrieval + +You can retrieve the sample presented at a given timestamp in seconds: + +```ts +await sink.getSample(5); + +// Extracting the first sample: +await sink.getSample(await videoTrack.getFirstTimestamp()); + +// Extracting the last sample: +await sink.getSample(Infinity); +``` + +This method returns the last sample with a timestamp less than or equal to the search timestamp, or `null` if there is no such sample. + +#### Range iteration + +You can use the `samples` iterator method to iterate over a contiguous range of samples: + +```ts +// Iterate over all samples: +for await (const sample of sink.samples()) { + console.log('Sample:', sample); + // Do something with the sample + + sample.close(); +} + +// Iterate over all samples in a specific time range: +for await (const sample of sink.samples(5, 10)) { + // ... + sample.close(); +} +``` + +The `samples` iterator yields the samples in [presentation order](#decode-vs-presentation-order) (sorted by timestamp). + +#### Sparse iteration + +Sometimes, you may want to retrieve the samples for multiple timestamps at once (for example, for generating thumbnails). While you could call `getSample` multiple times, the `samplesAtTimestamps` method provides a more efficient way: + +```ts +for await (const sample of sink.samplesAtTimestamps([0, 1, 2, 3, 4, 5])) { + // `sample` is either VideoSample or null + sample.close(); +} + +// Any timestamp sequence is allowed: +sink.samplesAtTimestamps([1, 2, 3]); +sink.samplesAtTimestamps([4, 5, 5, 5]); +sink.samplesAtTimestamps([10, -2, 3]); +``` + +This method is more efficient than multiple calls to `getSample` because it avoids decoding the same packet twice. + +In addition to arrays, you can pass any iterable into this method: + +```ts +sink.samplesAtTimestamps(new Set([2, 3, 3, 4])); + +sink.samplesAtTimestamps((function* () { + for (let i = 0; i < 5; i++) { + yield i; + } +})()); + +sink.samplesAtTimestamps((async function* () { + const firstTimestamp = await videoTrack.getFirstTimestamp(); + const lastTimestamp = await videoTrack.computeDuration(); + + for (let i = 0; i <= 100; i++) { + yield firstTimestamp + (lastTimestamp - firstTimestamp) * i / 100; + } +})()); +``` + +Passing an async iterable is especially useful when paired with `EncodedPacketSink`. Imagine you want to retrieve every key frame. A naive implementation might look like this: + +```ts +// Naive, bad implementation: // [!code error] +const packetSink = new EncodedPacketSink(videoTrack); +const keyFrameTimestamps: number[] = []; + +let currentPacket = await packetSink.getFirstPacket(); +while (currentPacket) { + keyFrameTimestamps.push(currentPacket.timestamp); + currentPacket = await packetSink.getNextKeyPacket(currentPacket); +} + +const sampleSink = new VideoSampleSink(videoTrack); +const keyFrameSamples = sampleSink.samplesAtTimestamps(keyFrameTimestamps); + +for await (const sample of keyFrameSamples) { + // ... + sample.close(); +} +``` + +The issue with this implementation is that it first iterates over all key packets before yielding the first sample. The better implementation is this: + +```ts +// Better implementation: +const packetSink = new EncodedPacketSink(videoTrack); +const sampleSink = new VideoSampleSink(videoTrack); + +const keyFrameSamples = sampleSink.samplesAtTimestamps((async function* () { + let currentPacket = await packetSink.getFirstPacket(); + + while (currentPacket) { + yield currentPacket.timestamp; + currentPacket = await packetSink.getNextKeyPacket(currentPacket); + } +})()); + +for await (const sample of keyFrameSamples) { + // ... + sample.close(); +} +``` + +### `CanvasSink` + +While `VideoSampleSink` extracts raw decoded video samples, you can use `CanvasSink` to extract these samples as canvases instead. In doing so, certain operations such as scaling, rotating, and cropping can also be handled by the sink. The downside is the additional VRAM requirements for the canvases' framebuffers. + +::: info +This sink yields `HTMLCanvasElement` whenever possible, and falls back to `OffscreenCanvas` otherwise (in Worker contexts, for example). +::: + +Create the sink like so: + +```ts +import { CanvasSink } from 'mediabunny'; + +const sink = new CanvasSink(videoTrack, options); +``` + +Here, `options` has the following type: + +```ts +type CanvasSinkOptions = { + width?: number; + height?: number; + fit?: 'fill' | 'contain' | 'cover'; + rotation?: 0 | 90 | 180 | 270; + crop?: { left: number; top: number; width: number; height: number }; + poolSize?: number; +}; +``` + +* `width`\ + The width of the output canvas in pixels. When omitted but `height` is set, the width will be calculated automatically to maintain the original aspect ratio. Otherwise, the width will be set to the original width of the video. +* `height`\ + The height of the output canvas in pixels. When omitted but `width` is set, the height will be calculated automatically to maintain the original aspect ratio. Otherwise, the height will be set to the original height of the video. +* `fit`\ + *Required* when both `width` and `height` are set, this option sets the fitting algorithm to use. + * `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. + * `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to letterboxing. + * `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. +* `rotation`\ + The clockwise rotation by which to rotate the raw video frame. Defaults to the rotation set in the file metadata. Rotation is applied before cropping and resizing. +* `crop`\ + Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to the dimensions of the input video track. Cropping is performed after rotation but before resizing. +* `poolSize`\ + See [Canvas pool](#canvas-pool). + +Some examples: + +```ts +// This sink yields canvases with the unaltered display dimensions of the track, +// and respecting the track's rotation metadata. +new CanvasSink(videoTrack); + +// This sink yields canvases with a width of 1280 and a height that maintains the +// original display aspect ratio. +new CanvasSink(videoTrack, { + width: 1280, +}); + +// This sink yields square canvases, with the video frame scaled to completely +// cover the canvas. +new CanvasSink(videoTrack, { + width: 512, + height: 512, + fit: 'cover', +}); + +// This sink yields canvases with the unaltered coded dimensions of the track, +// and without applying any rotation. +new CanvasSink(videoTrack, { + rotation: 0, +}); +``` + +The methods for retrieving canvases are analogous to those on `VideoSampleSink`: + +* `getCanvas`\ + Gets the canvas for a given timestamp; see [Single retrieval](#single-retrieval). +* `canvases`\ + Iterates over a range of canvases; see [Range iteration](#range-iteration). +* `canvasesAtTimestamps`\ + Iterates over canvases at specific timestamps; see [Sparse iteration](#sparse-iteration). + +These methods yield `WrappedCanvas` instances: + +```ts +type WrappedCanvas = { + // A canvas element or offscreen canvas. + canvas: HTMLCanvasElement | OffscreenCanvas; + // The timestamp of the corresponding video sample, in seconds. + timestamp: number; + // The duration of the corresponding video sample, in seconds. + duration: number; +}; +``` + +#### Canvas pool + +By default, a new canvas is created for every canvas yielded by this sink. If you know you'll keep only a few canvases around at any given time, you should make use of the `poolSize` option. This integer value specifies the number of canvases in the pool; these canvases are then reused in a ring buffer / round-robin type fashion. This keeps the amount of allocated VRAM constant and relieves the browser from constantly allocating/deallocating canvases. A pool size of 0 or `undefined` disables the pool. + +An illustration using a pool size of 3: + +```ts +const sink = new CanvasSink(videoTrack, { poolSize: 3 }); + +const a = await sink.getCanvas(42); +const b = await sink.getCanvas(42); +const c = await sink.getCanvas(42); +const d = await sink.getCanvas(42); +const e = await sink.getCanvas(42); +const f = await sink.getCanvas(42); + +assert(a.canvas === d.canvas); +assert(b.canvas === e.canvas); +assert(c.canvas === f.canvas); +assert(a.canvas !== b.canvas); +assert(a.canvas !== c.canvas); +``` + +For closed iterators, a pool size of 1 is sufficient: + +```ts +const sink = new CanvasSink(videoTrack, { poolSize: 1 }); +const canvases = sink.canvases(); + +for await (const { canvas, timestamp } of canvases) { + // ... +} +``` + +## Audio data sinks + +These sinks can only be used with an `InputAudioTrack`. + +### `AudioSampleSink` + +Use this sink to extract decoded [audio samples](./packets-and-samples#audiosample) from an audio track. The sink will automatically handle the decoding internally. + +Create the sink like so: + +```ts +import { AudioSampleSink } from 'mediabunny'; + +const sink = new AudioSampleSink(audioTrack); +``` + +The methods for retrieving samples are analogous to those on `VideoSampleSink`. + +* `getSample`\ + Gets the sample for a given timestamp; see [Single retrieval](#single-retrieval). +* `samples`\ + Iterates over a range of samples; see [Range iteration](#range-iteration). +* `samplesAtTimestamps`\ + Iterates over samples at specific timestamps; see [Sparse iteration](#sparse-iteration). + +These methods yield [`AudioSample`](./packets-and-samples#audiosample) instances. + +For example, let's use this sink to calculate the average loudness of an audio track using [root mean square](https://en.wikipedia.org/wiki/Root_mean_square): + +```ts +const sink = new AudioSampleSink(audioTrack); + +let sumOfSquares = 0; +let totalSampleCount = 0; + +for await (const sample of sink.samples()) { + const bytesNeeded = sample.allocationSize({ format: 'f32', planeIndex: 0 }); + const floats = new Float32Array(bytesNeeded / 4); + sample.copyTo(floats, { format: 'f32', planeIndex: 0 }); + + for (let i = 0; i < floats.length; i++) { + sumOfSquares += floats[i] ** 2; + } + + totalSampleCount += floats.length; +} + +const averageLoudness = Math.sqrt(sumOfSquares / totalSampleCount); +``` + +### `AudioBufferSink` + +While `AudioSampleSink` extracts raw decoded audio samples, you can use `AudioBufferSink` to directly extract [`AudioBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) instances instead. This is particularly useful when working with the Web Audio API. + +Create the sink like so: + +```ts +import { AudioBufferSink } from 'mediabunny'; + +const sink = new AudioBufferSink(audioTrack); +``` + +The methods for retrieving audio buffers are analogous to those on `VideoSampleSink`: + +* `getBuffer`\ + Gets the buffer for a given timestamp; see [Single retrieval](#single-retrieval). +* `buffers`\ + Iterates over a range of buffers; see [Range iteration](#range-iteration). +* `buffersAtTimestamps`\ + Iterates over buffers at specific timestamps; see [Sparse iteration](#sparse-iteration). + +These methods yield `WrappedAudioBuffer` instances: + +```ts +type WrappedAudioBuffer = { + // An AudioBuffer that can be used with the Web Audio API. + buffer: AudioBuffer; + // The timestamp of the corresponding audio sample, in seconds. + timestamp: number; + // The duration of the corresponding audio sample, in seconds. + duration: number; +}; +``` + +For example, let's use this sink to play the last 10 seconds of an audio track: + +```ts +const sink = new AudioBufferSink(audioTrack); +const audioContext = new AudioContext(); +const lastTimestamp = await audioTrack.computeDuration(); +const baseTime = audioContext.currentTime; + +for await (const { buffer, timestamp } of sink.buffers(lastTimestamp - 10)) { + const source = audioContext.createBufferSource(); + source.buffer = buffer; + source.connect(audioContext.destination); + source.start(baseTime + timestamp); +} +``` + +--- + +--- +url: /guide/media-sources.md +--- +# Media sources + +## Introduction + +*Media sources* provide APIs for adding media data to an output file. Different media sources provide different levels of abstraction and cater to different use cases. + +For information on how to use media sources to create output tracks, check [Writing media files](./writing-media-files). + +Most media sources follow this code pattern to add media data: + +```ts +await mediaSource.add(...); +``` + +### Closing sources + +When you're done using the source, meaning no additional media data will be added, it's best to close the source as soon as possible: + +```ts +mediaSource.close(); +``` + +Closing sources manually is *technically* not required and will happen automatically when finalizing the `Output`. However, if your `Output` has multiple tracks and not all of them finish supplying their data at the same time (for example, adding all audio first and then all video), closing sources early will improve performance and lower memory usage. This is because the `Output` can better "plan ahead", knowing it doesn't have to wait for certain tracks anymore (see [Packet buffering](./writing-media-files#packet-buffering)). Therefore, it is good practice to always manually close all media sources as soon as you are done using them. + +### Backpressure + +Media sources are the means by which backpressure is propagated from the output pipeline into your application logic. The `Output` may want to apply backpressure if the encoders or the [StreamTarget](./writing-media-files#streamtarget)'s writable can't keep up. + +Backpressure is communicated by media sources via promises. All media sources with an `add` method return a promise: + +```ts +mediaSource.add(...); // => Promise +``` + +This promise resolves when the source is ready to receive more data. In most cases, the promise will resolve instantly, but if some part of the output pipeline is overworked, it will remain pending until the output is ready to continue. Therefore, by awaiting this promise, you automatically propagate backpressure into your application logic: + +```ts +// Wrong: // [!code error] +while (notDone) { // [!code error] + mediaSource.add(...); // [!code error] +} // [!code error] + +// Correct: +while (notDone) { + await mediaSource.add(...); +} +``` + +### Video encoding config + +All video sources that handle encoding internally require you to specify a `VideoEncodingConfig`, specifying the codec configuration to use: + +```ts +type VideoEncodingConfig = { + codec: VideoCodec; + bitrate: number | Quality; + alpha?: 'discard' | 'keep'; + bitrateMode?: 'constant' | 'variable'; + latencyMode?: 'quality' | 'realtime'; + keyFrameInterval?: number; + fullCodecString?: string; + hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software'; + scalabilityMode?: string; + contentHint?: string; + sizeChangeBehavior?: 'deny' | 'passThrough' | 'fill' | 'contain' | 'cover'; + + onEncodedPacket?: ( + packet: EncodedPacket, + meta: EncodedVideoChunkMetadata | undefined + ) => unknown; + onEncoderConfig?: ( + config: VideoEncoderConfig + ) => unknown; +}; +``` + +* `codec`: The [video codec](./supported-formats-and-codecs#video-codecs) used for encoding. +* `bitrate`: The target number of bits per second. Alternatively, this can be a [subjective quality](#subjective-qualities). +* `alpha`: What to do with alpha data contained in the video samples. + * `'discard'` (default): Only the samples' color data is kept; the video is opaque. + * `'keep'`: The samples' alpha data is also encoded as side data. Make sure to pair this mode with a container format that supports transparency (such as WebM or Matroska). +* `bitrateMode`: Can be used to control constant vs. variable bitrate. +* `latencyMode`: The latency mode as specified by the WebCodecs API. Browsers default to `quality`. Media stream-driven video sources will automatically use the `realtime` setting. +* `keyFrameInterval`: The maximum interval in seconds between two adjacent key frames. Defaults to 5 seconds. More frequent key frames improve seeking behavior but increase file size. When using multiple video tracks, this value should be set to the same value for all tracks. +* `fullCodecString`: Allows you to optionally specify the full codec string used by the video encoder, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/). For example, you may set it to `'avc1.42001f'` when using AVC. Keep in mind that the codec string must still match the codec specified in `codec`. If you don't set this field, a codec string will be generated automatically. +* `hardwareAcceleration`: A hint that configures the hardware acceleration method of this codec. This is best left on `'no-preference'`. +* `scalabilityMode`: An encoding scalability mode identifier as defined by [WebRTC-SVC](https://w3c.github.io/webrtc-svc/#scalabilitymodes*). +* `contentHint`: An encoding video content hint as defined by [mst-content-hint](https://w3c.github.io/mst-content-hint/#video-content-hints). +* `sizeChangeBehavior`: Video frames may change size overtime. This field controls the behavior in case this happens. Defaults to `'deny'`. +* `onEncodedPacket`: Called for each successfully encoded packet. Useful for determining encoding progress. +* `onEncoderConfig`: Called when the internal encoder config, as used by the WebCodecs API, is created. You can use this to introspect the full codec string. + +### Audio encoding config + +All audio sources that handle encoding internally require you to specify an `AudioEncodingConfig`, specifying the codec configuration to use: + +```ts +type AudioEncodingConfig = { + codec: AudioCodec; + bitrate?: number | Quality; + bitrateMode?: 'constant' | 'variable'; + fullCodecString?: string; + + onEncodedPacket?: ( + packet: EncodedPacket, + meta: EncodedAudioChunkMetadata | undefined + ) => unknown; + onEncoderConfig?: ( + config: AudioEncoderConfig + ) => unknown; +}; +``` + +* `codec`: The [audio codec](./supported-formats-and-codecs#audio-codecs) used for encoding. Can be omitted for uncompressed PCM codecs. +* `bitrate`: The target number of bits per second. Alternatively, this can be a [subjective quality](#subjective-qualities). +* `bitrateMode`: Can be used to control constant vs. variable bitrate. +* `fullCodecString`: Allows you to optionally specify the full codec string used by the audio encoder, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/). For example, you may set it to `'mp4a.40.2'` when using AAC. Keep in mind that the codec string must still match the codec specified in `codec`. If you don't set this field, a codec string will be generated automatically. +* `onEncodedPacket`: Called for each successfully encoded packet. Useful for determining encoding progress. +* `onEncoderConfig`: Called when the internal encoder config, as used by the WebCodecs API, is created. You can use this to introspect the full codec string. + +### Subjective qualities + +Mediabunny provides five subjective quality options as an alternative to manually providing a bitrate. From a subjective quality, a bitrate will be calculated internally based on the codec and track information (width, height, sample rate, ...). + +```ts +import { + QUALITY_VERY_LOW, + QUALITY_LOW, + QUALITY_MEDIUM, + QUALITY_HIGH, + QUALITY_VERY_HIGH, +} from 'mediabunny'; +``` + +## Video sources + +Video sources feed data to video tracks on an `Output`. They all extend the abstract `VideoSource` class. + +### `VideoSampleSource` + +This source takes [video samples](./packets-and-samples#videosample), encodes them, and passes the encoded data to the output. + +```ts +import { VideoSampleSource } from 'mediabunny'; + +const sampleSource = new VideoSampleSource({ + codec: 'avc', + bitrate: 1e6, +}); + +await sampleSource.add(videoSample); +videoSample.close(); // If it's not needed anymore + +// You may optionally force samples to be encoded as key frames: +await sampleSource.add(videoSample, { keyFrame: true }); +``` + +### `CanvasSource` + +This source simplifies a common pattern: A single canvas is repeatedly updated in a render loop and each frame is added to the output file. + +```ts +import { CanvasSource, QUALITY_MEDIUM } from 'mediabunny'; + +const canvasSource = new CanvasSource(canvasElement, { + codec: 'av1', + bitrate: QUALITY_MEDIUM, +}); + +await canvasSource.add(0.0, 0.1); // Timestamp, duration (in seconds) +await canvasSource.add(0.1, 0.1); +await canvasSource.add(0.2, 0.1); + +// You may optionally force frames to be encoded as key frames: +await canvasSource.add(0.3, 0.1, { keyFrame: true }); +``` + +### `MediaStreamVideoTrackSource` + +This is a source for use with the [Media Capture and Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API). Use this source if you want to pipe a real-time video source (such as a webcam or screen recording) to an output file. + +```ts +import { MediaStreamVideoTrackSource } from 'mediabunny'; + +// Get the user's screen +const stream = await navigator.mediaDevices.getDisplayMedia({ video: true }); +const videoTrack = stream.getVideoTracks()[0]; + +const videoTrackSource = new MediaStreamVideoTrackSource(videoTrack, { + codec: 'vp9', + bitrate: 1e7, +}); + +// Make sure to allow any internal errors to properly bubble up +videoTrackSource.errorPromise.catch((error) => ...); +``` + +This source requires no additional method calls; data will automatically be captured and piped to the output file as soon as `start()` is called on the `Output`. Make sure to `stop()` on `videoTrack` after finalizing the `Output` if you don't need the user's media anymore. + +If you want to temporarily stop capturing video frames from this source, you can use the `pause()` and `resume()` methods: + +```ts +videoTrackSource.pause(); + +// Later: +videoTrackSource.resume(); +``` + +While paused, video frames emitted by the stream will be ignored. When resumed, video frames are let through again, offset in timestamp such that the result plays back continuously with no gap in playback. Note that pausing does *not* stop the underlying media stream. + +::: info +If this source is the only MediaStreamTrack source in the `Output`, then the first video sample added by it starts at timestamp 0. If there are multiple, then the earliest media sample across all tracks starts at timestamp 0, and all tracks will be perfectly synchronized with each other. +::: + +::: warning +`MediaStreamVideoTrackSource`'s internals are detached from the typical code flow but can still throw, so make sure to utilize `errorPromise` to deal with any errors and to stop the `Output`. +::: + +### `EncodedVideoPacketSource` + +The most barebones of all video sources, this source can be used to directly pipe [encoded packets](./packets-and-samples#encodedpacket) of video data to the output. This source requires that you take care of the encoding process yourself, which enables you to use the WebCodecs API manually or to plug in your own encoding stack. Alternatively, you may retrieve the encoded packets directly by reading them from another media file, allowing you to skip decoding and reencoding video data. + +```ts +import { EncodedVideoPacketSource } from 'mediabunny'; + +// You must specify the codec name: +const packetSource = new EncodedVideoPacketSource('vp9'); + +await packetSource.add(packet1); +await packetSource.add(packet2); +``` + +> \[!IMPORTANT] +> You must add the packets in decode order. + +You will need to provide additional metadata alongside your first call to `add` to give the `Output` more information about the shape and form of the video data. This metadata must be in the form of the WebCodecs API's `EncodedVideoChunkMetadata`. It might look like this: + +```ts +await packetSource.add(firstPacket, { + decoderConfig: { + codec: 'vp09.00.31.08', + codedWidth: 1280, + codedHeight: 720, + colorSpace: { + primaries: 'bt709', + transfer: 'iec61966-2-1', + matrix: 'smpte170m', + fullRange: false, + }, + description: undefined, + }, +}); +``` + +`codec`, `codedWidth`, and `codedHeight` are required for all codecs, whereas `description` is required for some codecs. Additional fields, such as `colorSpace`, are optional. The [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/) specifies the formats of `codec` and `description` for each video codec, which you must adhere to. + +#### B-frames + +Some video codecs use *B-frames*, which are frames that require both the previous and the next frame to be decoded. For example, you may have something like this: + +```md +Frame 1: 0.0s, I-frame (key frame) +Frame 2: 0.1s, B-frame +Frame 3: 0.2s, P-frame +``` + +The decode order for these frames will be: + +```md +Frame 1 -> Frame 3 -> Frame 2 +``` + +Some file formats have an explicit notion of both a "decode timestamp" and a "presentation timestamp" to model B-frames or out-of-order decoding. However, Mediabunny packets only specify their *presentation timestamp*. Decode order is determined by the order in which you add the packets, so in our example, you must add the packets like this: + +```ts +await packetSource.add(packetForFrame1); // 0.0s +await packetSource.add(packetForFrame3); // 0.2s +await packetSource.add(packetForFrame2); // 0.1s +``` + +You are allowed to provide wildly out-of-order presentation timestamp sequences, but there is a hard constraint: + +> \[!IMPORTANT] +> A packet you add must not have a smaller timestamp than the largest timestamp you added before adding the last key frame. + +This is quite a mouthful, so this example will hopefully clarify it: + +```md +# Legal: +Packet 1: 0.0s, key frame +Packet 2: 0.3s, delta frame +Packet 3: 0.2s, delta frame +Packet 4: 0.1s, delta frame +Packet 5: 0.4s, key frame +Packet 6: 0.5s, delta frame + +# Also legal: +Packet 1: 0.0s, key frame +Packet 2: 0.3s, delta frame +Packet 3: 0.2s, delta frame +Packet 4: 0.1s, delta frame +Packet 5: 0.4s, key frame +Packet 6: 0.35s, delta frame +Packet 7: 0.3s, delta frame +Packet 8: 0.5s, delta frame + +# Illegal: +Packet 1: 0.0s, key frame +Packet 2: 0.3s, delta frame +Packet 3: 0.2s, delta frame +Packet 4: 0.1s, delta frame +Packet 5: 0.4s, key frame +Packet 6: 0.25s, delta frame +``` + +## Audio sources + +Audio sources feed data to audio tracks on an `Output`. They all extend the abstract `AudioSource` class. + +### `AudioSampleSource` + +This source takes [audio samples](./packets-and-samples#audiosample), encodes them, and passes the encoded data to the output. + +```ts +import { AudioSampleSource } from 'mediabunny'; + +const sampleSource = new AudioSampleSource({ + codec: 'aac', + bitrate: 128e3, +}); + +await sampleSource.add(audioSample); +audioSample.close(); // If it's not needed anymore +``` + +### `AudioBufferSource` + +This source directly accepts instances of `AudioBuffer` as data, simplifying usage with the Web Audio API. The first AudioBuffer will be played at timestamp 0, and any subsequent AudioBuffer will be appended after all previous AudioBuffers. + +```ts +import { AudioBufferSource, QUALITY_MEDIUM } from 'mediabunny'; + +const bufferSource = new AudioBufferSource({ + codec: 'opus', + bitrate: QUALITY_MEDIUM, +}); + +await bufferSource.add(audioBuffer1); +await bufferSource.add(audioBuffer2); +await bufferSource.add(audioBuffer3); +``` + +### `MediaStreamAudioTrackSource` + +This is a source for use with the [Media Capture and Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API). Use this source if you want to pipe a real-time audio source (such as a microphone or audio from the user's computer) to an output file. + +```ts +import { MediaStreamAudioTrackSource } from 'mediabunny'; + +// Get the user's microphone +const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); +const audioTrack = stream.getAudioTracks()[0]; + +const audioTrackSource = new MediaStreamAudioTrackSource(audioTrack, { + codec: 'opus', + bitrate: 128e3, +}); + +// Make sure to allow any internal errors to properly bubble up +audioTrackSource.errorPromise.catch((error) => ...); +``` + +This source requires no additional method calls; data will automatically be captured and piped to the output file as soon as `start()` is called on the `Output`. Make sure to `stop()` on `audioTrack` after finalizing the `Output` if you don't need the user's media anymore. + +If you want to temporarily stop capturing audio data from this source, you can use the `pause()` and `resume()` methods: + +```ts +audioTrackSource.pause(); + +// Later: +audioTrackSource.resume(); +``` + +While paused, audio data emitted by the stream will be ignored. When resumed, audio data are let through again, offset in timestamp such that the result plays back continuously with no gap in playback. Note that pausing does *not* stop the underlying media stream. + +::: info +If this source is the only MediaStreamTrack source in the `Output`, then the first audio sample added by it starts at timestamp 0. If there are multiple, then the earliest media sample across all tracks starts at timestamp 0, and all tracks will be perfectly synchronized with each other. +::: + +::: warning +`MediaStreamAudioTrackSource`'s internals are detached from the typical code flow but can still throw, so make sure to utilize `errorPromise` to deal with any errors and to stop the `Output`. +::: + +### `EncodedAudioPacketSource` + +The most barebones of all audio sources, this source can be used to directly pipe [encoded packets](./packets-and-samples#encodedpacket) of audio data to the output. This source requires that you take care of the encoding process yourself, which enables you to use the WebCodecs API manually or to plug in your own encoding stack. Alternatively, you may retrieve the encoded packets directly by reading them from another media file, allowing you to skip decoding and reencoding audio data. + +```ts +import { EncodedAudioPacketSource } from 'mediabunny'; + +// You must specify the codec name: +const packetSource = new EncodedAudioPacketSource('aac'); + +await packetSource.add(packet); +``` + +You will need to provide additional metadata alongside your first call to `add` to give the `Output` more information about the shape and form of the audio data. This metadata must be in the form of the WebCodecs API's `EncodedAudioChunkMetadata`. It might look like this: + +```ts +await packetSource.add(firstPacket, { + decoderConfig: { + codec: 'mp4a.40.2', + numberOfChannels: 2, + sampleRate: 48000, + description: new Uint8Array([17, 144]), + }, +}); +``` + +`codec`, `numberOfChannels`, and `sampleRate` are required for all codecs, whereas `description` is required for some codecs. The [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/) specifies the formats of `codec` and `description` for each audio codec, which you must adhere to. + +## Subtitle sources + +Subtitle sources feed data to subtitle tracks on an `Output`. They all extend the abstract `SubtitleSource` class. + +### `TextSubtitleSource` + +This source feeds subtitle cues to the output from a text file in which the subtitles are defined. + +```ts +import { TextSubtitleSource } from 'mediabunny'; + +const textSource = new TextSubtitleSource('webvtt'); + +const text = +`WEBVTT + +00:00:00.000 --> 00:00:02.000 +This is your last chance. + +00:00:02.500 --> 00:00:04.000 +After this, there is no turning back. + +00:00:04.500 --> 00:00:06.000 +If you take the blue pill, the story ends. + +00:00:06.500 --> 00:00:08.000 +You wake up in your bed and believe whatever you want to believe. + +00:00:08.500 --> 00:00:10.000 +If you take the red pill, you stay in Wonderland + +00:00:10.500 --> 00:00:12.000 +and I show you how deep the rabbit hole goes. +`; + +await textSource.add(text); +``` + +If you add the entire subtitle file at once, make sure to [close the source](#closing-sources) immediately after: + +```ts +textSource.close(); +``` + +You can also add cues individually in small chunks: + +```ts +import { TextSubtitleSource } from 'mediabunny'; + +const textSource = new TextSubtitleSource('webvtt'); + +await textSource.add('WEBVTT\n\n'); +await textSource.add('00:00:00.000 --> 00:00:02.000\nHello there!\n\n'); +await textSource.add('00:00:02.500 --> 00:00:04.000\nChunky chunks.\n\n'); +``` + +The chunks have certain constraints: A cue must be fully contained within a chunk and cannot be split across multiple smaller chunks (although a chunk can contain multiple cues). Also, the WebVTT preamble must be added first and all at once. + +::: info +For QuickTime to display WebVTT subtitles, it typically expects alignment information to be specified: + +``` +00:00:00.000 --> 00:00:02.000 align:center +This is your last chance. +``` + +::: + +--- + +--- +url: /llms.md +--- +# Mediabunny and LLMs + +While Mediabunny is proudly human-generated, we want to encourage any and all usage of Mediabunny, even when the vibes are high. + +Mediabunny is still new and is unlikely to be in the training data of modern LLMs, but we can still make the AI perform extremely well by just giving it a little more context. + +*** + +Give one or more of these files to your LLM: + +### [mediabunny.d.ts](/mediabunny.d.ts) + +This file contains the entire public TypeScript API of Mediabunny and is commented extremely thoroughly. + +### [llms.txt](/llms.txt) + +This file provides an index of Mediabunny's guide, which the AI can then further dive into if it wants to. + +### [llms-full.txt](/llms-full.txt) + +This is just the entire Mediabunny guide in a single file. + +--- + +--- +url: /guide/output-formats.md +--- +# Output formats + +## Introduction + +An *output format* specifies the container format of the data written by an `Output`. Mediabunny supports many commonly used container formats, each having format-specific options. + +Many formats also offer *data callbacks*, which are special callbacks that fire for specific data regions in the output file. + +### Output format properties + +All output formats have a common set of properties you can query. + +```ts +// Get the format's file extension: +format.fileExtension; // => '.mp4' + +// Get the format's base MIME type: +format.mimeType; // => 'video/mp4' + +// Check which codecs can be contained by the format: +format.getSupportedCodecs(); // => MediaCodec[] +format.getSupportedVideoCodecs(); // => VideoCodec[] +format.getSupportedAudioCodecs(); // => AudioCodec[] +format.getSupportedSubtitleCodecs(); // => SubtitleCodec[] + +// Check if the format supports video tracks with rotation metadata: +format.supportsVideoRotationMetadata; // => boolean +``` + +Refer to the [compatibility table](./supported-formats-and-codecs.md#compatibility-table) to see which codecs can be used with which output format. + +Formats also differ in the amount and types of tracks they can contain. You can retrieve this information using: + +```ts +format.getSupportedTrackCounts(); // => TrackCountLimits + +type TrackCountLimits = { + video: { min: number, max: number }, + audio: { min: number, max: number }, + subtitle: { min: number, max: number }, + total: { min: number, max: number }, +}; +``` + +### Append-only writing + +Some output format configurations write in an *append-only* fashion. This means they only ever add new data to the end, and never have to seek back to overwrite a previously-written section of the file. Or, put formally: the byte offset of any write is exactly equal to the number of bytes written before it. + +Append-only formats, in combination with [`StreamTarget`](./writing-media-files#streamtarget), have some useful properties. They enable use with [Media Source Extensions](https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API) and allow for trivial streaming across the network, such as for file uploads. + +## MP4 + +This output format creates MP4 files. + +```ts +import { Output, Mp4OutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new Mp4OutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type IsobmffOutputFormatOptions = { + fastStart?: false | 'in-memory' | 'reserve' | 'fragmented'; + minimumFragmentDuration?: number; + metadataFormat?: 'mdir' | 'mdta' | 'udta' | 'auto'; + + onFtyp?: (data: Uint8Array, position: number) => unknown; + onMoov?: (data: Uint8Array, position: number) => unknown; + onMdat?: (data: Uint8Array, position: number) => unknown; + onMoof?: (data: Uint8Array, position: number, timestamp: number) => unknown; +}; +``` + +* `fastStart`\ + Controls the placement of metadata in the file. Placing metadata at the start of the file is known as "Fast Start" and provides certain benefits: The file becomes easier to stream over the web without range requests, and sites like YouTube can start processing the video while it's uploading. However, placing metadata at the start of the file can require more processing and memory in the writing step. This library provides full control over the placement of metadata by setting `fastStart` to one of these options: + * `false`\ + Disables Fast Start, placing the metadata at the end of the file. Fastest and uses the least memory. + * `'in-memory'`\ + Produces a file with Fast Start by keeping all media chunks in memory until the file is finalized. This produces a high-quality and compact output at the cost of a more expensive finalization step and higher memory requirements. + ::: info + This option ensures [append-only writing](#append-only-writing), although all the writing happens in bulk, at the end. + ::: + * `'reserve'`\ + Produces a file with Fast Start by reserving space at the start of the file into which the metadata will be written later. This requires knowledge about the expected length of the file beforehand. When using this option, you must set the [`maximumPacketCount`](../api/BaseTrackMetadata#maximumpacketcount) field in the track metadata for all tracks. + * `'fragmented'`\ + Produces a *fragmented MP4 (fMP4)* file, evenly placing sample metadata throughout the file by grouping it into "fragments" (short sections of media), while placing general metadata at the beginning of the file. Fragmented files are ideal in streaming contexts, as each fragment can be played individually without requiring knowledge of the other fragments. Furthermore, they remain lightweight to create no matter how large the file becomes, as they don't require media to be kept in memory for very long. However, fragmented files are not as widely and wholly supported as regular MP4 files, and some players don't provide seeking functionality for them. + ::: info + This option ensures [append-only writing](#append-only-writing). + ::: + ::: warning + This option requires [packet buffering](./writing-media-files#packet-buffering). + ::: + * `undefined`\ + The default option; it behaves like `'in-memory'` when using [`BufferTarget`](./writing-media-files#buffertarget) and like `false` otherwise. +* `minimumFragmentDuration`\ + Only relevant when `fastStart` is `'fragmented'`. Sets the minimum duration in seconds a fragment must have to be finalized and written to the file. Defaults to 1 second. +* `metadataFormat`\ + The metadata format to use for writing metadata tags. + * `'auto'` (default): Behaves like `'mdir'` for MP4 and like `'udta'` for QuickTime, matching FFmpeg's default behavior. + * `'mdir'`: Write tags into `moov/udta/meta` using the 'mdir' handler format. + * `'mdta'`: Write tags into `moov/udta/meta` using the 'mdta' handler format, equivalent to FFmpeg's `use_metadata_tags` flag. This allows for custom keys of arbitrary length. + * `'udta'`: Write tags directly into `moov/udta`. +* `onFtyp`\ + Will be called once the ftyp (File Type) box of the output file has been written. +* `onMoov`\ + Will be called once the moov (Movie) box of the output file has been written. +* `onMdat`\ + Will be called for each finalized mdat (Media Data) box of the output file. Usage of this callback is not recommended when not using `fastStart: 'fragmented'`, as there will be one monolithic mdat box which might require large amounts of memory. +* `onMoof`\ + Will be called for each finalized moof (Movie Fragment) box of the output file. The fragment's start timestamp in seconds is also passed. + +## QuickTime File Format (.mov) + +This output format creates QuickTime files (.mov). + +```ts +import { Output, MovOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new MovOutputFormat(options), + // ... +}); +``` + +The available options are the same `IsobmffOutputFormatOptions` used by [MP4](#mp4). + +## WebM + +This output format creates WebM files. + +```ts +import { Output, WebMOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new WebMOutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type MkvOutputFormatOptions = { + appendOnly?: boolean; + minimumClusterDuration?: number; + + onEbmlHeader?: (data: Uint8Array, position: number) => void; + onSegmentHeader?: (data: Uint8Array, position: number) => unknown; + onCluster?: (data: Uint8Array, position: number, timestamp: number) => unknown; +}; +``` + +* `appendOnly`\ + Configures the output to write data in an append-only fashion. This is useful for live-streaming the output as it's being created. Note that when enabled, certain features like file duration or seeking will be disabled or impacted, so don't use this option when you want to write out a media file for later use. + ::: info + This option ensures [append-only writing](#append-only-writing). + ::: +* `minimumClusterDuration`\ + Sets the minimum duration in seconds a cluster must have to be finalized and written to the file. Defaults to 1 second. +* `onEbmlHeader`\ + Will be called once the EBML header of the output file has been written. +* `onSegmentHeader`\ + Will be called once the header part of the Matroska Segment element has been written. The header data includes the Segment element and everything inside it, up to (but excluding) the first Matroska Cluster. +* `onCluster`\ + Will be called for each finalized Matroska Cluster of the output file. The cluster's start timestamp in seconds is also passed. + +## Matroska (.mkv) + +This output format creates Matroska files (.mkv). + +```ts +import { Output, MkvOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new MkvOutputFormat(options), + // ... +}); +``` + +The available options are the same `MkvOutputFormatOptions` used by [WebM](#webm). + +## Ogg + +This output format creates Ogg files. + +```ts +import { Output, OggOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new OggOutputFormat(options), + // ... +}); +``` + +::: info +This format ensures [append-only writing](#append-only-writing). +::: + +The following options are available: + +```ts +type OggOutputFormatOptions = { + onPage?: (data: Uint8Array, position: number, source: MediaSource) => unknown; +}; +``` + +* `onPage`\ + Will be called for each finalized Ogg page of the output file. The [media source](./media-sources) backing the page's track (logical bitstream) is also passed. + +## MP3 + +This output format creates MP3 files. + +```ts +import { Output, Mp3OutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new Mp3OutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type Mp3OutputFormatOptions = { + xingHeader?: boolean; + onXingFrame?: (data: Uint8Array, position: number) => unknown; +}; +``` + +* `xingHeader`\ + Controls whether the Xing header, which contains additional metadata as well as an index, is written to the start of the MP3 file. Defaults to `true`. + ::: info + When set to `false`, this option ensures [append-only writing](#append-only-writing). + ::: +* `onXingFrame`\ + Will be called once the Xing metadata frame is finalized, which happens at the end of the writing process. This callback only fires if `xingHeader` isn't set to `false`. + +::: info +Most browsers don't support encoding MP3. Use the official [`@mediabunny/mp3-encoder`](./extensions/mp3-encoder) package to polyfill an encoder. +::: + +## WAVE + +This output format creates WAVE (.wav) files. + +```ts +import { Output, WavOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new WavOutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type WavOutputFormatOptions = { + large?: boolean; + metadataFormat?: 'info' | 'id3'; + onHeader?: (data: Uint8Array, position: number) => unknown; +}; +``` + +* `large`\ + When enabled, an RF64 file be written, allowing for file sizes to exceed 4 GiB, which is otherwise not possible for regular WAVE files. +* `metadataFormat`\ + The metadata format to use for writing metadata tags. + * `'info'` (default): Writes metadata into a RIFF INFO LIST chunk, the default way to contain metadata tags within WAVE. Only allows for a limited subset of tags to be written. + * `'id3'`: Writes metadata into an ID3 chunk. Non-default, but used by many taggers in practice. Allows for a much larger and richer set of tags to be written. +* `onHeader`\ + Will be called once the file header is written. The header consists of the RIFF header, the format chunk, and the start of the data chunk (with a placeholder size of 0). + +## ADTS + +This output format creates ADTS (.aac) files. + +```ts +import { Output, AdtsOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new AdtsOutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type AdtsOutputFormatOptions = { + onFrame?: (data: Uint8Array, position: number) => unknown; +}; +``` + +* `onFrame`\ + Will be called for each ADTS frame that is written. + +## FLAC + +This output format creates FLAC (.flac) files. + +```ts +import { Output, FlacOutputFormat } from 'mediabunny'; + +const output = new Output({ + format: new FlacOutputFormat(options), + // ... +}); +``` + +The following options are available: + +```ts +type FlacOutputFormatOptions = { + onFrame?: (data: Uint8Array, position: number) => unknown; +}; +``` + +* `onFrame`\ + Will be called for each FLAC frame that is written. + +--- + +--- +url: /guide/packets-and-samples.md +--- +# Packets & samples + +## Introduction + +Media data in Mediabunny is present in two different forms: + +* **Packet:** Encoded media data, the result of an encoding process +* **Sample:** Raw, uncompressed, presentable media data + +In addition to data, both packets and samples carry additional metadata, such as timestamp, duration, width, etc. + +Packets are represented with the `EncodedPacket` class, which is used for both video and audio packets. Samples are represented with the `VideoSample` and `AudioSample` classes: + +* `VideoSample`: Represents a single frame of video. +* `AudioSample`: Represents a (typically short) section of audio. + +Samples can be encoded into packets, and packets can be decoded into samples: + +```mermaid +flowchart LR + A[VideoSample] + B[AudioSample] + C[EncodedPacket] + D[VideoSample] + E[AudioSample] + + A -- encode --> C + B -- encode --> C + C -- decode --> D + C -- decode --> E +``` + +### Connection to WebCodecs + +Packets and samples in Mediabunny correspond directly with concepts of the [WebCodecs API](https://w3c.github.io/webcodecs/): + +* `EncodedPacket`\ + -> `EncodedVideoChunk` for video packets\ + -> `EncodedAudioChunk` for audio packets +* `VideoSample` + -> `VideoFrame` +* `AudioSample` + -> `AudioData` + +Since Mediabunny makes heavy use of WebCodecs API, its own classes are typically used as wrappers around the WebCodecs classes. However, this wrapping comes with a few benefits: + +1. **Independence:** This library remains functional even if the WebCodecs API isn't available. Encoders and decoders can be polyfilled using [custom coders](./supported-formats-and-codecs#custom-coders), and the library can run in non-browser contexts such as Node.js. +2. **Extensibility:** The wrappers serve as a namespace for additional operations, such as `toAudioBuffer()` on `AudioSample`, or `draw()` on `VideoSample`. +3. **Consistency:** While WebCodecs uses integer microsecond timestamps, Mediabunny uses floating-point second timestamps everywhere. With these wrappers, all timing information is always in seconds and the user doesn't need to think about unit conversions. + +Conversion is easy: + +```ts +import { EncodedPacket, VideoSample, AudioSample } from 'mediabunny'; + +// EncodedPacket to WebCodecs chunks: +encodedPacket.toEncodedVideoChunk(); // => EncodedVideoChunk +encodedPacket.toEncodedAudioChunk(); // => EncodedAudioChunk +// WebCodecs chunks to EncodedPacket: +EncodedPacket.fromEncodedChunk(videoChunk); // => EncodedPacket +EncodedPacket.fromEncodedChunk(audioChunk); // => EncodedPacket + +// VideoSample to VideoFrame: +videoSample.toVideoFrame(); // => VideoFrame +// VideoFrame to VideoSample: +new VideoSample(videoFrame); // => VideoSample + +// AudioSample to AudioData: +audioSample.toAudioData(); // => AudioData +// AudioData to AudioSample: +new AudioSample(audioData); // => AudioSample +``` + +::: info +`VideoSample`/`AudioSample` instances created from their WebCodecs API counterpart are very efficient; they simply maintain a reference to the underlying WebCodecs API instance and do not perform any unnecessary copying. +::: + +### Negative timestamps + +While packet and sample durations cannot be negative, packet and sample timestamps can. + +A negative timestamp represents a sample that starts playing before the composition does (the composition always starts at 0). Negative timestamps are typically a result of a track being trimmed at the start, either to cut off a piece of media or to synchronize it with the other tracks. Therefore, you should avoid presenting any sample with a negative timestamp. + +## `EncodedPacket` + +An encoded packet represents encoded media data of any type (video or audio). They are the result of an *encoding process*, and you can turn encoded packets into actual media data using a *decoding process*. + +### Creating packets + +To create an `EncodedPacket`, you can use its constructor: + +```ts +constructor( + data: Uint8Array, + type: 'key' | 'delta', + timestamp: number, // in seconds + duration: number, // in seconds + sequenceNumber?: number, + byteLength?: number, +); +``` + +::: info +You probably won't ever need to set `sequenceNumber` or `byteLength` in the constructor. +::: + +For example, here we're creating a packet from some encoded video data: + +```ts +import { EncodedPacket } from 'mediabunny'; + +const encodedVideoData = new Uint8Array([...]); +const encodedPacket = new EncodedPacket(encodedVideoData, 'key', 5, 1/24); +``` + +Alternatively, if you're coming from WebCodecs encoded chunks, you can create an `EncodedPacket` from them: + +```ts +import { EncodedPacket } from 'mediabunny'; + +// From EncodedVideoChunk: +const encodedPacket = EncodedPacket.fromEncodedChunk(encodedVideoChunk); + +// From EncodedAudioChunk: +const encodedPacket = EncodedPacket.fromEncodedChunk(encodedAudioChunk); +``` + +### Inspecting packets + +Encoded packets have a bunch of read-only data you can inspect. You can get the encoded data like so: + +```ts +encodedPacket.data; // => Uint8Array +``` + +You can query the type of packet: + +```ts +encodedPacket.type; // => PacketType ('key' | 'delta') +``` + +* A *key packet* can be decoded directly, independently of other packets. +* A *delta packet* can only be decoded after the packet before it has been decoded. + +For example, in a video track, it is common to have a key frame about every few seconds. When seeking, if the user seeks to a position shortly after a key frame, the decoded data can be shown quickly; if they seek far away from a key frame, the decoder must first crunch through many delta frames before it can show anything. + +#### Determining a packet's actual type + +The `type` field is derived from metadata in the containing file, which can sometimes (in rare cases) be incorrect. To determine a packet's actual type with certainty, you can do this: + +```ts +// `packet` must come from the InputTrack `track` +const type = await track.determinePacketType(packet); // => PacketType | null +``` + +This determines the packet's type by looking into its bitstream. `null` is returned when the type couldn't be determined. + +*** + +You can query the packet's timing information: + +```ts +encodedPacket.timestamp; // => Presentation timestamp in seconds +encodedPacket.duration; // => Duration in seconds + +// There also exist integer microsecond versions of these: +encodedPacket.microsecondTimestamp; +encodedPacket.microsecondDuration; +``` + +`timestamp` and `duration` are both given as floating-point numbers. + +::: warning +Timestamps can be [negative](#negative-timestamps). +::: + +*** + +A packet also has a quantity known as a *sequence number*: + +```ts +encodedPacket.sequenceNumber; // => number +``` + +When [reading packets from an input file](./media-sinks#encodedpacketsink), this number specifies the relative ordering of packets. If packet $A$ has a lower sequence number than packet $B$, then packet $A$ comes first (in [decode order](./media-sinks#decode-vs-presentation-order)). If two packets have the same sequence number, then they represent the same media sample. + +Sequence numbers have no meaning on their own and only make sense when comparing them to other sequence numbers. If a packet has sequence number $n$, it does not mean that it is the $n$th packet of the track. + +Negative sequence numbers mean the packet's ordering is undefined. When creating an `EncodedPacket`, the sequence number defaults to -1. + +### Cloning packets + +Use the `clone` method to create a new packet from an existing packet. While doing so, you can change its timestamp and duration. + +```ts +// Creates a clone identical to the original: +packet.clone(); + +// Creates a clone with the timestamp set to 10 seconds: +packet.clone({ timestamp: 10 }); +``` + +### Metadata-only packets + +[`EncodedPacketSink`](./media-sinks#encodedpacketsink) can create *metadata-only* packets: + +```ts +await sink.getFirstPacket({ metadataOnly: true }); +``` + +Metadata-only packets contain all the metadata of the full packet, but do not contain any data: + +```ts +packet.data; // => Uint8Array([]) +``` + +You can still retrieve the *size* that the data would have: + +```ts +packet.byteLength; // => number +``` + +Given a packet, you can check if it is metadata-only like so: + +```ts +packet.isMetadataOnly; // => boolean +``` + +## `VideoSample` + +A video sample represents a single frame of video. It can be created directly from an image source, or be the result of a decoding process. Its API is modeled after [VideoFrame](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame). + +### Creating video samples + +Video samples have an image source constructor and a raw constructor. + +::: info +The constructor of `VideoSample` is very similar to [`VideoFrame`'s constructor](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/VideoFrame), but uses second timestamps instead of microsecond timestamps. +::: + +#### Image source constructor + +This constructor creates a `VideoSample` from a `CanvasImageSource`: + +```ts +import { VideoSample } from 'mediabunny'; + +// Creates a sample from a canvas element +const sample = new VideoSample(canvas, { + timestamp: 3, // in seconds + duration: 1/24, // in seconds +}); + +// Creates a sample from an image element, with some added rotation +const sample = new VideoSample(imageElement, { + timestamp: 5, // in seconds + rotation: 90, // in degrees clockwise +}); + +// Creates a sample from a VideoFrame (timestamp will be copied) +const sample = new VideoSample(videoFrame); +``` + +#### Raw constructor + +This constructor creates a `VideoSample` from raw pixel data given in an `ArrayBuffer`: + +```ts +import { VideoSample } from 'mediabunny'; + +// Creates a sample from pixel data in the RGBX format +const sample = new VideoSample(buffer, { + format: 'RGBX', + codedWidth: 1280, + codedHeight: 720, + timestamp: 0, +}); + +// Creates a sample from pixel data in the YUV 4:2:0 format +const sample = new VideoSample(buffer, { + format: 'I420', + codedWidth: 1280, + codedHeight: 720, + timestamp: 0, +}); +``` + +See [`VideoPixelFormat`](https://w3c.github.io/webcodecs/#enumdef-videopixelformat) for a list of pixel formats supported by WebCodecs. + +### Inspecting video samples + +A `VideoSample` has several read-only properties: + +```ts +// The internal pixel format in which the frame is stored +videoSample.format; // => VideoPixelFormat | null + +// Raw dimensions of the sample +videoSample.codedWidth; // => number +videoSample.codedHeight; // => number + +// Transformed display dimensions of the sample (after rotation) +videoSample.displayWidth; // => number +videoSample.displayHeight; // => number + +// Rotation of the sample in degrees clockwise. The raw sample should be +// rotated by this amount when it is presented. +videoSample.rotation; // => 0 | 90 | 180 | 270 + +// Timing information +videoSample.timestamp; // => Presentation timestamp in seconds +videoSample.duration; // => Duration in seconds +videoSample.microsecondTimestamp; // => Presentation timestamp in microseconds +videoSample.microsecondDuration; // => Duration in microseconds + +// Color space of the sample +videoSample.colorSpace; // => VideoColorSpace +``` + +While all of these properties are read-only, you can use the `setTimestamp`, `setDuration` and `setRotation` methods to modify some of the metadata of the video sample. + +::: warning +Timestamps can be [negative](#negative-timestamps). +::: + +### Using video samples + +Video samples provide a couple of ways with which you can access its frame data. + +You can convert a video sample to a WebCodecs [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame) to access additional data or to pass it to a [`VideoEncoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoEncoder): + +```ts +videoSample.toVideoFrame(); // => VideoFrame +``` + +This method is virtually free if the video sample was constructed using a `VideoFrame`. + +::: warning +The `VideoFrame` returned by this method **must** be closed separately from the video sample. +::: + +*** + +It's also common to draw video samples to a `` element or an `OffscreenCanvas`. For this, you can use the following methods: + +```ts +draw( + context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, + dx: number, + dy: number, + dWidth?: number, // defaults to displayWidth + dHeight?: number, // defaults to displayHeight +): void; + +draw( + context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, + sx: number, + sy: number, + sWidth: number, + sHeight: number, + dx: number, + dy: number, + dWidth?: number, // defaults to sWidth + dHeight?: number, // defaults to sHeight +): void; +``` + +These methods behave like [drawImage](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage) and paint the video frame at the given position with the given dimensions. This method will automatically draw the frame with the correct rotation based on its `rotation` property. + +The `drawWithFit` method can be used to draw the video sample to fill an entire canvas with a specified fitting algorithm: + +```ts +drawWithFit( + context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, + options: { + fit: 'fill' | 'contain' | 'cover'; + rotation?: Rotation; // Overrides the sample's rotation + crop?: CropRectangle; + }, +): void; +``` + +If you want to draw the raw underlying image to a canvas directly (without respecting the rotation metadata), then you can use the following method: + +```ts +videoSample.toCanvasImageSource(); // => VideoFrame | OffscreenCanvas; +``` + +This method returns a valid `CanvasImageSource` you can use with [drawImage](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage). + +::: warning +If this method returns a `VideoFrame`, you should use that frame immediately. This is because any internally-created video frames will automatically be closed in the next microtask. +::: + +*** + +Sometimes you may want direct access to the underlying pixel data. To do this, `VideoSample` allows you to copy this data into an `ArrayBuffer`. + +Use `allocationSize` to determine how many bytes are needed: + +```ts +const bytesNeeded = videoSample.allocationSize(); // => number +``` + +Then, use `copyTo` to copy the pixel data into the destination buffer: + +```ts +const bytes = new Uint8Array(bytesNeeded); +videoSample.copyTo(bytes); +``` + +::: info +The data will always be in the pixel format specified in the `format` field. + +To convert the data into a different pixel format, or to extract only a section of the frame, please use the [`allocationSize`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/allocationSize) and [`copyTo`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/copyTo) methods on `VideoFrame` instead. Get a `VideoFrame` by running `videoSample.toVideoFrame()`. +::: + +*** + +You can also clone a `VideoSample`: + +```ts +const clonedSample = videoSample.clone(); // => VideoSample +``` + +The cloned sample **must** be closed separately from the original sample. + +### Closing video samples + +You must manually close a `VideoSample` after you've used it to free internally-held resources. Do this by calling the `close` method: + +```ts +videoSample.close(); +``` + +Try to close a `VideoSample` as soon as you don't need it anymore. Unclosed video samples can lead to high VRAM usage and decoder stalls. + +After a `VideoSample` has been closed, its data becomes unavailable and most of its methods will throw an error. + +## `AudioSample` + +An audio sample represents a section of audio data. It can be created directly from raw audio data, or be the result of a decoding process. Its API is modeled after [AudioData](https://developer.mozilla.org/en-US/docs/Web/API/AudioData). + +### Creating audio samples + +Audio samples can be constructed either from an `AudioData` instance, an initialization object, or an `AudioBuffer`: + +```ts +import { AudioSample } from 'mediabunny'; + +// From AudioData: +const sample = new AudioSample(audioData); + +// From raw data: +const sample = new AudioSample({ + data: new Float32Array([...]), + format: 'f32-planar', // Audio sample format + numberOfChannels: 2, + sampleRate: 44100, // in Hz + timestamp: 0, // in seconds +}); + +// From AudioBuffer: +const timestamp = 0; // in seconds +const samples = AudioSample.fromAudioBuffer(audioBuffer, timestamp); +// => Returns multiple AudioSamples if the AudioBuffer is very long +``` + +The following audio sample formats are supported: + +* `'u8'`: 8-bit unsigned integer (interleaved) +* `'u8-planar'`: 8-bit unsigned integer (planar) +* `'s16'`: 16-bit signed integer (interleaved) +* `'s16-planar'`: 16-bit signed integer (planar) +* `'s32'`: 32-bit signed integer (interleaved) +* `'s32-planar'`: 32-bit signed integer (planar) +* `'f32'`: 32-bit floating point (interleaved) +* `'f32-planar'`: 32-bit floating point (planar) + +Planar formats store each channel's data contiguously, while interleaved formats store the channels' data interleaved together: + +![Planar vs. interleaved formats](../assets/planar_interleaved.svg) + +### Inspecting audio samples + +An `AudioSample` has several read-only properties: + +```ts +type AudioSampleFormat = 'u8' | 'u8-planar' | 's16' | 's16-planar' | 's32' | 's32-planar' | 'f32' | 'f32-planar'; + +audioSample.format; // => AudioSampleFormat +audioSample.sampleRate; // => Sample rate in Hz +audioSample.numberOfFrames; // => Number of frames per channel +audioSample.numberOfChannels; // => Number of channels +audioSample.timestamp; // => Presentation timestamp in seconds +audioSample.duration; // => Duration in seconds (= numberOfFrames / sampleRate) + +// There also exist integer microsecond versions of timing info: +audioSample.microsecondTimestamp; +audioSample.microsecondDuration; +``` + +While all of these properties are read-only, you can use the `setTimestamp` method to modify the timestamp of the audio sample. + +::: warning +Timestamps can be [negative](#negative-timestamps). +::: + +### Using audio samples + +Audio samples provide a couple of ways with which you can access its audio data. + +You can convert an audio sample to a WebCodecs [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) to pass it to an [`AudioEncoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioEncoder): + +```ts +audioSample.toAudioData(); // => AudioData +``` + +This method is virtually free if the audio sample was constructed using an `AudioData`, as long as its timestamp wasn't modified using `setTimestamp`. + +::: warning +The `AudioData` returned by this method **must** be closed separately from the audio sample. +::: + +You can also easily convert the audio sample into an [`AudioBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) for use with the Web Audio API: + +```ts +audioSample.toAudioBuffer(); // => AudioBuffer +``` + +*** + +You can also directly copy raw audio data from an `AudioSample` into an `ArrayBuffer`. For this, the `allocationSize` and `copyTo` methods can be used. + +The copying process is controlled by the following configuration object: + +```ts +type AudioSampleCopyToOptions = { + planeIndex: number; + format?: AudioSampleFormat; + frameOffset?: number; + frameCount?: number; +}; +``` + +* `planeIndex` *(required)*\ + The index identifying the plane to copy from. This must be 0 if using a non-planar (interleaved) output format. +* `format`\ + The output format for the destination data. Defaults to the `AudioSample`'s format. +* `frameOffset`\ + An offset into the source plane data indicating which frame to begin copying from. Defaults to 0. +* `frameCount`\ + The number of frames to copy. If not provided, the copy will include all frames in the plane beginning with `frameOffset`. + +Because the meaning of `planeIndex` depends on which format is being used for extraction, it's best to always explicitly specify a format. + +For example, here we're extracting the entire audio data as `f32`: + +```ts +const options = { planeIndex: 0, format: 'f32' }; +const bytesNeeded = audioSample.allocationSize(options); +const data = new Float32Array(bytesNeeded / 4); +audioSample.copyTo(data, options); +``` + +Here, we're iterating over each plane in the `s16` format: + +```ts +// The size of the first plane is the size of all planes +const bytesNeeded = audioSample.allocationSize({ + planeIndex: 0, + format: 's16-planar', +}); +const data = new Int16Array(bytesNeeded / 2); + +for (let i = 0; i < audioSample.numberOfChannels; i++) { + audioSample.copyTo(data, { planeIndex: i, format: 's16-planar' }); + // Do something with the data +} +``` + +::: info +The behavior of `allocationSize` and `copyTo` exactly mirrors that of the WebCodecs API. However, the WebCodecs API specification only mandates support for converting to `f32-planar`, while Mediabunny's implementation supports conversion into all formats. Therefore, Mediabunny's methods are more powerful. +::: + +### Closing audio samples + +You must manually close an `AudioSample` after you've used it to free internally-held resources. Do this by calling the `close` method: + +```ts +audioSample.close(); +``` + +Try to close an `AudioSample` as soon as you don't need it anymore. Unclosed audio samples can lead to high memory usage and decoder stalls. + +After an `AudioSample` has been closed, its data becomes unavailable and most of its methods will throw an error. + +--- + +--- +url: /guide/quick-start.md +--- +# Quick start + +This page is a collection of short code snippets that showcase the most common operations you may use this library for. + +## Read file metadata + +```ts +import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, // Supporting all file formats + source: new BlobSource(file), // Assuming a File instance +}); + +const duration = await input.computeDuration(); // in seconds +const allTracks = await input.getTracks(); // List of all tracks + +// Extract video metadata +const videoTrack = await input.getPrimaryVideoTrack(); +if (videoTrack) { + videoTrack.displayWidth; // in pixels + videoTrack.displayHeight; // in pixels + videoTrack.rotation; // in degrees clockwise + + // Estimate frame rate (FPS) + const packetStats = await videoTrack.computePacketStats(100); + const averageFrameRate = packetStats.averagePacketRate; +} + +// Extract audio metadata +const audioTrack = await input.getPrimaryAudioTrack(); +if (audioTrack) { + audioTrack.numberOfChannels; + audioTrack.sampleRate; // in Hz +} + +// Extract metadata tags +const tags = await input.getMetadataTags(); +tags.title; // Title +tags.date; // Release date +tags.images[0]; // Cover art +tags.raw['TBPM']; // Custom tags +// ... +``` + +::: info + +* Check out the Metadata extraction example for this code in action. +* You can read from more than just `File` instances - check out [Input sources](./reading-media-files#input-sources) for more. + ::: + +## Read media data + +```ts +import { + Input, + ALL_FORMATS, + BlobSource, + VideoSampleSink, + AudioSampleSink, +} from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, + source: new BlobSource(file), +}); + +// Read video frames +const videoTrack = await input.getPrimaryVideoTrack(); +if (videoTrack) { + const decodable = await videoTrack.canDecode(); + if (decodable) { + const sink = new VideoSampleSink(videoTrack); + + // Get the video frame at timestamp 5s + const videoSample = await sink.getSample(5); + videoSample.timestamp; // in seconds + videoSample.duration; // in seconds + + // Draw the frame to a canvas + videoSample.draw(ctx, 0, 0); + + // Loop over all frames in the first 30s of video + for await (const sample of sink.samples(0, 30)) { + // ... + } + } +} + +// Read audio chunks +const audioTrack = await input.getPrimaryAudioTrack(); +if (audioTrack) { + const decodable = await audioTrack.canDecode(); + if (decodable) { + const sink = new AudioSampleSink(audioTrack); + + // Get audio chunk at timestamp 5s; a short chunk of audio + const audioSample = await sink.getSample(5); + audioSample.timestamp; // in seconds + audioSample.duration; // in seconds + audioSample.numberOfFrames; + + // Convert to AudioBuffer for use with the Web Audio API + const audioBuffer = audioSample.toAudioBuffer(); + + // Loop over all samples in the first 30s of audio + for await (const sample of sink.samples(0, 30)) { + // ... + } + } +} +``` + +::: info + +* Check out the Media player example for a demo built on this use case. +* See [Media sinks](./media-sinks) for all the ways to extract media data from tracks. + ::: + +## Extract video thumbnails + +```ts +import { + Input, + ALL_FORMATS, + BlobSource, + CanvasSink, +} from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, + source: new BlobSource(file), +}); + +const videoTrack = await input.getPrimaryVideoTrack(); +if (videoTrack) { + const decodable = await videoTrack.canDecode(); + if (decodable) { + const sink = new CanvasSink(videoTrack, { + width: 320, // Automatically resize the thumbnails + }); + + // Get the thumbnail at timestamp 10s + const result = await sink.getCanvas(10); + result.canvas; // HTMLCanvasElement | OffscreenCanvas + result.timestamp; // in seconds + result.duration; // in seconds + + // Generate five equally-spaced thumbnails through the video + const startTimestamp = await videoTrack.getFirstTimestamp(); + const endTimestamp = await videoTrack.computeDuration(); + const timestamps = [0, 0.2, 0.4, 0.6, 0.8].map( + (t) => startTimestamp + t * (endTimestamp - startTimestamp) + ); + + // Loop over these timestamps + for await (const result of sink.canvasesAtTimestamps(timestamps)) { + // ... + } + } +} +``` + +::: info + +* Check out the Thumbnail generation example for this code in action. +* You can further configure [`CanvasSink`](./media-sinks#canvassink). + ::: + +## Extract encoded packets + +```ts +import { + Input, + ALL_FORMATS, + BlobSource, + EncodedPacketSink, +} from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, + source: new BlobSource(file), +}); + +const videoTrack = await input.getPrimaryVideoTrack(); +if (videoTrack) { + const sink = new EncodedPacketSink(videoTrack); + + // Get packet for timestamp 10s + const packet = await sink.getPacket(10); + packet.data; // Uint8Array + packet.type; // 'key' | 'delta' + packet.timestamp; // in seconds + packet.duration; // in seconds + + // Get the closest key packet to timestamp 10s + const keyPacket = await sink.getKeyPacket(10); + + // Get the following packet + const nextPacket = await sink.getNextPacket(keyPacket); + + // Set up a manual decoder + const decoderConfig = await videoTrack.getDecoderConfig(); + const videoDecoder = new VideoDecoder({ + output: console.log, + error: console.error, + }); + videoDecoder.configure(decoderConfig); + + // Loop over all packets in decode order + for await (const packet of sink.packets()) { + videoDecoder.decode(packet.toEncodedVideoChunk()); + } + + await videoDecoder.flush(); +} +``` + +::: info +Check out [`EncodedPacketSink`](./media-sinks#encodedpacketsink) for the full documentation. +::: + +## Create new media files + +```ts +import { + Output, + BufferTarget, + Mp4OutputFormat, + CanvasSource, + AudioBufferSource, + QUALITY_HIGH, +} from 'mediabunny'; + +// An Output represents a new media file +const output = new Output({ + format: new Mp4OutputFormat(), // The format of the file + target: new BufferTarget(), // Where to write the file (here, to memory) +}); + +// Example: add a video track driven by a canvas +const videoSource = new CanvasSource(canvas, { + codec: 'avc', + bitrate: QUALITY_HIGH, +}); +output.addVideoTrack(videoSource); + +// Example: add an audio track driven by AudioBuffers +const audioSource = new AudioBufferSource({ + codec: 'aac', + bitrate: QUALITY_HIGH, +}); +output.addAudioTrack(audioSource); + +// Set some metadata tags +output.setMetadataTags({ + title: 'My Movie', + artist: 'Me', +}); + +await output.start(); + +// Add some video frames +for (let frame = 0; ...) { + await videoSource.add(frame / 30, 1 / 30); +} + +// Add some audio data +await audioSource.add(audioBuffer1); +await audioSource.add(audioBuffer2); + +await output.finalize(); + +const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file +``` + +::: info + +* Check out the Procedural generation example for a demo of in-browser video generation. +* You can create files of many different formats; check out [Output formats](./output-formats) for the full list. +* Media data can be added from different sources, see [Media sources](./media-sources). + ::: + +## Write directly to disk + +```ts +import { + Output, + StreamTarget, +} from 'mediabunny'; + +// File System API +const handle = await window.showSaveFilePicker(); +const writableStream = await handle.createWritable(); + +const output = new Output({ + // `chunked: true` to batch disk operations + target: new StreamTarget(writableStream, { chunked: true }), + // ... +}); + +// ... + +await output.finalize(); + +// The file has been fully written to disk +``` + +## Stream over the network + +```ts +import { + Output, + StreamTarget, + StreamTargetChunk, + Mp4OutputFormat, +} from 'mediabunny'; + +const { writable, readable } = new TransformStream({ + transform: (chunk, controller) => controller.enqueue(chunk.data), +}); + +const output = new Output({ + target: new StreamTarget(writable), + // We must use an append-only format here, such as fragmented MP4 + format: new Mp4OutputFormat({ fastStart: 'fragmented' }), +}); + +const uploadComplete = fetch('https://example.com/upload', { + method: 'POST', + body: readable, + duplex: 'half', + headers: { + 'Content-Type': output.format.mimeType, + }, +}); + +await output.start(); + +// ... + +await output.finalize(); +await uploadComplete; +``` + +::: info + +* This code automatically handles the backpressure applied by a slow network. +* Read more on [append-only formats](./output-formats#append-only-writing), a requirement for this pattern. + ::: + +## Record live media + +```ts +import { + Output, + BufferTarget, + WebMOutputFormat, + MediaStreamVideoTrackSource, + MediaStreamAudioTrackSource, + QUALITY_MEDIUM +} from 'mediabunny'; + +const userMedia = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: true, +}); +const videoTrack = userMedia.getVideoTracks()[0]; +const audioTrack = userMedia.getAudioTracks()[0]; + +const output = new Output({ + format: new WebMOutputFormat(), + target: new BufferTarget(), +}); + +if (videoTrack) { + const source = new MediaStreamVideoTrackSource(videoTrack, { + codec: 'vp9', + bitrate: QUALITY_MEDIUM, + }); + output.addVideoTrack(source); +} + +if (audioTrack) { + const source = new MediaStreamAudioTrackSource(audioTrack, { + codec: 'opus', + bitrate: QUALITY_MEDIUM, + }); + output.addAudioTrack(source); +} + +await output.start(); + +// Wait... + +await output.finalize(); +``` + +::: info + +* Check out the Live recording demo for this code in action. +* This is basically [`MediaRecorder`](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder), but less sucky. + ::: + +## Creating transparent video + +```ts +import { + Output, + WebMOutputFormat, + BufferTarget, + CanvasSource, + QUALITY_MEDIUM, +} from 'mediabunny'; + +const output = new Output({ + // Use a format that supports transparency: + format: new WebMOutputFormat(), + target: new BufferTarget(), +}); + +const canvas = new OffscreenCanvas(1280, 720); +const context = canvas.getContext('2d', { alpha: true })!; + +const source = new CanvasSource(canvas, { + codec: 'vp9', + bitrate: QUALITY_MEDIUM, + alpha: 'keep', // => Also encode alpha data +}); +output.addVideoTrack(source); + +await output.start(); + +// Add data... +await source.add(0, 1 / 30); +// ... + +await output.finalize(); +``` + +## Check encoding support + +```ts +import { + MovOutputFormat, + getFirstEncodableVideoCodec, + getFirstEncodableAudioCodec, + getEncodableVideoCodecs, + getEncodableAudioCodecs, +} from 'mediabunny'; + +const outputFormat = new MovOutputFormat(); + +// Find the best supported codec for the given container format +const bestVideoCodec = await getFirstEncodableVideoCodec( + outputFormat.getSupportedVideoCodecs(), + // Optionally, constrained by these parameters: + { width: 1920, height: 1080 }, +); +const bestAudioCodec = await getFirstEncodableAudioCodec( + outputFormat.getSupportedAudioCodecs(), +); + +// Find all supported codecs +const supportedVideoCodecs = await getEncodableVideoCodecs(); +const supportedAudioCodecs = await getEncodableAudioCodecs(); +``` + +## Convert files + +```ts +import { + Input, + Output, + Conversion, + ALL_FORMATS, + BlobSource, + Mp4OutputFormat, +} from 'mediabunny'; + +// Check the above snippets for more examples of Input and Output +const input = new Input({ + formats: ALL_FORMATS, + source: new BlobSource(file), +}); +const output = new Output({ + format: new Mp4OutputFormat(), + target: new BufferTarget(), +}); + +const conversion = await Conversion.init({ input, output }); +if (!conversion.isValid) { + // The conversion isn't possible and would error upon execution. + // Check `discardedTracks` for the reasons. + return; +} + +// List of tracks that won't make it into the output: +conversion.discardedTracks; + +conversion.onProgress = (progress) => { + progress; // Number between 0 and 1, inclusive +}; + +await conversion.execute(); +// Conversion is complete + +const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file +``` + +::: info + +* This code will automatically transmux (copy media data) when possible, and transcode (re-encode media data) when necessary. +* Refer to [Converting media files](./converting-media-files) for the full documentation. + ::: + +## Extract audio + +```ts +import { + Input, + Output, + Conversion, + WavOutputFormat, +} from 'mediabunny'; + +const input = new Input(...); +const output = new Output({ + // Write to a .wav file, keeping only the audio track + format: new WavOutputFormat(), + // ... +}); + +const conversion = await Conversion.init({ + input, + output, + audio: { + sampleRate: 16000, // Resample to 16 kHz + }, +}); +await conversion.execute(); +// Conversion is complete +``` + +::: info + +* You can extract to other audio-only formats, such as .mp3, .ogg, or even .m4a. See [Output formats](./output-formats). + ::: + +## Compress media + +```ts +import { + Input, + Output, + Conversion, + QUALITY_LOW, +} from 'mediabunny'; + +const input = new Input(...); +const output = new Output(...); + +const conversion = await Conversion.init({ + input, + output, + video: { + width: 480, + bitrate: QUALITY_LOW, + }, + audio: { + numberOfChannels: 1, + bitrate: QUALITY_LOW, + }, + trim: { + // Let's keep only the first 60 seconds + start: 0, + end: 60, + }, + tags: {}, // Remove any metadata tags +}); + +await conversion.execute(); +// Conversion is complete +``` + +::: info + +* Check out the File compression example for this code in action. + ::: + +## Add a video overlay + +```ts +import { + Input, + Output, + Conversion, +} from 'mediabunny'; + +// For example, let's load a watermark image +const watermark = new Image(); +watermark.src = '/watermark.jpg'; +await new Promise(resolve => watermark.onload = resolve); + +const input = new Input(...); +const output = new Output(...); + +let ctx: CanvasRenderingContext2D | null = null; +const conversion = await Conversion.init({ + input, + output, + video: { + process: (sample) => { + if (!ctx) { + // Create a canvas for image compositing + const canvas = new OffscreenCanvas( + sample.displayWidth, + sample.displayHeight, + ); + ctx = canvas.getContext('2d')!; + } + + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + sample.draw(ctx, 0, 0); + ctx.drawImage(watermark, 32, 32); + + return ctx.canvas; + }, + }, +}); + +await conversion.execute(); +// Conversion is complete +``` + +--- + +--- +url: /guide/reading-media-files.md +--- +# Reading media files + +Mediabunny allows you to read media files with great control and efficiency. You can use it to extract metadata (such as duration or resolution), as well as to read actual media data from video and audio tracks with frame-accurate timing. Many commonly used [input file formats](./input-formats) are supported. Using [input sources](#input-sources), data can be read from multiple sources, such as directly from memory, from the user's disk, or even over the network. + +Files are always read partially ("lazily"), meaning only the bytes required to extract the requested information will be read, keeping performance high and memory usage low. Therefore, most methods for reading data are asynchronous and return promises. + +::: info +Not all data is extracted equally. Methods that are prefixed with `compute` instead of `get` indicate that the library might need to do more work to retrieve the requested data. +::: + +## Creating a new input + +Reading media files in Mediabunny revolves around a central class, `Input`, from which all reading operations begin. One instance of `Input` represents one media file that we want to read. + +Start by creating a new instance of `Input`. Here, we're creating it with a [File](https://developer.mozilla.org/en-US/docs/Web/API/File) instance, meaning we'll be reading data directly from the user's disk: + +```ts +import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; + +const input = new Input({ + formats: ALL_FORMATS, + source: new BlobSource(file), +}); +``` + +`source` specifies where the `Input` reads data from. See [Input sources](#input-sources) for a full list of available input sources. + +`formats` specifies the list of formats that the `Input` should support. This field is mainly used for tree shaking optimizations: Using `ALL_FORMATS` means we can load files of [any format that Mediabunny supports](./supported-formats-and-codecs#container-formats), but requires that we include the parsers for each of these formats. If we know we'll only be reading MP3 or WAVE files, then something like this will reduce the overall bundle size drastically: + +```ts +import { Input, MP3, WAVE } from 'mediabunny'; + +const input = new Input({ + formats: [MP3, WAVE], + // .... +}); +``` + +Reading operations will throw an error if the file format could not be recognized. See [Input formats](./input-formats) for the full list of available input formats. + +::: info +Simply creating an instance of `Input` will perform zero reads and is practically free. The file will only be read once data is requested. +::: + +## Reading file metadata + +With our instance of `Input` created, you can now start reading file-level metadata. + +You can query the concrete format of the file like this: + +```ts +await input.getFormat(); // => Mp4InputFormat +``` + +You can directly retrieve the full MIME type of the file, including track codecs: + +```ts +await input.getMimeType(); // => 'video/mp4; codecs="avc1.42c032, mp4a.40.2"' +``` + +Use `computeDuration` to get the full duration of the media file in seconds: + +```ts +await input.computeDuration(); // => 1905.4615 +``` + +More specifically, the duration is defined as the maximum end timestamp across all tracks. + +Mediabunny also lets you read descriptive metadata tags from media files, such as title, artist, or cover art: + +```ts +await input.getMetadataTags(); // => MetadataTags +``` + +For more info, see [`MetadataTags`](../api/MetadataTags). + +## Reading track metadata + +You can extract the list of all media tracks in the file like so: + +```ts +await input.getTracks(); // => InputTrack[] +``` + +There are additional utility methods for retrieving tracks that can be useful: + +```ts +await input.getVideoTracks(); // => InputVideoTrack[] +await input.getAudioTracks(); // => InputAudioTrack[] + +await input.getPrimaryVideoTrack(); // => InputVideoTrack | null +await input.getPrimaryAudioTrack(); // => InputAudioTrack | null +``` + +::: info +Subtitle tracks are currently not supported for reading. +::: + +### Common track metadata + +Once you have an `InputTrack`, you can start extracting metadata from it. + +```ts +// Get a unique ID for this track in the input file: +track.id; // => number + +// Check the track's type: +track.type; // => 'video' | 'audio' | 'subtitle'; + +// Alternatively, use these type predicate methods: +track.isVideoTrack(); // => boolean +track.isAudioTrack(); // => boolean + +// Retrieve the track's language as an ISO 639-2/T language code. +// Resolves to 'und' (undetermined) if the language isn't known. +track.languageCode; // => string + +// A user-defined name for this track. +track.name; // => string + +// Information about the intended usage of the track +// (default, commentary, hearing-impaired, visually-impaired, etc.) +track.disposition; // TrackDisposition +``` + +#### Codec information + +You can query metadata related to the track's codec: + +```ts +track.codec; // => MediaCodec | null +``` + +This field is `null` when the track's codec couldn't be recognized or is not supported by Mediabunny. See [Codecs](./supported-formats-and-codecs#codecs) for the full list of supported codecs. When Mediabunny doesn't recognize the format, you can still use the `internalCodecId` field to figure out the codec of the track, although its format depends on the container format used and is not homogenized by Mediabunny. + +You can also extract the full codec parameter string from the track, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/): + +```ts +await track.getCodecParameterString(); // => 'avc1.42001f' +``` + +Just because the codec is known doesn't mean the user's browser will be able to decode it. To check decodability, use `canDecode`: + +```ts +await track.canDecode(); // => boolean +``` + +::: info +This check also takes [custom decoders](./supported-formats-and-codecs#custom-decoders) into account. +::: + +#### Track timing info + +You can compute the track's specific duration in seconds like so: + +```ts +await track.computeDuration(); // => 1902.4615 +``` + +Analogous to the `Input`'s duration, this is identical to the end timestamp of the last sample. A track's duration may be shorter than the `Input`'s total duration if the `Input` has multiple tracks which differ in length. + +You can also retrieve the track's *start timestamp* in seconds: + +```ts +await track.getFirstTimestamp(); // => 0.041666666666666664 +``` + +This is the opposite of *duration*: It's the start timestamp of the first sample. + +::: warning +A track's start timestamp does **NOT** need to be 0. It is typically close to zero, but it may be slightly positive, or even slightly negative. + +A *positive start timestamp* means the first sample is presented *after* the overall composition begins. If this is a video track, you may choose to either display a placeholder image (like a black screen), or to display the first frame as a freeze frame until the second frame starts. + +A *negative start timestamp* means the track begins *before* the composition does; this effectively means that some beginning section of the media data is "cut off". It is recommended not to display samples with negative timestamps. +::: + +Another metric related to track timing info is its *time resolution*, which is given in hertz: + +```ts +track.timeResolution; // => 24 +``` + +Intuitively, this is the maximum possible "frame rate" of the track (assuming that no two samples have the same timestamp). Mathematically, if $x$ is equal to a track's time resolution, then all timestamps and durations of that track can be expressed as: + +$$ \frac{k}{x},\quad k \in \mathbb{Z} $$ + +::: info +This field only gives an upper bound on a track's frame rate. To get a track's actual frame rate based on its samples, compute its [packet statistics](#packet-statistics). +::: + +#### Packet statistics + +You can query aggregate statistics about a track's encoded packets: + +```ts +await track.computePacketStats(); // => PacketStats + +type PacketStats = { + // The total number of packets. + packetCount: number; + // The average number of packets per second. + // For video tracks, this will equal the average frame rate (FPS). + averagePacketRate: number; + // The average number of bits per second. + averageBitrate: number; +}; +``` + +For example, running this on the video track of a 1080p version of Big Buck Bunny returns this: + +```ts +{ + packetCount: 14315, + averagePacketRate: 24, + averageBitrate: 9282573.233670976, +} +``` + +This means the video track has a total of 14315 frames, a frame rate of exactly 24 Hz, and an average bitrate of ~9.28 Mbps. + +**Note:** These statistics aren't simply read from file metadata but have to be computed, meaning this method may - depending on the file - need to perform many reads and might take several hundred milliseconds to resolve. To speed up computation, you can compute aggregate statistics for only a subset of packets by passing a parameter to the method: + +```ts +await track.computePacketStats(50); +``` + +This will only look at the first ~50 packets and then return the result. This is great for quickly getting an estimate of frame rate and bitrate, without having to scan through the entire file. For videos with a constant frame rate, this will also always return the correct frame rate. + +### Video track metadata + +In addition to the [common track metadata](#common-track-metadata), video tracks have additional metadata you can query: + +```ts +// Get the raw pixel dimensions of the track's coded samples, before rotation: +videoTrack.codedWidth; // => number +videoTrack.codedHeight; // => number + +// Get the displayed pixel dimensions of the track's samples, after rotation: +videoTrack.displayWidth; // => number +videoTrack.displayHeight; // => number + +// Get the clockwise rotation in degrees by which the +// track's frames should be rotated: +videoTrack.rotation; // => 0 | 90 | 180 | 270 +``` + +To compute a video track's average frame rate (FPS), use [`computePacketStats`](#packet-statistics): + +```ts +const stats = await videoTrack.computePacketStats(100); +const frameRate = stats.averagePacketRate; // Approximate, but often exact +``` + +You can retrieve the track's decoder configuration, which is a `VideoDecoderConfig` from the WebCodecs API for usage within `VideoDecoder`: + +```ts +await videoTrack.getDecoderConfig(); // => VideoDecoderConfig | null +``` + +This method can resolve to `null` if the track's codec isn't known. + +For example, here's the decoder configuration for a 1080p version of Big Buck Bunny: + +```ts +{ + codec: 'avc1.4d4029', + codedWidth: 1920, + codedHeight: 1080, + description: new Uint8Array([ + // Bytes of the AVCDecoderConfigurationRecord + 1, 77, 64, 41, 255, 225, 0, 22, 39, 77, 64, 41, 169, 24, 15, 0, + 68, 252, 184, 3, 80, 16, 16, 27, 108, 43, 94, 247, 192, 64, 1, 0, + 4, 40, 222, 9, 200, + ]), +} +``` + +You can directly retrieve information about the video's color space: + +```ts +await videoTrack.getColorSpace(); // => VideoColorSpaceInit +``` + +The resulting object will contain `undefined` values if color space information is not known. + +You can also directly check if a video has a *high dynamic range* (HDR): + +```ts +await videoTrack.hasHighDynamicRange(); // => boolean +``` + +This method compares with the available color space metadata. If it resolves to `true`, then the video is HDR; if it resolves to `false`, the video may or may not be HDR. + +### Audio track metadata + +In addition to the [common track metadata](#common-track-metadata), audio tracks have additional metadata you can query: + +```ts +// Get the number of audio channels: +audioTrack.numberOfChannels; // => number + +// Get the audio sample rate in hertz: +audioTrack.sampleRate; // => number +``` + +You can retrieve the track's decoder configuration, which is an `AudioDecoderConfig` from the WebCodecs API for usage within `AudioDecoder`: + +```ts +await audioTrack.getDecoderConfig(); // => AudioDecoderConfig | null +``` + +This method can resolve to `null` if the track's codec isn't known. + +For example, here's the decoder configuration for an AAC audio track: + +```ts +{ + codec: 'mp4a.40.2', + numberOfChannels: 2, + sampleRate: 44100, + description: new Uint8Array([ + // Bytes of the AudioSpecificConfig + 17, 144, + ]), +} +``` + +## Reading media data + +Mediabunny has the concept of *media sinks*, which are the way to read media data from an `InputTrack`. Media sinks differ in their API and in their level of abstraction, meaning you can pick whichever sink best fits your use case. + +See [Media sinks](./media-sinks) for a full list of sinks. + +### Examples + +Loop over all raw encoded packets of a track: + +```ts +import { EncodedPacketSink } from 'mediabunny'; + +const videoTrack = await input.getPrimaryVideoTrack(); +const sink = new EncodedPacketSink(videoTrack); + +for await (const packet of sink.packets()) { + console.log(packet.timestamp); +} +``` + +Here we iterate over all samples (frames) of a video track: + +```ts +import { VideoSampleSink } from 'mediabunny'; + +const videoTrack = await input.getPrimaryVideoTrack(); +const sink = new VideoSampleSink(videoTrack); + +for await (const sample of sink.samples()) { + // For example, let's draw the sample to a canvas: + sample.draw(ctx, 0, 0); +} +``` + +We can also use this sink in more concrete ways: + +```ts +// Loop over all frames between the timestamps of 300s and 305s +for await (const sample of sink.samples(300, 305)) { + // ... +} + +// Get the frame that's displayed at timestamp 42s +await sink.getSample(42); +``` + +We may want to extract downscaled thumbnails from a video track: + +```ts +import { CanvasSink } from 'mediabunny'; + +const videoTrack = await input.getPrimaryVideoTrack(); +const sink = new CanvasSink(videoTrack, { + width: 320, + height: 180, +}); + +const startTimestamp = await videoTrack.getFirstTimestamp(); +const endTimestamp = await videoTrack.computeDuration(); + +// Let's generate five equally-spaced thumbnails: +const thumbnailTimestamps = [0, 0.2, 0.4, 0.6, 0.8].map( + (t) => startTimestamp + t * (endTimestamp - startTimestamp), +); + +for await (const result of sink.canvasesAtTimestamps(thumbnailTimestamps)) { + // Add MrBeast's face to the thumbnail +} +``` + +We may loop over a section of an audio track and play it using the Web Audio API: + +```ts +import { AudioBufferSink } from 'mediabunny'; + +const audioTrack = await input.getPrimaryAudioTrack(); +const sink = new AudioBufferSink(audioTrack); + +for await (const { buffer, timestamp } of sink.buffers(5, 10)) { + const node = audioContext.createBufferSource(); + node.buffer = buffer; + node.connect(audioContext.destination); + node.start(timestamp); +} +``` + +Or we may take the decoding process into our own hands: + +```ts +import { EncodedPacketSink } from 'mediabunny'; + +const videoTrack = await input.getPrimaryVideoTrack(); +const sink = new EncodedPacketSink(videoTrack); + +const decoder = new VideoDecoder({ + output: console.log, + error: console.error, +}); +decoder.configure(await videoTrack.getDecoderConfig()); + +// Let's crank through all packets from timestamp 37s to 50s: +let currentPacket = await sink.getKeyPacket(37); +while (currentPacket && currentPacket.timestamp < 50) { + decoder.decode(currentPacket.toEncodedVideoChunk()); + currentPacket = await sink.getNextPacket(currentPacket); +} + +await decoder.flush(); +``` + +As you can see, media sinks are incredibly versatile and allow for efficient, sparse reading of media data within the input file. + +## Disposing inputs + +When you're not using them anymore, `Input` instances will automatically get cleaned up by garbage collection. However, sometimes you may want to prematurely dispose of an `Input` and all its connected resources, or cancel any ongoing operation. You can do it like so: + +```ts +input.dispose(); +``` + +When an `Input` is disposed, ongoing read operations will be canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink operations will be canceled. Disallowed and canceled operations will throw an `InputDisposedError`. + +You are expected not to use an `Input` after disposing it. While some operations may still work, it is not specified and may change in any future update. + +`Input` also implements `Disposable`, meaning you can use it with JavaScript Explicit Resource Management features such as the [`using` keyword](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using): + +```ts +{ + using input = new Input(...); + + // `input` will automatically be disposed +} +``` + +Using `using` is recommended over `const` if you only need the `Input` momentarily within a single scope. + +## Input sources + +The *input source* determines where the `Input` reads data from. + +All sources have an `onread` callback property you can set to inspect which areas of the file are being read: + +```ts +source.onread = (start, end) => { + console.log(`Reading byte range [${start}, ${end})`); +}; +``` + +*** + +This library offers a couple of sources: + +### `BufferSource` + +This source uses an in-memory `ArrayBuffer` as the underlying source of data. + +```ts +import { BufferSource } from 'mediabunny'; + +// You can construct a BufferSource directly from ArrayBuffer: +const source = new BufferSource(arrayBuffer); + +// Or also from a Uint8Array: +const source = new BufferSource(uint8Array); +``` + +This source is the fastest but requires the entire input file to be held in memory. + +### `BlobSource` + +This source is backed by an underlying [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) object. Since [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) extends `Blob`, this source is perfect for reading data directly from disk (in the browser). + +```ts +import { BlobSource } from 'mediabunny'; + +fileInput.addEventListener('change', (event) => { + const file = event.target.files[0]; + const source = new BlobSource(file); +}); +``` + +`BlobSource` accepts additional options as a second parameter: + +```ts +type BlobSourceOptions = { + // The maximum number of bytes the cache is allowed to hold + // in memory. Defaults to 8 MiB. + maxCacheSize?: number; +}; +``` + +### `UrlSource` + +This source fetches data from a remote URL, useful for reading files over the network. + +```ts +import { UrlSource } from 'mediabunny'; + +const source = new UrlSource('https://example.com/bigbuckbunny.mp4'); +``` + +`UrlSource` will do some pretty crazy stuff to prefetch data intelligently based on observed access patterns to minimize request count and latency. + +::: warning +If you're using this source in the browser and the URL is on a different origin, make sure [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS) is properly configured. +::: + +`UrlSource` accepts a few options as its second parameter: + +```ts +type UrlSourceOptions = { + requestInit?: RequestInit; + getRetryDelay?: (previousAttempts: number, error: unknown, url: string | URL | Request) => number | null; + + // The maximum number of bytes the cache is allowed to hold + // in memory. Defaults to 8 MiB. + maxCacheSize?: number; + + // Used to provide a custom fetch function + fetchFn?: typeof fetch; +}; +``` + +You can use `requestInit` just like you would in the Fetch API to further customize the request: + +```ts +const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { + requestInit: { + headers: { + 'X-Custom-Header': 'my-value', + }, + }, +}); +``` + +`getRetryDelay` can be used to control the retry logic used should a request fail. When a request fails, `getRetryDelay` should return the time to wait in seconds before the request will be retried. Returning `null` prevents further retries. + +```ts +// UrlSource using retry logic with exponential backoff: +const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { + getRetryDelay: (previousAttempts) => Math.min(2 ** previousAttempts, 16), +}); +``` + +Not setting `getRetryDelay` will lead to the default being used: + +* Infinite exponential backoff pattern, capped at 16 seconds. +* If a CORS error is suspected (`fetch()` did reject even though `navigator.onLine` is true and origin is different), no further retries will be made. + +*** + +Use `fetchFn` to provide a custom fetch function, usually for polyfill reasons. For example, React Native's `fetch` does not support streamable response bodies, a feature that `UrlSource` requires. In this case, you could use [Expo's `fetch` function](https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api) instead: + +```ts +import { UrlSource } from 'mediabunny'; +import { fetch } from 'expo/fetch'; + +const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { + fetchFn: (input, init) => { + if (typeof input !== 'string') { + // Expo requires string URLs + throw new Error('Expected a string URL.'); + } + + return fetch(input, init); + }, +}); +``` + +### `FilePathSource` + +This input source can be used to load data directly from a file, given a file path. It requires a server-side environment such as Node, Bun, or Deno. + +```ts +import { FilePathSource } from 'mediabunny'; + +const source = new FilePathSource('/home/david/Downloads/bigbuckbunny.mp4'); +``` + +`FilePathSource` accepts additional options as a second parameter: + +```ts +type FilePathSourceOptions = { + // The maximum number of bytes the cache is allowed to hold + // in memory. Defaults to 8 MiB. + maxCacheSize?: number; +}; +``` + +::: warning +When using this source, make sure to manually [dispose of the Input](#disposing-inputs) when you are done with it to properly close the internal file handle held by this source. +::: + +### `StreamSource` + +This is a general-purpose input source you can use to read data from anywhere. + +For example, here we're reading a file from disk using the Node.js file system (although you should use [`FilePathSource`](#filepathsource) for that): + +```ts +import { StreamSource } from 'mediabunny'; +import { open } from 'node:fs/promises'; + +const fileHandle = await open('bigbuckbunny.mp4', 'r'); + +const source = new StreamSource({ + read: async (start, end) => { + const buffer = Buffer.alloc(end - start); + await fileHandle.read(buffer, 0, end - start, start); + return buffer; + }, + getSize: async () => { + const { size } = await fileHandle.stat(); + return size; + }, +}); +``` + +The options of `StreamSource` have the following type: + +```ts +type StreamSourceOptions = { + getSize: () => MaybePromise; + read: (start: number, end: number) => MaybePromise>; + dispose?: () => unknown; + maxCacheSize?: number; + prefetchProfile?: 'none' | 'fileSystem' | 'network'; +}; + +type MaybePromise = T | Promise; +``` + +* `getSize`\ + Called when the size of the entire file is requested. Must return or resolve to the size in bytes. This function is guaranteed to be called before `read`. +* `read`\ + Called when data is requested. Must return or resolve to the bytes from the specified byte range, or a stream that yields these bytes. +* `dispose`\ + Called when the `Input` driven by this source is disposed. +* `maxCacheSize`\ + The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. +* `prefetchProfile`\ + Specifies the prefetch profile that the reader should use with this source. A prefetch propfile specifies the pattern with which bytes outside of the requested range are preloaded to reduce latency for future reads. + * `'none'` (default): No prefetching; only the data needed in the moment is requested. + * `'fileSystem'`: File system-optimized prefetching: a small amount of data is prefetched bidirectionally, aligned with page boundaries. + * `'network'`: Network-optimized prefetching, or more generally, prefetching optimized for any high-latency environment: tries to minimize the amount of read calls and aggressively prefetches data when sequential access patterns are detected. + +### `ReadableStreamSource` + +This is a source backed by a `ReadableStream` of `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally streaming in input files that are still being constructed and whose size we don't yet know. You could also use it to stream in existing files, but other sources (such as [`BlobSource`](#blobsource) or [`FilePathSource`](#filepathsource)) are recommended instead because they offer random access. + +```ts +import { ReadableStreamSource } from 'mediabunny'; + +const { writable, readable } = new TransformStream(); +const source = new ReadableStreamSource(readable); + +// Append chunks of data +const writer = writable.getWriter(); +writer.write(chunk1); +writer.write(chunk2); +writer.close(); +``` + +This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the lack of random file access. You should only use this source with sequential access patterns, such as reading all packets from start to end or doing conversions. This source does not work well with random access patterns unless you increase its max cache size. + +```ts +type ReadableStreamSourceOptions = { + // The maximum number of bytes the cache is allowed to hold + // in memory. Defaults to 16 MiB. + maxCacheSize?: number; +}; +``` + +#### Use with [`MediaRecorder`](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder) + +You can combine `MediaRecorder` with `ReadableStreamSource` to stream recorded data into Mediabunny while the recording is taking place. Here's an example where we pipe `MediaRecorder`'s output into Mediabunny's Conversion API to create a WAVE file: + +```ts +import { + Input, + Output, + Conversion, + ReadableStreamSource, + ALL_FORMATS, + WavOutputFormat, + BufferTarget, +} from 'mediabunny'; + +// Set up a TransformStream to convert MediaRecorder's Blobs into Uint8Arrays +const { writable, readable } = new TransformStream({ + async transform(chunk, controller) { + const arrayBuffer = await chunk.arrayBuffer(); + controller.enqueue(new Uint8Array(arrayBuffer)); + }, +}); + +const input = new Input({ + source: new ReadableStreamSource(readable), + formats: ALL_FORMATS, +}); +const output = new Output({ + format: new WavOutputFormat(), + target: new BufferTarget(), +}); + +const conversionPromise = Conversion.init({ input, output }) + .then(conversion => conversion.execute()); + +const micStream = await navigator.mediaDevices.getUserMedia({ audio: true }); +const recorder = new MediaRecorder(micStream); +const writer = writable.getWriter(); + +recorder.ondataavailable = e => writer.write(e.data); +recorder.onstop = async () => { + await writer.close(); + await conversionPromise; + + // Get the final .wav file + const wavFile = output.target.buffer!; // => ArrayBuffer +}; + +recorder.start(1000); +setTimeout(() => recorder.stop(), 10_000); // Stop recording after 10s +``` + +--- + +--- +url: /guide/supported-formats-and-codecs.md +--- +# Supported formats & codecs + +## Container formats + +Mediabunny supports many commonly used media container formats, all of which are supported bidirectionally (reading & writing): + +* ISOBMFF-based formats (.mp4, .m4v, .m4a, ...) +* QuickTime File Format (.mov) +* Matroska (.mkv) +* WebM (.webm) +* Ogg (.ogg) +* MP3 (.mp3) +* WAVE (.wav) +* ADTS (.aac) +* FLAC (.flac) + +## Codecs + +Mediabunny supports a wide range of video, audio, and subtitle codecs. More specifically, it supports all codecs specified by the WebCodecs API and a few additional PCM codecs out of the box. + +The availability of the codecs provided by the WebCodecs API depends on the browser and thus cannot be guaranteed by this library. Mediabunny provides [special utility functions](#querying-codec-encodability) to check which codecs are able to be encoded. You can also specify [custom coders](#custom-coders) to provide your own encoder/decoder implementation if the browser doesn't support the codec natively. + +::: info +Mediabunny ships with built-in decoders and encoders for all audio PCM codecs, meaning they are always supported. +::: + +### Video codecs + +* `'avc'` - Advanced Video Coding (AVC) / H.264 +* `'hevc'` - High Efficiency Video Coding (HEVC) / H.265 +* `'vp8'` - VP8 +* `'vp9'` - VP9 +* `'av1'` - AOMedia Video 1 (AV1) + +### Audio codecs + +* `'aac'` - Advanced Audio Coding (AAC) +* `'opus'` - Opus +* `'mp3'` - MP3 +* `'vorbis'` - Vorbis +* `'flac'` - Free Lossless Audio Codec (FLAC) +* `'pcm-u8'` - 8-bit unsigned PCM +* `'pcm-s8'` - 8-bit signed PCM +* `'pcm-s16'` - 16-bit little-endian signed PCM +* `'pcm-s16be'` - 16-bit big-endian signed PCM +* `'pcm-s24'` - 24-bit little-endian signed PCM +* `'pcm-s24be'` - 24-bit big-endian signed PCM +* `'pcm-s32'` - 32-bit little-endian signed PCM +* `'pcm-s32be'` - 32-bit big-endian signed PCM +* `'pcm-f32'` - 32-bit little-endian float PCM +* `'pcm-f32be'` - 32-bit big-endian float PCM +* `'pcm-f64'` - 64-bit little-endian float PCM +* `'pcm-f64be'` - 64-bit big-endian float PCM +* `'ulaw'` - μ-law PCM +* `'alaw'` - A-law PCM + +### Subtitle codecs + +* `'webvtt'` - WebVTT + +## Compatibility table + +Not all codecs can be used with all containers. The following table specifies the supported codec-container combinations: + +| | .mp4 | .mov | .mkv | .webm\[^1] | .ogg | .mp3 | .wav | .aac | .flac | +|:--------------:|:--------:|:-----:|:-----:|:---------:|:-----:|:-----:|:-----:|:-----:|:-----:| +| `'avc'` | ✓ | ✓ | ✓ | | | | | | | +| `'hevc'` | ✓ | ✓ | ✓ | | | | | | | +| `'vp8'` | ✓ | ✓ | ✓ | ✓ | | | | | | +| `'vp9'` | ✓ | ✓ | ✓ | ✓ | | | | | | +| `'av1'` | ✓ | ✓ | ✓ | ✓ | | | | | | +| `'aac'` | ✓ | ✓ | ✓ | | | | | ✓ | | +| `'opus'` | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | +| `'mp3'` | ✓ | ✓ | ✓ | | | ✓ | | | | +| `'vorbis'` | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | +| `'flac'` | ✓ | ✓ | ✓ | | | | | | ✓ | +| `'pcm-u8'` | | ✓ | ✓ | | | | ✓ | | | +| `'pcm-s8'` | | ✓ | | | | | | | | +| `'pcm-s16'` | ✓ | ✓ | ✓ | | | | ✓ | | | +| `'pcm-s16be'` | ✓ | ✓ | ✓ | | | | | | | +| `'pcm-s24'` | ✓ | ✓ | ✓ | | | | ✓ | | | +| `'pcm-s24be'` | ✓ | ✓ | ✓ | | | | | | | +| `'pcm-s32'` | ✓ | ✓ | ✓ | | | | ✓ | | | +| `'pcm-s32be'` | ✓ | ✓ | ✓ | | | | | | | +| `'pcm-f32'` | ✓ | ✓ | ✓ | | | | ✓ | | | +| `'pcm-f32be'` | ✓ | ✓ | | | | | | | | +| `'pcm-f64'` | ✓ | ✓ | ✓ | | | | | | | +| `'pcm-f64be'` | ✓ | ✓ | | | | | | | | +| `'ulaw'` | | ✓ | | | | | ✓ | | | +| `'alaw'` | | ✓ | | | | | ✓ | | | +| `'webvtt'`\[^2] | (✓) | | (✓) | (✓) | | | | | | + +\[^1]: WebM only supports a small subset of the codecs supported by Matroska. However, this library can technically read all codecs from a WebM that are supported by Matroska. +\[^2]: WebVTT can only be written, not read. + +## Querying codec encodability + +Mediabunny provides utility functions that you can use to check if the browser can encode a given codec. Additionally, you +can check if a codec is encodable with a specific *configuration*. + +`canEncode` tests whether a codec can be encoded using typical settings: + +```ts +import { canEncode } from 'mediabunny'; + +canEncode('avc'); // => Promise +canEncode('opus'); // => Promise +``` + +Video codecs are checked using 1280x720 @1Mbps, while audio codecs are checked using 2 channels, 48 kHz @128kbps. + +You can also check encodability using specific configurations: + +```ts +import { canEncodeVideo, canEncodeAudio } from 'mediabunny'; + +canEncodeVideo('hevc', { + width: 1920, height: 1080, bitrate: 1e7 +}); // => Promise + +canEncodeAudio('aac', { + numberOfChannels: 1, sampleRate: 44100, bitrate: 192e3 +}); // => Promise +``` + +Additionally, most properties of [`VideoEncodingConfig`](./media-sources#video-encoding-config) and [`AudioEncodingConfig`](./media-sources#audio-encoding-config) can be used here as well. + +*** + +In addition, you can use the following functions to check encodability for multiple codecs at once, getting back a list of supported codecs: + +```ts +import { + getEncodableCodecs, + getEncodableVideoCodecs, + getEncodableAudioCodecs, + getEncodableSubtitleCodecs, +} from 'mediabunny'; + +getEncodableCodecs(); // => Promise +getEncodableVideoCodecs(); // => Promise +getEncodableAudioCodecs(); // => Promise +getEncodableSubtitleCodecs(); // => Promise + +// These functions also accept optional configuration options. +// Here, we check which of AVC, HEVC and VP8 can be encoded at 1920x1080 @10Mbps: +getEncodableVideoCodecs( + ['avc', 'hevc', 'vp8'], + { width: 1920, height: 1080, bitrate: 1e7 }, +); // => Promise +``` + +*** + +If you simply want to find the best codec that the browser can encode, you can use these functions, which return the first codec supported by the browser: + +```ts +import { + getFirstEncodableVideoCodec, + getFirstEncodableAudioCodec, + getFirstEncodableSubtitleCodec, +} from 'mediabunny'; + +getFirstEncodableVideoCodec(['avc', 'vp9', 'av1']); // => Promise +getFirstEncodableAudioCodec(['opus', 'aac']); // => Promise + +getFirstEncodableVideoCodec( + ['avc', 'hevc', 'vp8'], + { width: 1920, height: 1080, bitrate: 1e7 }, +); // => Promise +``` + +If none of the listed codecs is supported, `null` is returned. + +These functions are especially useful in conjunction with an [output format](./output-formats) to retrieve the best codec that is supported both by the encoder as well as the container format: + +```ts +import { + Mp4OutputFormat, + getFirstEncodableVideoCodec, +} from 'mediabunny'; + +const outputFormat = new Mp4OutputFormat(); +const containableVideoCodecs = outputFormat.getSupportedVideoCodecs(); +const bestVideoCodec = await getFirstEncodableVideoCodec(containableVideoCodecs); +``` + +::: info +Codec encodability checks take [custom encoders](#custom-encoders) into account. +::: + +## Querying codec decodability + +Whether a codec can be decoded depends on the specific codec configuration of an `InputTrack`; you can use its [`canDecode`](./reading-media-files#codec-information) method to check. + +## Custom coders + +Mediabunny allows you to register your own custom encoders and decoders - useful if you want to polyfill a codec that's not supported in all browsers, or want to use Mediabunny outside of an environment with WebCodecs (such as Node.js). + +Encoders and decoders can be registered for [all video and audio codecs](#codecs) supported by the library. It is not possible to add new codecs. + +::: warning +Mediabunny requires customs encoders and decoders to follow very specific implementation rules. Pay special attention to the parts labeled with "**must**" to ensure compatibility. +::: + +### Custom encoders + +To create a custom video or audio encoder, you'll need to create a class which extends `CustomVideoEncoder` or `CustomAudioEncoder`. Then, you **must** register this class using `registerEncoder`: + +```ts +import { CustomAudioEncoder, registerEncoder } from 'mediabunny'; + +class MyAwesomeMp3Encoder extends CustomAudioEncoder { + // ... +} +registerEncoder(MyAwesomeMp3Encoder); +``` + +The following properties are available on each encoder instance and are set by the library: + +```ts +class { + // For video encoders: + codec: VideoCodec; + config: VideoEncoderConfig; + onPacket: (packet: EncodedPacket, meta?: EncodedVideoChunkMetadata) => unknown; + + // For audio encoders: + codec: AudioCodec; + config: AudioEncoderConfig; + onPacket: (packet: EncodedPacket, meta?: EncodedAudioChunkMetadata) => unknown; +} +``` + +`codec` and `config` specify the concrete codec configuration to use, and `onPacket` is a method that your code **must** call for each encoded packet it creates. + +You **must** implement the following methods in your custom encoder class: + +```ts +class { + // For video encoders: + static supports(codec: VideoCodec, config: VideoEncoderConfig): boolean; + // For audio encoders: + static supports(codec: AudioCodec, config: AudioEncoderConfig): boolean; + + init(): Promise | void; + encode(sample: VideoSample, options: VideoEncoderEncodeOptions): Promise | void; // For video + encode(sample: AudioSample): Promise | void; // For audio + flush(): Promise | void; + close(): Promise | void; +} +``` + +* `supports`\ + This is a *static* method that **must** return `true` if the encoder is able to encode the specified codec, and `false` if not. If it returns `true`, a new instance of your encoder class will be created by the library and will be used for encoding, taking precedence over the default encoders. +* `init`\ + Called by the library after your class is instantiated. Place any initialization logic here. +* `encode`\ + Called for each sample that is to be encoded. The resulting encoded packet **must** then be passed to the `onPacket` method. +* `flush`\ + Called when the encoder is expected to finish the encoding process for all remaining samples that haven't finished encoding yet. This method **must** return/resolve only once all samples passed to `encode` have been fully encoded. It **must** then reset its own internal state to be ready for the next encoding batch. +* `close`\ + Called when the encoder is no longer needed and can release its internal resources. + +::: info +All instance methods of the class can return promises. In this case, the library will make sure to *serialize* all method calls such that no two methods ever run concurrently. +::: + +::: warning +The packets passed to `onPacket` **must** be in [decode order](./media-sinks.md#decode-vs-presentation-order). +::: + +### Custom decoders + +To create a custom video or audio decoder, you'll need to create a class which extends `CustomVideoDecoder` or `CustomAudioDecoder`. Then, you **must** register this class using `registerDecoder`: + +```ts +import { CustomAudioDecoder, registerDecoder } from 'mediabunny'; + +class MyAwesomeMp3Decoder extends CustomAudioDecoder { + // ... +} +registerDecoder(MyAwesomeMp3Decoder); +``` + +The following properties are available on each decoder instance and are set by the library: + +```ts +class { + // For video decoders: + codec: VideoCodec; + config: VideoDecoderConfig; + onSample: (sample: VideoSample) => unknown; + + // For audio decoders: + codec: AudioCodec; + config: AudioDecoderConfig; + onSample: (sample: AudioSample) => unknown; +} +``` + +`codec` and `config` specify the concrete codec configuration to use, and `onSample` is a method that your code **must** call for each video/audio sample it creates. + +You **must** implement the following methods in your custom decoder class: + +```ts +class { + // For video decoders: + static supports(codec: VideoCodec, config: VideoDecoderConfig): boolean; + // For audio decoders: + static supports(codec: AudioCodec, config: AudioDecoderConfig): boolean; + + init(): Promise | void; + decode(packet: EncodedPacket): Promise | void; + flush(): Promise | void; + close(): Promise | void; +} +``` + +* `supports`\ + This is a *static* method that **must** return `true` if the decoder is able to decode the specified codec, and `false` if not. If it returns `true`, a new instance of your decoder class will be created by the library and will be used for decoding, taking precedence over the default decoders. +* `init`\ + Called by the library after your class is instantiated. Place any initialization logic here. +* `decode`\ + Called for each `EncodedPacket` that is to be decoded. The resulting video or audio sample **must** then be passed to the `onSample` method. +* `flush`\ + Called when the decoder is expected to finish the decoding process for all remaining packets that haven't finished decoding yet. This method **must** return/resolve only once all packets passed to `decode` have been fully decoded. It **must** then reset its own internal state to be ready for the next decoding batch. +* `close`\ + Called when the decoder is no longer needed and can release its internal resources. + +::: info +All instance methods of the class can return promises. In this case, the library will make sure to *serialize* all method calls such that no two methods ever run concurrently. +::: + +::: warning +The samples passed to `onSample` **must** be sorted by increasing timestamp. This especially means if the decoder is decoding a video stream that makes use of [B-frames](./media-sources.md#b-frames), the decoder **must** internally hold on to these frames so it can emit them sorted by presentation timestamp. This strict sorting requirement is reset each time `flush` is called. +::: + +--- + +--- +url: /guide/writing-media-files.md +--- +# Writing media files + +Mediabunny enables you to create media files with very fine levels of control. You can add an arbitrary number of video, audio and subtitle tracks to a media file, and precisely control the timing of media data. This library supports [many output file formats](./output-formats). Using [output targets](#output-targets), you can decide if you want to build up the entire file in memory or stream it out in chunks as it's being created - allowing you to create very large files. + +Mediabunny provides many ways to supply media data for output tracks, nicely integrating with the WebCodecs API, but also allowing you to use your own encoding stack if you wish. These [media sources](./media-sources) come in multiple levels of abstraction, enabling easy use for common use cases while still giving you fine-grained control if you need it. + +## Creating an output + +Media file creation in Mediabunny revolves around a central class, `Output`. One instance of `Output` represents one media file you want to create. + +Start by creating a new instance of `Output` using the desired configuration of the file you want to create: + +```ts +import { Output, Mp4OutputFormat, BufferTarget } from 'mediabunny'; + +// In this example, we'll be creating an MP4 file in memory: +const output = new Output({ + format: new Mp4OutputFormat(), + target: new BufferTarget(), +}); +``` + +See [Output formats](./output-formats) for a full list of available output formats.\ +See [Output targets](#output-targets) for a full list of available output targets. + +You can always access `format` and `target` on the output: + +```ts +output.format; // => Mp4OutputFormat +output.target; // => BufferTarget +``` + +## Adding tracks + +There are a couple of methods on an `Output` that you can use to add tracks to it: + +```ts +output.addVideoTrack(videoSource); +output.addAudioTrack(audioSource); +output.addSubtitleTrack(subtitleSource); +``` + +For each track you want to add, you'll need to create a unique [media source](./media-sources) for it. You'll be able to add media data to the output via these media sources. A media source can only ever be used for one output track. + +Optionally, you can specify additional track metadata when adding tracks: + +```ts +// This specifies that the video track should be rotated by 90 degrees +// clockwise before being displayed by video players, and that a frame rate +// of 30 FPS is expected. +output.addVideoTrack(videoSource, { + // Clockwise rotation in degrees + rotation: 90, + // Expected frame rate in hertz + frameRate: 30, +}); + +// This adds two audio tracks; one in English and one in German. +output.addAudioTrack(audioSourceEng, { + language: 'eng', // ISO 639-2/T language code + name: 'Developer Commentary', // Sets a user-defined track name + disposition: { commentary: true }, // Sets additional flags in the file +}); +output.addAudioTrack(audioSourceGer, { + language: 'ger', +}); + +// This adds multiple subtitle tracks, all for different languages. +output.addSubtitleTrack(subtitleSourceEng, { language: 'eng' }); +output.addSubtitleTrack(subtitleSourceGer, { language: 'ger' }); +output.addSubtitleTrack(subtitleSourceSpa, { language: 'spa' }); +output.addSubtitleTrack(subtitleSourceFre, { language: 'fre' }); +output.addSubtitleTrack(subtitleSourceIta, { language: 'ita' }); +``` + +::: info +The optional `frameRate` video track metadata option specifies the expected frame rate of the video. All timestamps and durations of frames that will be added to this track will be snapped to the specified frame rate. You should avoid adding frames more often than the rate permits, as this will lead to multiple frames having the same timestamp. + +To precisely achieve common fractional frame rates, make sure to use their exact fractional forms: +$23.976 \rightarrow 24000/1001$\ +$29.97 \rightarrow 30000/1001$\ +$59.94 \rightarrow 60000/1001$ +::: + +As an example, let's add two tracks to our output: + +* A video track driven by the contents of a `` element, encoded using AVC +* An audio track driven by the user's microphone input, encoded using AAC + +```ts +import { CanvasSource, MediaStreamAudioTrackSource } from 'mediabunny'; + +// Assuming `canvasElement` exists +const videoSource = new CanvasSource(canvasElement, { + codec: 'avc', + bitrate: 1e6, // 1 Mbps +}); + +const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); +const audioStreamTrack = stream.getAudioTracks()[0]; +const audioSource = new MediaStreamAudioTrackSource(audioStreamTrack, { + codec: 'aac', + bitrate: 128e3, // 128 kbps +}); + +output.addVideoTrack(videoSource, { frameRate: 30 }); +output.addAudioTrack(audioSource); +``` + +::: warning +Adding tracks to an `Output` will throw if the track is not compatible with the output format. Be sure to respect the [properties](./output-formats#format-properties) of the output format when adding tracks. +::: + +## Setting metadata tags + +Mediabunny lets you write additional descriptive metadata tags to an output file, such as title, artist, or cover art: + +```ts +output.setMetadataTags({ + title: 'Big Buck Bunny', + artist: 'Blender Foundation', + date: new Date('2008-05-20'), + images: [{ + data: new Uint8Array([...]), + mimeType: 'image/jpeg', + kind: 'coverFront', + }], +}); +``` + +If you add metadata tags, you must call this method *before* starting the `Output`. + +For more info on which tags you can write, see [`MetadataTags`](../api/MetadataTags). + +## Starting an output + +After all tracks have been added to the `Output`, you need to *start* it. Starting an output spins up the writing process, allowing you to now start sending media data to the output file. It also prevents you from adding any new tracks to it. + +```ts +await output.start(); // Resolves once the output is ready to receive media data +``` + +## Adding media data + +After starting an `Output`, you can use the media sources you used to add tracks to pipe media data to the output file. The API for this is different for each [media source](./media-sources), but it typically looks something like this: + +```ts +mediaSource.add(...); +``` + +In our example, as soon as we called `start`, the user's microphone input will be piped to the output file. However, we still need to add the data from our canvas. We might do something like this: + +```ts +let framesAdded = 0; +const intervalId = setInterval(() => { + const timestampInSeconds = framesAdded / 30; + const durationInSeconds = 1 / 30; + + // Captures the canvas state at the time of calling `add`: + videoSource.add(timestampInSeconds, durationInSeconds); + framesAdded++; +}, 1000 / 30); +``` + +And then we'll let this run for as long as we want to capture media data. + +## Finalizing an output + +Once all media data has been added, the `Output` needs to be *finalized*. Finalization finishes all remaining encoding +work and writes the remaining data to create the final, playable media file. + +```ts +await output.finalize(); // Resolves once the output is finalized +``` + +::: warning +After calling `finalize`, adding more media data to the output results in an error. +::: + +In our example, we'll need to do this: + +```ts +clearInterval(intervalId); // Stops the canvas loop +audioStreamTrack.stop(); // Stops capturing the user's microphone + +await output.finalize(); + +const file = output.target.buffer; // => Uint8Array +``` + +## Canceling an output + +Sometimes, you may want to cancel the ongoing creation of an output file. For this, use the `cancel` method: + +```ts +await output.cancel(); // Resolves once the output is canceled +``` + +This automatically frees up all resources used by the output process, such as closing all encoders or releasing the +writer. + +::: warning +After calling `cancel`, adding more media data to the output results in an error. +::: + +In our example, we would do this: + +```ts +clearInterval(intervalId); // Stops the canvas loop +audioStreamTrack.stop(); // Stops capturing the user's microphone + +await output.cancel(); + +// The output is canceled +``` + +## Checking output state + +You can always check the current state the output is in using its `state` property: + +```ts +output.state; // => 'pending' | 'started' | 'canceled' | 'finalizing' | 'finalized' +``` + +* `'pending'` - The output hasn't been started or canceled yet; new tracks can be added. +* `'started'` - The output has been started and is ready to receive media data; tracks can no longer be added. +* `'finalizing'` - `finalize` has been called but hasn't resolved yet; no more media data can be added. +* `'finalized'` - The output has been finalized and is done writing the file. +* `'canceled'` - The output has been canceled. + +## Output targets + +The *output target* determines where the data created by the `Output` will be written. This library offers a couple of targets. + +*** + +All targets have an optional `onwrite` callback you can set to monitor which byte regions are being written to: + +```ts +target.onwrite = (start, end) => { + // ... +}; +``` + +You can use this to track the size of the output file as it grows. But be warned, this function is chatty and gets called *extremely* frequently. + +### `BufferTarget` + +This target writes all data to a single, contiguous, in-memory `ArrayBuffer`. This buffer will automatically grow as the file becomes larger. Usage is straightforward: + +```ts +import { Output, BufferTarget } from 'mediabunny'; + +const output = new Output({ + target: new BufferTarget(), + // ... +}); + +// ... + +output.target.buffer; // => null +await output.finalize(); +output.target.buffer; // => ArrayBuffer +``` + +This target is a great choice for small-ish files (< 100 MB), but since all data will be kept in memory, using it for large files is suboptimal. If the output gets very large, the page might crash due to memory exhaustion. For these cases, using `StreamTarget` is recommended. + +### `StreamTarget` + +This target passes you the data written by the `Output` in small chunks, requiring you to pipe that data elsewhere to manually assemble the final file. Example use cases include writing the file directly to disk, or uploading it to a server over the network. + +`StreamTarget` makes use of the Streams API, meaning you'll need to pass it an instance of `WritableStream`: + +```ts +import { Output, StreamTarget, StreamTargetChunk } from 'mediabunny'; + +const writable = new WritableStream({ + write(chunk: StreamTargetChunk) { + chunk.data; // => Uint8Array + chunk.position; // => number + + // Do something with the data... + } +}); + +const output = new Output({ + target: new StreamTarget(writable), + // ... +}); +``` + +Each chunk written to the `WritableStream` represents a contiguous chunk of bytes of the output file, `data`, that is expected to be written at the given byte offset, `position`. The `WritableStream` will automatically be closed when `finalize` or `cancel` are called on the `Output`. + +::: warning +Note that some byte regions in the output file may be written to multiple times. It is therefore **incorrect** to construct the final file by simply concatenating all `Uint8Array`s together - you **must** write each chunk of data at the specified byte offset position *in the order* in which the chunks arrived. If you don't do this, your output file will likely be invalid or corrupted. + +Some [output formats](./output-formats) have *append-only* writing modes in which the byte offset of a written chunk will always be equal to the total number of bytes in all previously written chunks. In other words, when writing is append-only, simply concatening all `Uint8Array`s yields the correct result. Some APIs (like `appendBuffer` of Media Source Extensions) require this, so make sure to configure your output format accordingly for those cases. +::: + +#### Chunked mode + +By default, data will be emitted by the `StreamTarget` as soon as it is available. In some formats, these may lead to hundreds of write events per second. If you want to reduce the frequency of writes, `StreamTarget` offers an alternative "chunked mode" in which data will first be accumulated into large chunks of a given size in memory, and then only be emitted once a chunk is completely full. + +```ts +new StreamTarget(writable, { + chunked: true, + chunkSize: 2 ** 20, // Optional; defaults to 16 MiB +}); +``` + +#### Applying backpressure + +Sometimes, the `Output` may produce new data faster than you are able to write it. In this case, you want to communicate to the `Output` that it should "chill out" and slow down to match the pace that the `WritableStream` is able to handle. When using `StreamTarget`, the `Output` will automatically respect the backpressure applied by the `WritableStream`. For this, it is useful to understand the [Stream API concepts](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Concepts) of how to apply backpressure. + +For example, the writable may apply backpressure by returning a promise in `write`: + +```ts +const writable = new WritableStream({ + write(chunk: StreamTargetChunk) { + // Pretend writing out data takes 10 milliseconds: + return new Promise(resolve => setTimeout(resolve, 10)); + } +}); +``` + +::: info +In order for the writable's backpressure to ripple through the entire pipeline, you must make sure to correctly respect the [backpressure applied by media sources](./media-sources#backpressure). +::: + +#### Usage with the File System API + +`StreamTargetChunk` is designed such that it is compatible with the File System API's `FileSystemWritableFileStream`. This means, if you want to write data directly to disk, you can simply do something like this: + +```ts +const handle = await window.showSaveFilePicker(); +const writableStream = await handle.createWritable(); + +const output = new Output({ + target: new StreamTarget(writableStream), + // ... +}); + +// ... + +await output.finalize(); // Will automatically close the writable stream +``` + +### `FilePathTarget` + +This target writes to a file at the specified path. It is intended for server-side usage in Node, Bun, or Deno, and offers a simpler API than `StreamTarget` when you just want to write directly to a file path. + +```ts +import { Output, FilePathTarget } from 'mediabunny'; + +const output = new Output({ + target: new FilePathTarget('/path/to/output.mp4'), + // ... +}); + +// ... + +await output.finalize(); // Will automatically close the file handle +``` + +The internally held file handle will be closed when `finalize` or `cancel` are called on the `Output`. + +Writing is chunked by default, for performance. Like `StreamTarget`, you can configure chunked mode options: + +```ts +new FilePathTarget('/path/to/output.mp4', { + chunked: false, // Disable chunking (slower) + chunkSize: 2 ** 20, // Optional; defaults to 16 MiB +}); +``` + +### `NullTarget` + +This target simply discards all data that is passed into it. It is useful for when you need an `Output` but extract data from it differently, for example through output format-specific callbacks or encoder events. + +As an example, here we create a fragmented MP4 file and directly handle the individual fragments: + +```ts +import { Output, NullTarget, Mp4OutputFormat } from 'mediabunny'; + +let ftyp: Uint8Array; +let lastMoof: Uint8Array; + +const output = new Output({ + target: new NullTarget(), + format: new Mp4OutputFormat({ + fastStart: 'fragmented', + onFtyp: (data) => { + ftyp = data; + }, + onMoov: (data) => { + const header = new Uint8Array(ftyp.length + data.length); + header.set(ftyp, 0); + header.set(data, ftyp.length); + + // Do something with the header... + }, + onMoof: (data) => { + lastMoof = data; + }, + onMdat: (data) => { + const segment = new Uint8Array(lastMoof.length + data.length); + segment.set(lastMoof, 0); + segment.set(data, lastMoof.length); + + // Do something with the segment... + }, + }), +}); +``` + +## Packet buffering + +Some [output formats](./output-formats) require *packet buffering* for multi-track outputs. Packet buffering occurs because the `Output` must wait for data from all tracks for a given timestamp to continue writing data. For example, should you first encode all your video frames and then encode the audio afterward, the `Output` will have to hold all of the video frames in memory until the audio packets start coming in. This might lead to memory exhaustion should your video be very long. When there is only one media track, this issue does not arise. + +Check the [Output formats](./output-formats) page to see which format configurations require packet buffering. + +*** + +If your output format configuration requires packet buffering, make sure to add media data in a somewhat interleaved way to keep memory usage low. For example, if you're creating a 5-minute file, add your data in chunks - 10 seconds of video, then 10 seconds of audio, then repeat - instead of first adding all 300 seconds of video followed by all 300 seconds of audio. + +::: info +If this kind of chunking isn't possible for your use case, try adding the media with the overall smaller data footprint first: First add the 300 seconds of audio, then add the 300 seconds of video. +::: + +## Output MIME type + +Sometimes you may want to retrieve the MIME type of the file created by an `Output`. For example, when working with Media Source Extensions, [`addSourceBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/addSourceBuffer) requires the file's full MIME type, including codec strings. + +For this, use the following method: + +```ts +output.getMimeType(); // => Promise +``` + +This may resolve to a string like this: + +``` +video/mp4; codecs="avc1.42c032, mp4a.40.2" +``` + +::: warning +The promise returned by `getMimeType` only resolves once the precise codec strings for all tracks of the `Output` are known - meaning it potentially needs to wait for all encoders to be fully initialized. Therefore, make sure not to get yourself into a deadlock: Awaiting this method before adding media data to tracks will result in the promise never resolving. +::: + +If you don't care about specific track codecs, you can instead use the simpler [`mimeType`](./output-formats#output-format-properties) property on the `Output`'s format: + +```ts +output.format.mimeType; // => string +``` diff --git a/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts b/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts new file mode 100644 index 000000000..04f458e8b --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts @@ -0,0 +1,3174 @@ +/// +/// + +/** + * ADTS input format singleton. + * @group Input formats + * @public + */ +export declare const ADTS: AdtsInputFormat; + +/** + * ADTS file format. + * + * Do not instantiate this class; use the {@link ADTS} singleton instead. + * + * @group Input formats + * @public + */ +export declare class AdtsInputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * ADTS file format. + * @group Output formats + * @public + */ +export declare class AdtsOutputFormat extends OutputFormat { + /** Creates a new {@link AdtsOutputFormat} configured with the specified `options`. */ + constructor(options?: AdtsOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * ADTS-specific output options. + * @group Output formats + * @public + */ +export declare type AdtsOutputFormatOptions = { + /** + * Will be called for each ADTS frame that is written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onFrame?: (data: Uint8Array, position: number) => unknown; +}; + +/** + * List of all input format singletons. If you don't need to support all input formats, you should specify the + * formats individually for better tree shaking. + * @group Input formats + * @public + */ +export declare const ALL_FORMATS: InputFormat[]; + +/** + * List of all track types. + * @group Miscellaneous + * @public + */ +export declare const ALL_TRACK_TYPES: readonly ["video", "audio", "subtitle"]; + +/** + * Sync or async iterable. + * @group Miscellaneous + * @public + */ +export declare type AnyIterable = Iterable | AsyncIterable; + +/** + * A file attached to a media file. + * + * @group Metadata tags + * @public + */ +export declare class AttachedFile { + /** The raw file data. */ + data: Uint8Array; + /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */ + mimeType?: string | undefined; + /** The name of the file. */ + name?: string | undefined; + /** A description of the file. */ + description?: string | undefined; + /** Creates a new {@link AttachedFile}. */ + constructor( + /** The raw file data. */ + data: Uint8Array, + /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */ + mimeType?: string | undefined, + /** The name of the file. */ + name?: string | undefined, + /** A description of the file. */ + description?: string | undefined); +} + +/** + * An embedded image such as cover art, booklet scan, artwork or preview frame. + * + * @group Metadata tags + * @public + */ +export declare type AttachedImage = { + /** The raw image data. */ + data: Uint8Array; + /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ + mimeType: string; + /** The kind or purpose of the image. */ + kind: 'coverFront' | 'coverBack' | 'unknown'; + /** The name of the image file. */ + name?: string; + /** A description of the image. */ + description?: string; +}; + +/** + * List of known audio codecs, ordered by encoding preference. + * @group Codecs + * @public + */ +export declare const AUDIO_CODECS: readonly ["aac", "opus", "mp3", "vorbis", "flac", "pcm-s16", "pcm-s16be", "pcm-s24", "pcm-s24be", "pcm-s32", "pcm-s32be", "pcm-f32", "pcm-f32be", "pcm-f64", "pcm-f64be", "pcm-u8", "pcm-s8", "ulaw", "alaw"]; + +/** + * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is + * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the + * Web Audio API. + * @group Media sinks + * @public + */ +export declare class AudioBufferSink { + /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */ + constructor(audioTrack: InputAudioTrack); + /** + * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns + * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getBuffer(timestamp: number): Promise; + /** + * Creates an async iterator that yields audio buffers of this track in presentation order. This method + * will intelligently pre-decode a few buffers ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive). + */ + buffers(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; + /** + * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may + * yield null if no buffer is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ + buffersAtTimestamps(timestamps: AnyIterable): AsyncGenerator; +} + +/** + * This source can be used to add audio data from an AudioBuffer to the output track. This is useful when working with + * the Web Audio API. + * @group Media sources + * @public + */ +export declare class AudioBufferSource extends AudioSource { + /** + * Creates a new {@link AudioBufferSource} whose `AudioBuffer` instances are encoded according to the specified + * {@link AudioEncodingConfig}. + */ + constructor(encodingConfig: AudioEncodingConfig); + /** + * Converts an AudioBuffer to audio samples, encodes them and adds them to the output. The first AudioBuffer will + * be played at timestamp 0, and any subsequent AudioBuffer will have a timestamp equal to the total duration of + * all previous AudioBuffers. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(audioBuffer: AudioBuffer): Promise; +} + +/** + * Union type of known audio codecs. + * @group Codecs + * @public + */ +export declare type AudioCodec = typeof AUDIO_CODECS[number]; + +/** + * Additional options that control audio encoding. + * @group Encoding + * @public + */ +export declare type AudioEncodingAdditionalOptions = { + /** Configures the bitrate mode. */ + bitrateMode?: 'constant' | 'variable'; + /** + * The full codec string as specified in the WebCodecs Codec Registry. This string must match the codec + * specified in `codec`. When not set, a fitting codec string will be constructed automatically by the library. + */ + fullCodecString?: string; +}; + +/** + * Configuration object that controls audio encoding. Can be used to set codec, quality, and more. + * @group Encoding + * @public + */ +export declare type AudioEncodingConfig = { + /** The audio codec that should be used for encoding the audio samples. */ + codec: AudioCodec; + /** + * The target bitrate for the encoded audio, in bits per second. Alternatively, a subjective {@link Quality} can + * be provided. Required for compressed audio codecs, unused for PCM codecs. + */ + bitrate?: number | Quality; + /** Called for each successfully encoded packet. Both the packet and the encoding metadata are passed. */ + onEncodedPacket?: (packet: EncodedPacket, meta: EncodedAudioChunkMetadata | undefined) => unknown; + /** + * Called when the internal [encoder config](https://www.w3.org/TR/webcodecs/#audio-encoder-config), as used by the + * WebCodecs API, is created. + */ + onEncoderConfig?: (config: AudioEncoderConfig) => unknown; +} & AudioEncodingAdditionalOptions; + +/** + * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's + * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData), but can also be used standalone. + * @group Samples + * @public + */ +export declare class AudioSample implements Disposable { + /** + * The audio sample format. + * [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) + */ + readonly format: AudioSampleFormat; + /** The audio sample rate in hertz. */ + readonly sampleRate: number; + /** + * The number of audio frames in the sample, per channel. In other words, the length of this audio sample in frames. + */ + readonly numberOfFrames: number; + /** The number of audio channels. */ + readonly numberOfChannels: number; + /** The duration of the sample in seconds. */ + readonly duration: number; + /** + * The presentation timestamp of the sample in seconds. May be negative. Samples with negative end timestamps should + * not be presented. + */ + readonly timestamp: number; + /** The presentation timestamp of the sample in microseconds. */ + get microsecondTimestamp(): number; + /** The duration of the sample in microseconds. */ + get microsecondDuration(): number; + /** + * Creates a new {@link AudioSample}, either from an existing + * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in + * {@link AudioSampleInit}. + */ + constructor(init: AudioData | AudioSampleInit); + /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */ + allocationSize(options: AudioSampleCopyToOptions): number; + /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */ + copyTo(destination: AllowSharedBufferSource, options: AudioSampleCopyToOptions): void; + /** Clones this audio sample. */ + clone(): AudioSample; + /** + * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not + * needed anymore. + */ + close(): void; + /** + * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this + * method *must* be closed separately from this audio sample. + */ + toAudioData(): AudioData; + /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */ + toAudioBuffer(): AudioBuffer; + /** Sets the presentation timestamp of this audio sample, in seconds. */ + setTimestamp(newTimestamp: number): void; + /** Calls `.close()`. */ + [Symbol.dispose](): void; + /** + * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly + * one sample, but may create multiple if the AudioBuffer is exceedingly large. + */ + static fromAudioBuffer(audioBuffer: AudioBuffer, timestamp: number): AudioSample[]; +} + +/** + * Options used for copying audio sample data. + * @group Samples + * @public + */ +export declare type AudioSampleCopyToOptions = { + /** + * The index identifying the plane to copy from. This must be 0 if using a non-planar (interleaved) output format. + */ + planeIndex: number; + /** + * The output format for the destination data. Defaults to the AudioSample's format. + * [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) + */ + format?: AudioSampleFormat; + /** An offset into the source plane data indicating which frame to begin copying from. Defaults to 0. */ + frameOffset?: number; + /** + * The number of frames to copy. If not provided, the copy will include all frames in the plane beginning + * with frameOffset. + */ + frameCount?: number; +}; + +/** + * Metadata used for AudioSample initialization. + * @group Samples + * @public + */ +export declare type AudioSampleInit = { + /** The audio data for this sample. */ + data: AllowSharedBufferSource; + /** + * The audio sample format. [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) + */ + format: AudioSampleFormat; + /** The number of audio channels. */ + numberOfChannels: number; + /** The audio sample rate in hertz. */ + sampleRate: number; + /** The presentation timestamp of the sample in seconds. */ + timestamp: number; +}; + +/** + * Sink for retrieving decoded audio samples from an audio track. + * @group Media sinks + * @public + */ +export declare class AudioSampleSink extends BaseMediaSampleSink { + /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */ + constructor(audioTrack: InputAudioTrack); + /** + * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns + * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getSample(timestamp: number): Promise; + /** + * Creates an async iterator that yields the audio samples of this track in presentation order. This method + * will intelligently pre-decode a few samples ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). + */ + samples(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; + /** + * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may + * yield null if no sample is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ + samplesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; +} + +/** + * This source can be used to add raw, unencoded audio samples to an output audio track. These samples will + * automatically be encoded and then piped into the output. + * @group Media sources + * @public + */ +export declare class AudioSampleSource extends AudioSource { + /** + * Creates a new {@link AudioSampleSource} whose samples are encoded according to the specified + * {@link AudioEncodingConfig}. + */ + constructor(encodingConfig: AudioEncodingConfig); + /** + * Encodes an audio sample and then adds it to the output. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(audioSample: AudioSample): Promise; +} + +/** + * Base class for audio sources - sources for audio tracks. + * @group Media sources + * @public + */ +export declare abstract class AudioSource extends MediaSource_2 { + /** Internal constructor. */ + constructor(codec: AudioCodec); +} + +/** + * Additional metadata for audio tracks. + * @group Output files + * @public + */ +export declare type AudioTrackMetadata = BaseTrackMetadata & {}; + +/** + * Base class for decoded media sample sinks. + * @group Media sinks + * @public + */ +export declare abstract class BaseMediaSampleSink { +} + +/** + * Base track metadata, applicable to all tracks. + * @group Output files + * @public + */ +export declare type BaseTrackMetadata = { + /** The three-letter, ISO 639-2/T language code specifying the language of this track. */ + languageCode?: string; + /** A user-defined name for this track, like "English" or "Director Commentary". */ + name?: string; + /** The track's disposition, i.e. information about its intended usage. */ + disposition?: Partial; + /** + * The maximum amount of encoded packets that will be added to this track. Setting this field provides the muxer + * with an additional signal that it can use to preallocate space in the file. + * + * When this field is set, it is an error to provide more packets than whatever this field specifies. + * + * Predicting the maximum packet count requires considering both the maximum duration as well as the codec. + * - For video codecs, you can assume one packet per frame. + * - For audio codecs, there is one packet for each "audio chunk", the duration of which depends on the codec. For + * simplicity, you can assume each packet is roughly 10 ms or 512 samples long, whichever is shorter. + * - For subtitles, assume each cue and each gap in the subtitles adds a packet. + * + * If you're not fully sure, make sure to add a buffer of around 33% to make sure you stay below the maximum. + */ + maximumPacketCount?: number; +}; + +/** + * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a + * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when + * reading files off the disk. + * @group Input sources + * @public + */ +export declare class BlobSource extends Source { + /** + * Creates a new {@link BlobSource} backed by the specified + * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). + */ + constructor(blob: Blob, options?: BlobSourceOptions); +} + +/** + * Options for {@link BlobSource}. + * @group Input sources + * @public + */ +export declare type BlobSourceOptions = { + /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ + maxCacheSize?: number; +}; + +/** + * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory. + * @group Input sources + * @public + */ +declare class BufferSource_2 extends Source { + /** + * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`, + * or `ArrayBufferView`. + */ + constructor(buffer: AllowSharedBufferSource); +} +export { BufferSource_2 as BufferSource } + +/** + * A target that writes data directly into an ArrayBuffer in memory. Great for performance, but not suitable for very + * large files. The buffer will be available once the output has been finalized. + * @group Output targets + * @public + */ +export declare class BufferTarget extends Target { + /** Stores the final output buffer. Until the output is finalized, this will be `null`. */ + buffer: ArrayBuffer | null; +} + +/** + * Checks if the browser is able to encode the given codec. + * @group Encoding + * @public + */ +export declare const canEncode: (codec: MediaCodec) => Promise; + +/** + * Checks if the browser is able to encode the given audio codec with the given parameters. + * @group Encoding + * @public + */ +export declare const canEncodeAudio: (codec: AudioCodec, options?: { + numberOfChannels?: number; + sampleRate?: number; + bitrate?: number | Quality; +} & AudioEncodingAdditionalOptions) => Promise; + +/** + * Checks if the browser is able to encode the given subtitle codec. + * @group Encoding + * @public + */ +export declare const canEncodeSubtitles: (codec: SubtitleCodec) => Promise; + +/** + * Checks if the browser is able to encode the given video codec with the given parameters. + * @group Encoding + * @public + */ +export declare const canEncodeVideo: (codec: VideoCodec, options?: { + width?: number; + height?: number; + bitrate?: number | Quality; +} & VideoEncodingAdditionalOptions) => Promise; + +/** + * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than + * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation + * metadata. + * + * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise. + * + * @group Media sinks + * @public + */ +export declare class CanvasSink { + /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */ + constructor(videoTrack: InputVideoTrack, options?: CanvasSinkOptions); + /** + * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically, + * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given + * timestamp. Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getCanvas(timestamp: number): Promise; + /** + * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This + * method will intelligently pre-decode a few frames ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive). + */ + canvases(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; + /** + * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized + * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is + * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if + * no frame is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ + canvasesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; +} + +/** + * Options for constructing a CanvasSink. + * @group Media sinks + * @public + */ +export declare type CanvasSinkOptions = { + /** + * Whether the output canvases should have transparency instead of a black background. Defaults to `false`. Set + * this to `true` when using this sink to read transparent videos. + */ + alpha?: boolean; + /** + * The width of the output canvas in pixels, defaulting to the display width of the video track. If height is not + * set, it will be deduced automatically based on aspect ratio. + */ + width?: number; + /** + * The height of the output canvas in pixels, defaulting to the display height of the video track. If width is not + * set, it will be deduced automatically based on aspect ratio. + */ + height?: number; + /** + * The fitting algorithm in case both width and height are set. + * + * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. + * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to + * letterboxing. + * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. + */ + fit?: 'fill' | 'contain' | 'cover'; + /** + * The clockwise rotation by which to rotate the raw video frame. Defaults to the rotation set in the file metadata. + * Rotation is applied before resizing. + */ + rotation?: Rotation; + /** + * Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to + * the dimensions of the input video track. Cropping is performed after rotation but before resizing. + */ + crop?: CropRectangle; + /** + * When set, specifies the number of canvases in the pool. These canvases will be reused in a ring buffer / + * round-robin type fashion. This keeps the amount of allocated VRAM constant and relieves the browser from + * constantly allocating/deallocating canvases. A pool size of 0 or `undefined` disables the pool and means a new + * canvas is created each time. + */ + poolSize?: number; +}; + +/** + * This source can be used to add video frames to the output track from a fixed canvas element. Since canvases are often + * used for rendering, this source provides a convenient wrapper around {@link VideoSampleSource}. + * @group Media sources + * @public + */ +export declare class CanvasSource extends VideoSource { + /** + * Creates a new {@link CanvasSource} from a canvas element or `OffscreenCanvas` whose samples are encoded + * according to the specified {@link VideoEncodingConfig}. + */ + constructor(canvas: HTMLCanvasElement | OffscreenCanvas, encodingConfig: VideoEncodingConfig); + /** + * Captures the current canvas state as a video sample (frame), encodes it and adds it to the output. + * + * @param timestamp - The timestamp of the sample, in seconds. + * @param duration - The duration of the sample, in seconds. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(timestamp: number, duration?: number, encodeOptions?: VideoEncoderEncodeOptions): Promise; +} + +/** + * Represents a media file conversion process, used to convert one media file into another. In addition to conversion, + * this class can be used to resize and rotate video, resample audio, drop tracks, or trim to a specific time range. + * @group Conversion + * @public + */ +export declare class Conversion { + /** The input file. */ + readonly input: Input; + /** The output file. */ + readonly output: Output; + /** + * A callback that is fired whenever the conversion progresses. Returns a number between 0 and 1, indicating the + * completion of the conversion. Note that a progress of 1 doesn't necessarily mean the conversion is complete; + * the conversion is complete once `execute()` resolves. + * + * In order for progress to be computed, this property must be set before `execute` is called. + */ + onProgress?: (progress: number) => unknown; + /** + * Whether this conversion, as it has been configured, is valid and can be executed. If this field is `false`, check + * the `discardedTracks` field for reasons. + */ + isValid: boolean; + /** The list of tracks that are included in the output file. */ + readonly utilizedTracks: InputTrack[]; + /** The list of tracks from the input file that have been discarded, alongside the discard reason. */ + readonly discardedTracks: DiscardedTrack[]; + /** Initializes a new conversion process without starting the conversion. */ + static init(options: ConversionOptions): Promise; + /** Creates a new Conversion instance (duh). */ + private constructor(); + /** + * Executes the conversion process. Resolves once conversion is complete. + * + * Will throw if `isValid` is `false`. + */ + execute(): Promise; + /** Cancels the conversion process. Does nothing if the conversion is already complete. */ + cancel(): Promise; +} + +/** + * Audio-specific options. + * @group Conversion + * @public + */ +export declare type ConversionAudioOptions = { + /** If `true`, all audio tracks will be discarded and will not be present in the output. */ + discard?: boolean; + /** The desired channel count of the output audio. */ + numberOfChannels?: number; + /** The desired sample rate of the output audio, in hertz. */ + sampleRate?: number; + /** The desired output audio codec. */ + codec?: AudioCodec; + /** The desired bitrate of the output audio. */ + bitrate?: number | Quality; + /** When `true`, audio will always be re-encoded instead of directly copying over the encoded samples. */ + forceTranscode?: boolean; + /** + * Allows for custom user-defined processing of audio samples, e.g. for applying audio effects, transformations, or + * timestamp modifications. Will be called for each input audio sample after remixing and resampling. + * + * Must return an {@link AudioSample}, an array of them, or `null` for dropping the sample. + * + * This function can also be used to manually perform remixing or resampling. When doing so, you should signal the + * post-process parameters using the `processedNumberOfChannels` and `processedSampleRate` fields, which enables the + * encoder to better know what to expect. If these fields aren't set, Mediabunny will assume you won't perform + * remixing or resampling. + */ + process?: (sample: AudioSample) => MaybePromise; + /** + * An optional hint specifying the channel count of audio samples returned by the `process` function, for better + * encoder configuration. + */ + processedNumberOfChannels?: number; + /** + * An optional hint specifying the sample rate of audio samples returned by the `process` function, for better + * encoder configuration. + */ + processedSampleRate?: number; +}; + +/** + * The options for media file conversion. + * @group Conversion + * @public + */ +export declare type ConversionOptions = { + /** The input file. */ + input: Input; + /** The output file. */ + output: Output; + /** + * Video-specific options. When passing an object, the same options are applied to all video tracks. When passing a + * function, it will be invoked for each video track and is expected to return or resolve to the options + * for that specific track. The function is passed an instance of {@link InputVideoTrack} as well as a number `n`, + * which is the 1-based index of the track in the list of all video tracks. + */ + video?: ConversionVideoOptions | ((track: InputVideoTrack, n: number) => MaybePromise); + /** + * Audio-specific options. When passing an object, the same options are applied to all audio tracks. When passing a + * function, it will be invoked for each audio track and is expected to return or resolve to the options + * for that specific track. The function is passed an instance of {@link InputAudioTrack} as well as a number `n`, + * which is the 1-based index of the track in the list of all audio tracks. + */ + audio?: ConversionAudioOptions | ((track: InputAudioTrack, n: number) => MaybePromise); + /** Options to trim the input file. */ + trim?: { + /** + * The time in the input file in seconds at which the output file should start. Must be less than `end`. + * Defaults to 0 when omitted. + */ + start?: number; + /** + * The time in the input file in seconds at which the output file should end. Must be greater than `start`. + * Defaults to the duration of the input when omitted. + */ + end?: number; + }; + /** + * An object or a callback that returns or resolves to an object containing the descriptive metadata tags that + * should be written to the output file. If a function is passed, it will be passed the tags of the input file as + * its first argument, allowing you to modify, augment or extend them. + * + * If no function is set, the input's metadata tags will be copied to the output. + */ + tags?: MetadataTags | ((inputTags: MetadataTags) => MaybePromise); + /** + * Whether to show potential console warnings about discarded tracks after calling `Conversion.init()`, defaults to + * `true`. Set this to `false` if you're properly handling the `discardedTracks` and `isValid` fields already and + * want to keep the console output clean. + */ + showWarnings?: boolean; +}; + +/** + * Video-specific options. + * @group Conversion + * @public + */ +export declare type ConversionVideoOptions = { + /** If `true`, all video tracks will be discarded and will not be present in the output. */ + discard?: boolean; + /** + * The desired width of the output video in pixels, defaulting to the video's natural display width. If height + * is not set, it will be deduced automatically based on aspect ratio. + */ + width?: number; + /** + * The desired height of the output video in pixels, defaulting to the video's natural display height. If width + * is not set, it will be deduced automatically based on aspect ratio. + */ + height?: number; + /** + * The fitting algorithm in case both width and height are set, or if the input video changes its size over time. + * + * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. + * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to + * letterboxing. + * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. + */ + fit?: 'fill' | 'contain' | 'cover'; + /** + * The angle in degrees to rotate the input video by, clockwise. Rotation is applied before cropping and resizing. + * This rotation is _in addition to_ the natural rotation of the input video as specified in input file's metadata. + */ + rotate?: Rotation; + /** + * Defaults to `true`. When enabaled, Mediabunny will use the rotation metadata in the output file to perform video + * rotation whenever possible. Set this field to `false` if you want to ensure the output file does not make use of + * rotation metadata and that any rotation is baked into the video frames directly. + */ + allowRotationMetadata?: boolean; + /** + * Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to + * the dimensions of the input video track. Cropping is performed after rotation but before resizing. + */ + crop?: { + /** The distance in pixels from the left edge of the source frame to the left edge of the crop rectangle. */ + left: number; + /** The distance in pixels from the top edge of the source frame to the top edge of the crop rectangle. */ + top: number; + /** The width in pixels of the crop rectangle. */ + width: number; + /** The height in pixels of the crop rectangle. */ + height: number; + }; + /** + * The desired frame rate of the output video, in hertz. If not specified, the original input frame rate will + * be used (which may be variable). + */ + frameRate?: number; + /** The desired output video codec. */ + codec?: VideoCodec; + /** The desired bitrate of the output video. */ + bitrate?: number | Quality; + /** + * Whether to discard or keep the transparency information of the input video. The default is `'discard'`. Note that + * for `'keep'` to produce a transparent video, you must use an output config that supports it, such as WebM with + * VP9. + */ + alpha?: 'discard' | 'keep'; + /** + * The interval, in seconds, of how often frames are encoded as a key frame. The default is 5 seconds. Frequent key + * frames improve seeking behavior but increase file size. When using multiple video tracks, you should give them + * all the same key frame interval. + * + * Setting this fields forces a transcode. + */ + keyFrameInterval?: number; + /** When `true`, video will always be re-encoded instead of directly copying over the encoded samples. */ + forceTranscode?: boolean; + /** + * Allows for custom user-defined processing of video frames, e.g. for applying overlays, color transformations, or + * timestamp modifications. Will be called for each input video sample after transformations and frame rate + * corrections. + * + * Must return a {@link VideoSample} or a `CanvasImageSource`, an array of them, or `null` for dropping the frame. + * When non-timestamped data is returned, the timestamp and duration from the source sample will be used. Rotation + * metadata of the returned sample will be ignored. + * + * This function can also be used to manually resize frames. When doing so, you should signal the post-process + * dimensions using the `processedWidth` and `processedHeight` fields, which enables the encoder to better know what + * to expect. If these fields aren't set, Mediabunny will assume you won't perform any resizing. + */ + process?: (sample: VideoSample) => MaybePromise; + /** + * An optional hint specifying the width of video samples returned by the `process` function, for better + * encoder configuration. + */ + processedWidth?: number; + /** + * An optional hint specifying the height of video samples returned by the `process` function, for better + * encoder configuration. + */ + processedHeight?: number; +}; + +/** + * Specifies the rectangular cropping region. + * @group Miscellaneous + * @public + */ +export declare type CropRectangle = { + /** The distance in pixels from the left edge of the source frame to the left edge of the crop rectangle. */ + left: number; + /** The distance in pixels from the top edge of the source frame to the top edge of the crop rectangle. */ + top: number; + /** The width in pixels of the crop rectangle. */ + width: number; + /** The height in pixels of the crop rectangle. */ + height: number; +}; + +/** + * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the + * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. + * @group Custom coders + * @public + */ +export declare abstract class CustomAudioDecoder { + /** The input audio's codec. */ + readonly codec: AudioCodec; + /** The input audio's decoder config. */ + readonly config: AudioDecoderConfig; + /** The callback to call when a decoded AudioSample is available. */ + readonly onSample: (sample: AudioSample) => unknown; + /** Returns true if and only if the decoder can decode the given codec configuration. */ + static supports(codec: AudioCodec, config: AudioDecoderConfig): boolean; + /** Called after decoder creation; can be used for custom initialization logic. */ + abstract init(): MaybePromise; + /** Decodes the provided encoded packet. */ + abstract decode(packet: EncodedPacket): MaybePromise; + /** Decodes all remaining packets and then resolves. */ + abstract flush(): MaybePromise; + /** Called when the decoder is no longer needed and its resources can be freed. */ + abstract close(): MaybePromise; +} + +/** + * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the + * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. + * @group Custom coders + * @public + */ +export declare abstract class CustomAudioEncoder { + /** The codec with which to encode the audio. */ + readonly codec: AudioCodec; + /** Config for the encoder. */ + readonly config: AudioEncoderConfig; + /** The callback to call when an EncodedPacket is available. */ + readonly onPacket: (packet: EncodedPacket, meta?: EncodedAudioChunkMetadata) => unknown; + /** Returns true if and only if the encoder can encode the given codec configuration. */ + static supports(codec: AudioCodec, config: AudioEncoderConfig): boolean; + /** Called after encoder creation; can be used for custom initialization logic. */ + abstract init(): MaybePromise; + /** Encodes the provided audio sample. */ + abstract encode(audioSample: AudioSample): MaybePromise; + /** Encodes all remaining audio samples and then resolves. */ + abstract flush(): MaybePromise; + /** Called when the encoder is no longer needed and its resources can be freed. */ + abstract close(): MaybePromise; +} + +/** + * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the + * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. + * @group Custom coders + * @public + */ +export declare abstract class CustomVideoDecoder { + /** The input video's codec. */ + readonly codec: VideoCodec; + /** The input video's decoder config. */ + readonly config: VideoDecoderConfig; + /** The callback to call when a decoded VideoSample is available. */ + readonly onSample: (sample: VideoSample) => unknown; + /** Returns true if and only if the decoder can decode the given codec configuration. */ + static supports(codec: VideoCodec, config: VideoDecoderConfig): boolean; + /** Called after decoder creation; can be used for custom initialization logic. */ + abstract init(): MaybePromise; + /** Decodes the provided encoded packet. */ + abstract decode(packet: EncodedPacket): MaybePromise; + /** Decodes all remaining packets and then resolves. */ + abstract flush(): MaybePromise; + /** Called when the decoder is no longer needed and its resources can be freed. */ + abstract close(): MaybePromise; +} + +/** + * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the + * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. + * @group Custom coders + * @public + */ +export declare abstract class CustomVideoEncoder { + /** The codec with which to encode the video. */ + readonly codec: VideoCodec; + /** Config for the encoder. */ + readonly config: VideoEncoderConfig; + /** The callback to call when an EncodedPacket is available. */ + readonly onPacket: (packet: EncodedPacket, meta?: EncodedVideoChunkMetadata) => unknown; + /** Returns true if and only if the encoder can encode the given codec configuration. */ + static supports(codec: VideoCodec, config: VideoEncoderConfig): boolean; + /** Called after encoder creation; can be used for custom initialization logic. */ + abstract init(): MaybePromise; + /** Encodes the provided video sample. */ + abstract encode(videoSample: VideoSample, options: VideoEncoderEncodeOptions): MaybePromise; + /** Encodes all remaining video samples and then resolves. */ + abstract flush(): MaybePromise; + /** Called when the encoder is no longer needed and its resources can be freed. */ + abstract close(): MaybePromise; +} + +/** + * An input track that was discarded (excluded) from a {@link Conversion} alongside the discard reason. + * @group Conversion + * @public + */ +export declare type DiscardedTrack = { + /** The track that was discarded. */ + track: InputTrack; + /** + * The reason for discarding the track. + * + * - `'discarded_by_user'`: You discarded this track by setting `discard: true`. + * - `'max_track_count_reached'`: The output had no more room for another track. + * - `'max_track_count_of_type_reached'`: The output had no more room for another track of this type, or the output + * doesn't support this track type at all. + * - `'unknown_source_codec'`: We don't know the codec of the input track and therefore don't know what to do + * with it. + * - `'undecodable_source_codec'`: The input track's codec is known, but we are unable to decode it. + * - `'no_encodable_target_codec'`: We can't find a codec that we are able to encode and that can be contained + * within the output format. This reason can be hit if the environment doesn't support the necessary encoders, or if + * you requested a codec that cannot be contained within the output format. + */ + reason: 'discarded_by_user' | 'max_track_count_reached' | 'max_track_count_of_type_reached' | 'unknown_source_codec' | 'undecodable_source_codec' | 'no_encodable_target_codec'; +}; + +/** + * The most basic audio source; can be used to directly pipe encoded packets into the output file. + * @group Media sources + * @public + */ +export declare class EncodedAudioPacketSource extends AudioSource { + /** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */ + constructor(codec: AudioCodec); + /** + * Adds an encoded packet to the output audio track. Packets must be added in *decode order*. + * + * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid + * decoder config. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(packet: EncodedPacket, meta?: EncodedAudioChunkMetadata): Promise; +} + +/** + * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) and + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk), but can also be used + * standalone. + * @group Packets + * @public + */ +export declare class EncodedPacket { + /** The encoded data of this packet. */ + readonly data: Uint8Array; + /** The type of this packet. */ + readonly type: PacketType; + /** + * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps + * should not be presented. + */ + readonly timestamp: number; + /** The duration of this packet in seconds. */ + readonly duration: number; + /** + * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A + * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet. + * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative + * ordering. Negative sequence numbers mean the sequence number is undefined. + */ + readonly sequenceNumber: number; + /** + * The actual byte length of the data in this packet. This field is useful for metadata-only packets where the + * `data` field contains no bytes. + */ + readonly byteLength: number; + /** Additional data carried with this packet. */ + readonly sideData: EncodedPacketSideData; + /** Creates a new {@link EncodedPacket} from raw bytes and timing information. */ + constructor( + /** The encoded data of this packet. */ + data: Uint8Array, + /** The type of this packet. */ + type: PacketType, + /** + * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps + * should not be presented. + */ + timestamp: number, + /** The duration of this packet in seconds. */ + duration: number, + /** + * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A + * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet. + * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative + * ordering. Negative sequence numbers mean the sequence number is undefined. + */ + sequenceNumber?: number, byteLength?: number, sideData?: EncodedPacketSideData); + /** + * If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. They are the + * result of retrieving packets with {@link PacketRetrievalOptions.metadataOnly} set to `true`. + */ + get isMetadataOnly(): boolean; + /** The timestamp of this packet in microseconds. */ + get microsecondTimestamp(): number; + /** The duration of this packet in microseconds. */ + get microsecondDuration(): number; + /** Converts this packet to an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the + * WebCodecs API. */ + toEncodedVideoChunk(): EncodedVideoChunk; + /** + * Converts this packet to an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the + * WebCodecs API, using the alpha side data instead of the color data. Throws if no alpha side data is defined. + */ + alphaToEncodedVideoChunk(type?: PacketType): EncodedVideoChunk; + /** Converts this packet to an + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk) for use with the + * WebCodecs API. */ + toEncodedAudioChunk(): EncodedAudioChunk; + /** + * Creates an {@link EncodedPacket} from an + * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) or + * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk). This method is useful + * for converting chunks from the WebCodecs API to `EncodedPacket` instances. + */ + static fromEncodedChunk(chunk: EncodedVideoChunk | EncodedAudioChunk, sideData?: EncodedPacketSideData): EncodedPacket; + /** Clones this packet while optionally updating timing information. */ + clone(options?: { + /** The timestamp of the cloned packet in seconds. */ + timestamp?: number; + /** The duration of the cloned packet in seconds. */ + duration?: number; + }): EncodedPacket; +} + +/** + * Holds additional data accompanying an {@link EncodedPacket}. + * @group Packets + * @public + */ +export declare type EncodedPacketSideData = { + /** + * An encoded alpha frame, encoded with the same codec as the packet. Typically used for transparent videos, where + * the alpha information is stored separately from the color information. + */ + alpha?: Uint8Array; + /** + * The actual byte length of the alpha data. This field is useful for metadata-only packets where the + * `alpha` field contains no bytes. + */ + alphaByteLength?: number; +}; + +/** + * Sink for retrieving encoded packets from an input track. + * @group Media sinks + * @public + */ +export declare class EncodedPacketSink { + /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */ + constructor(track: InputTrack); + /** + * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very + * likely to be a key packet. + */ + getFirstPacket(options?: PacketRetrievalOptions): Promise; + /** + * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet + * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be + * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp + * is before the first packet in the track. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getPacket(timestamp: number, options?: PacketRetrievalOptions): Promise; + /** + * Retrieves the packet following the given packet (in decode order), or null if the given packet is the + * last packet. + */ + getNextPacket(packet: EncodedPacket, options?: PacketRetrievalOptions): Promise; + /** + * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last + * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet + * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's + * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first + * key packet in the track. + * + * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getKeyPacket(timestamp: number, options?: PacketRetrievalOptions): Promise; + /** + * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last + * key packet. + * + * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. + */ + getNextKeyPacket(packet: EncodedPacket, options?: PacketRetrievalOptions): Promise; + /** + * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this + * method will intelligently preload packets based on the speed of the consumer. + * + * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded. + * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded. + */ + packets(startPacket?: EncodedPacket, endPacket?: EncodedPacket, options?: PacketRetrievalOptions): AsyncGenerator; +} + +/** + * The most basic video source; can be used to directly pipe encoded packets into the output file. + * @group Media sources + * @public + */ +export declare class EncodedVideoPacketSource extends VideoSource { + /** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */ + constructor(codec: VideoCodec); + /** + * Adds an encoded packet to the output video track. Packets must be added in *decode order*, while a packet's + * timestamp must be its *presentation timestamp*. B-frames are handled automatically. + * + * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid + * decoder config. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(packet: EncodedPacket, meta?: EncodedVideoChunkMetadata): Promise; +} + +/** + * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno. + * + * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file + * handle acquired by this source. + * @group Input sources + * @public + */ +export declare class FilePathSource extends Source { + /** Creates a new {@link FilePathSource} backed by the file at the specified file path. */ + constructor(filePath: string, options?: FilePathSourceOptions); +} + +/** + * Options for {@link FilePathSource}. + * @group Input sources + * @public + */ +export declare type FilePathSourceOptions = { + /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ + maxCacheSize?: number; +}; + +/** + * A target that writes to a file at the specified path. Intended for server-side usage in Node, Bun, or Deno. + * + * Writing is chunked by default. The internally held file handle will be closed when `.finalize()` or `.cancel()` are + * called on the corresponding {@link Output}. + * @group Output targets + * @public + */ +export declare class FilePathTarget extends Target { + /** Creates a new {@link FilePathTarget} that writes to the file at the specified file path. */ + constructor(filePath: string, options?: FilePathTargetOptions); +} + +/** + * Options for {@link FilePathTarget}. + * @group Output targets + * @public + */ +export declare type FilePathTargetOptions = StreamTargetOptions; + +/** + * FLAC input format singleton. + * @group Input formats + * @public + */ +export declare const FLAC: FlacInputFormat; + +/** + * FLAC file format. + * + * Do not instantiate this class; use the {@link FLAC} singleton instead. + * + * @group Input formats + * @public + */ +export declare class FlacInputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * FLAC file format. + * @group Output formats + * @public + */ +export declare class FlacOutputFormat extends OutputFormat { + /** Creates a new {@link FlacOutputFormat} configured with the specified `options`. */ + constructor(options?: FlacOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * FLAC-specific output options. + * @group Output formats + * @public + */ +export declare type FlacOutputFormatOptions = { + /** + * Will be called for each FLAC frame that is written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onFrame?: (data: Uint8Array, position: number) => unknown; +}; + +/** + * Returns the list of all audio codecs that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getEncodableAudioCodecs: (checkedCodecs?: AudioCodec[], options?: { + numberOfChannels?: number; + sampleRate?: number; + bitrate?: number | Quality; +}) => Promise; + +/** + * Returns the list of all media codecs that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getEncodableCodecs: () => Promise; + +/** + * Returns the list of all subtitle codecs that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getEncodableSubtitleCodecs: (checkedCodecs?: SubtitleCodec[]) => Promise; + +/** + * Returns the list of all video codecs that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getEncodableVideoCodecs: (checkedCodecs?: VideoCodec[], options?: { + width?: number; + height?: number; + bitrate?: number | Quality; +}) => Promise; + +/** + * Returns the first audio codec from the given list that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getFirstEncodableAudioCodec: (checkedCodecs: AudioCodec[], options?: { + numberOfChannels?: number; + sampleRate?: number; + bitrate?: number | Quality; +}) => Promise; + +/** + * Returns the first subtitle codec from the given list that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getFirstEncodableSubtitleCodec: (checkedCodecs: SubtitleCodec[]) => Promise; + +/** + * Returns the first video codec from the given list that can be encoded by the browser. + * @group Encoding + * @public + */ +export declare const getFirstEncodableVideoCodec: (checkedCodecs: VideoCodec[], options?: { + width?: number; + height?: number; + bitrate?: number | Quality; +}) => Promise; + +/** + * Specifies an inclusive range of integers. + * @group Miscellaneous + * @public + */ +export declare type InclusiveIntegerRange = { + /** The integer cannot be less than this. */ + min: number; + /** The integer cannot be greater than this. */ + max: number; +}; + +/** + * Represents an input media file. This is the root object from which all media read operations start. + * @group Input files & tracks + * @public + */ +export declare class Input implements Disposable { + /** True if the input has been disposed. */ + get disposed(): boolean; + /** + * Creates a new input file from the specified options. No reading operations will be performed until methods are + * called on this instance. + */ + constructor(options: InputOptions); + /** + * Returns the source from which this input file reads its data. This is the same source that was passed to the + * constructor. + */ + get source(): S; + /** + * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons + * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true + * for both MKV and WebM). + */ + getFormat(): Promise; + /** + * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among + * all tracks. + */ + computeDuration(): Promise; + /** Returns the list of all tracks of this input file. */ + getTracks(): Promise; + /** Returns the list of all video tracks of this input file. */ + getVideoTracks(): Promise; + /** Returns the list of all audio tracks of this input file. */ + getAudioTracks(): Promise; + /** Returns the primary video track of this input file, or null if there are no video tracks. */ + getPrimaryVideoTrack(): Promise; + /** Returns the primary audio track of this input file, or null if there are no audio tracks. */ + getPrimaryAudioTrack(): Promise; + /** Returns the full MIME type of this input file, including track codecs. */ + getMimeType(): Promise; + /** + * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other + * attached files. + */ + getMetadataTags(): Promise; + /** + * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be + * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink + * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}. + * + * You are expected not to use an input after disposing it. While some operations may still work, it is not + * specified and may change in any future update. + */ + dispose(): void; + /** + * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with + * JavaScript Explicit Resource Management features. + */ + [Symbol.dispose](): void; +} + +/** + * Represents an audio track in an input file. + * @group Input files & tracks + * @public + */ +export declare class InputAudioTrack extends InputTrack { + get type(): TrackType; + get codec(): AudioCodec | null; + /** The number of audio channels in the track. */ + get numberOfChannels(): number; + /** The track's audio sample rate in hertz. */ + get sampleRate(): number; + /** + * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the + * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns + * null if the track's codec is unknown. + */ + getDecoderConfig(): Promise; + getCodecParameterString(): Promise; + canDecode(): Promise; + determinePacketType(packet: EncodedPacket): Promise; +} + +/** + * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed. + * @group Input files & tracks + * @public + */ +export declare class InputDisposedError extends Error { + /** Creates a new {@link InputDisposedError}. */ + constructor(message?: string); +} + +/** + * Base class representing an input media file format. + * @group Input formats + * @public + */ +export declare abstract class InputFormat { + /** Returns the name of the input format. */ + abstract get name(): string; + /** Returns the typical base MIME type of the input format. */ + abstract get mimeType(): string; +} + +/** + * The options for creating an Input object. + * @group Input files & tracks + * @public + */ +export declare type InputOptions = { + /** A list of supported formats. If the source file is not of one of these formats, then it cannot be read. */ + formats: InputFormat[]; + /** The source from which data will be read. */ + source: S; +}; + +/** + * Represents a media track in an input file. + * @group Input files & tracks + * @public + */ +export declare abstract class InputTrack { + /** The input file this track belongs to. */ + readonly input: Input; + /** The type of the track. */ + abstract get type(): TrackType; + /** The codec of the track's packets. */ + abstract get codec(): MediaCodec | null; + /** Returns the full codec parameter string for this track. */ + abstract getCodecParameterString(): Promise; + /** Checks if this track's packets can be decoded by the browser. */ + abstract canDecode(): Promise; + /** + * For a given packet of this track, this method determines the actual type of this packet (key/delta) by looking + * into its bitstream. Returns null if the type couldn't be determined. + */ + abstract determinePacketType(packet: EncodedPacket): Promise; + /** Returns true if and only if this track is a video track. */ + isVideoTrack(): this is InputVideoTrack; + /** Returns true if and only if this track is an audio track. */ + isAudioTrack(): this is InputAudioTrack; + /** The unique ID of this track in the input file. */ + get id(): number; + /** + * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny + * and depends entirely on the container format. + * + * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec. + * + * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`). + * - For Matroska files, this field returns the value of the `CodecID` element. + * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk. + * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`. + * - In all other cases, this field is `null`. + */ + get internalCodecId(): string | number | Uint8Array | null; + /** + * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined). + */ + get languageCode(): string; + /** A user-defined name for this track. */ + get name(): string | null; + /** + * A positive number x such that all timestamps and durations of all packets of this track are + * integer multiples of 1/x. + */ + get timeResolution(): number; + /** The track's disposition, i.e. information about its intended usage. */ + get disposition(): TrackDisposition; + /** + * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value + * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples + * with a negative timestamp should not be presented. + */ + getFirstTimestamp(): Promise; + /** Returns the end timestamp of the last packet of this track, in seconds. */ + computeDuration(): Promise; + /** + * Computes aggregate packet statistics for this track, such as average packet rate or bitrate. + * + * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have + * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all + * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the + * entire file. + */ + computePacketStats(targetPacketCount?: number): Promise; +} + +/** + * Represents a video track in an input file. + * @group Input files & tracks + * @public + */ +export declare class InputVideoTrack extends InputTrack { + get type(): TrackType; + get codec(): VideoCodec | null; + /** The width in pixels of the track's coded samples, before any transformations or rotations. */ + get codedWidth(): number; + /** The height in pixels of the track's coded samples, before any transformations or rotations. */ + get codedHeight(): number; + /** The angle in degrees by which the track's frames should be rotated (clockwise). */ + get rotation(): Rotation; + /** The width in pixels of the track's frames after rotation. */ + get displayWidth(): number; + /** The height in pixels of the track's frames after rotation. */ + get displayHeight(): number; + /** Returns the color space of the track's samples. */ + getColorSpace(): Promise; + /** If this method returns true, the track's samples use a high dynamic range (HDR). */ + hasHighDynamicRange(): Promise; + /** Checks if this track may contain transparent samples with alpha data. */ + canBeTransparent(): Promise; + /** + * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the + * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns + * null if the track's codec is unknown. + */ + getDecoderConfig(): Promise; + getCodecParameterString(): Promise; + canDecode(): Promise; + determinePacketType(packet: EncodedPacket): Promise; +} + +/** + * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files. + * @group Input formats + * @public + */ +export declare abstract class IsobmffInputFormat extends InputFormat { +} + +/** + * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files. + * @group Output formats + * @public + */ +export declare abstract class IsobmffOutputFormat extends OutputFormat { + /** Internal constructor. */ + constructor(options?: IsobmffOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * ISOBMFF-specific output options. + * @group Output formats + * @public + */ +export declare type IsobmffOutputFormatOptions = { + /** + * Controls the placement of metadata in the file. Placing metadata at the start of the file is known as "Fast + * Start", which results in better playback at the cost of more required processing or memory. + * + * Use `false` to disable Fast Start, placing the metadata at the end of the file. Fastest and uses the least + * memory. + * + * Use `'in-memory'` to produce a file with Fast Start by keeping all media chunks in memory until the file is + * finalized. This produces a high-quality and compact output at the cost of a more expensive finalization step and + * higher memory requirements. Data will be written monotonically (in order) when this option is set. + * + * Use `'reserve'` to reserve space at the start of the file into which the metadata will be written later. This + * produces a file with Fast Start but requires knowledge about the expected length of the file beforehand. When + * using this option, you must set the {@link BaseTrackMetadata.maximumPacketCount} field in the track metadata + * for all tracks. + * + * Use `'fragmented'` to place metadata at the start of the file by creating a fragmented file (fMP4). In a + * fragmented file, chunks of media and their metadata are written to the file in "fragments", eliminating the need + * to put all metadata in one place. Fragmented files are useful for streaming contexts, as each fragment can be + * played individually without requiring knowledge of the other fragments. Furthermore, they remain lightweight to + * create even for very large files, as they don't require all media to be kept in memory. However, fragmented files + * are not as widely and wholly supported as regular MP4/MOV files. Data will be written monotonically (in order) + * when this option is set. + * + * When this field is not defined, either `false` or `'in-memory'` will be used, automatically determined based on + * the type of output target used. + */ + fastStart?: false | 'in-memory' | 'reserve' | 'fragmented'; + /** + * When using `fastStart: 'fragmented'`, this field controls the minimum duration of each fragment, in seconds. + * New fragments will only be created when the current fragment is longer than this value. Defaults to 1 second. + */ + minimumFragmentDuration?: number; + /** + * The metadata format to use for writing metadata tags. + * + * - `'auto'` (default): Behaves like `'mdir'` for MP4 and like `'udta'` for QuickTime, matching FFmpeg's default + * behavior. + * - `'mdir'`: Write tags into `moov/udta/meta` using the 'mdir' handler format. + * - `'mdta'`: Write tags into `moov/udta/meta` using the 'mdta' handler format, equivalent to FFmpeg's + * `use_metadata_tags` flag. This allows for custom keys of arbitrary length. + * - `'udta'`: Write tags directly into `moov/udta`. + */ + metadataFormat?: 'auto' | 'mdir' | 'mdta' | 'udta'; + /** + * Will be called once the ftyp (File Type) box of the output file has been written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onFtyp?: (data: Uint8Array, position: number) => unknown; + /** + * Will be called once the moov (Movie) box of the output file has been written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onMoov?: (data: Uint8Array, position: number) => unknown; + /** + * Will be called for each finalized mdat (Media Data) box of the output file. Usage of this callback is not + * recommended when not using `fastStart: 'fragmented'`, as there will be one monolithic mdat box which might + * require large amounts of memory. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onMdat?: (data: Uint8Array, position: number) => unknown; + /** + * Will be called for each finalized moof (Movie Fragment) box of the output file. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + * @param timestamp - The start timestamp of the fragment in seconds. + */ + onMoof?: (data: Uint8Array, position: number, timestamp: number) => unknown; +}; + +/** + * Matroska input format singleton. + * @group Input formats + * @public + */ +export declare const MATROSKA: MatroskaInputFormat; + +/** + * Matroska file format. + * + * Do not instantiate this class; use the {@link MATROSKA} singleton instead. + * + * @group Input formats + * @public + */ +export declare class MatroskaInputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * T or a promise that resolves to T. + * @group Miscellaneous + * @public + */ +export declare type MaybePromise = T | Promise; + +/** + * Union type of known media codecs. + * @group Codecs + * @public + */ +export declare type MediaCodec = VideoCodec | AudioCodec | SubtitleCodec; + +/** + * Base class for media sources. Media sources are used to add media samples to an output file. + * @group Media sources + * @public + */ +declare abstract class MediaSource_2 { + /** + * Closes this source. This prevents future samples from being added and signals to the output file that no further + * samples will come in for this track. Calling `.close()` is optional but recommended after adding the + * last sample - for improved performance and reduced memory usage. + */ + close(): void; +} +export { MediaSource_2 as MediaSource } + +/** + * Audio source that encodes the data of a + * [`MediaStreamAudioTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes it into the + * output. This is useful for capturing live or real-time audio such as microphones or audio from other media elements. + * Audio will automatically start being captured once the connected {@link Output} is started, and will keep being + * captured until the {@link Output} is finalized or this source is closed. + * @group Media sources + * @public + */ +export declare class MediaStreamAudioTrackSource extends AudioSource { + /** A promise that rejects upon any error within this source. This promise never resolves. */ + get errorPromise(): Promise; + /** Whether this source is currently paused as a result of calling `.pause()`. */ + get paused(): boolean; + /** + * Creates a new {@link MediaStreamAudioTrackSource} from a `MediaStreamAudioTrack`, which will pull audio samples + * from the stream in real time and encode them according to {@link AudioEncodingConfig}. + */ + constructor(track: MediaStreamAudioTrack, encodingConfig: AudioEncodingConfig); + /** + * Pauses the capture of audio data - any audio data emitted by the underlying media stream will be ignored + * while paused. This does *not* close the underlying `MediaStreamAudioTrack`, it just ignores its output. + */ + pause(): void; + /** Resumes the capture of audio data after being paused. */ + resume(): void; +} + +/** + * Video source that encodes the frames of a + * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes them into the + * output. This is useful for capturing live or real-time data such as webcams or screen captures. Frames will + * automatically start being captured once the connected {@link Output} is started, and will keep being captured until + * the {@link Output} is finalized or this source is closed. + * @group Media sources + * @public + */ +export declare class MediaStreamVideoTrackSource extends VideoSource { + /** A promise that rejects upon any error within this source. This promise never resolves. */ + get errorPromise(): Promise; + /** Whether this source is currently paused as a result of calling `.pause()`. */ + get paused(): boolean; + /** + * Creates a new {@link MediaStreamVideoTrackSource} from a + * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack), which will pull + * video samples from the stream in real time and encode them according to {@link VideoEncodingConfig}. + */ + constructor(track: MediaStreamVideoTrack, encodingConfig: VideoEncodingConfig); + /** + * Pauses the capture of video frames - any video frames emitted by the underlying media stream will be ignored + * while paused. This does *not* close the underlying `MediaStreamVideoTrack`, it just ignores its output. + */ + pause(): void; + /** Resumes the capture of video frames after being paused. */ + resume(): void; +} + +/** + * Represents descriptive (non-technical) metadata about a media file, such as title, author, date, cover art, or other + * attached files. Common tags are normalized by Mediabunny into a uniform format, while the `raw` field can be used to + * directly read or write the underlying metadata tags (which differ by format). + * + * - For MP4/QuickTime files, the metadata refers to the data in `'moov'`-level `'udta'` and `'meta'` atoms. + * - For WebM/Matroska files, the metadata refers to the Tags and Attachments elements whose target is 50 (MOVIE). + * - For MP3 files, the metadata refers to the ID3v2 or ID3v1 tags. + * - For Ogg files, there is no global metadata so instead, the metadata refers to the combined metadata of all tracks, + * in Vorbis-style comment headers. + * - For WAVE files, the metadata refers to the chunks within the RIFF INFO chunk. + * - For ADTS files, there is no metadata. + * - For FLAC files, the metadata lives in Vorbis style in the Vorbis comment block. + * + * @group Metadata tags + * @public + */ +export declare type MetadataTags = { + /** Title of the media (e.g. Gangnam Style, Titanic, etc.) */ + title?: string; + /** Short description or subtitle of the media. */ + description?: string; + /** Primary artist(s) or creator(s) of the work. */ + artist?: string; + /** Album, collection, or compilation the media belongs to. */ + album?: string; + /** Main credited artist for the album/collection as a whole. */ + albumArtist?: string; + /** Position of this track within its album or collection (1-based). */ + trackNumber?: number; + /** Total number of tracks in the album or collection. */ + tracksTotal?: number; + /** Disc index if the release spans multiple discs (1-based). */ + discNumber?: number; + /** Total number of discs in the release. */ + discsTotal?: number; + /** Genre or category describing the media's style or content (e.g. Metal, Horror, etc.) */ + genre?: string; + /** Release, recording or creation date of the media. */ + date?: Date; + /** Full text lyrics or transcript associated with the media. */ + lyrics?: string; + /** Freeform notes, remarks or commentary about the media. */ + comment?: string; + /** Embedded images such as cover art, booklet scans, artwork or preview frames. */ + images?: AttachedImage[]; + /** + * The raw, underlying metadata tags. + * + * This field can be used for both reading and writing. When reading, it represents the original tags that were used + * to derive the normalized fields, and any additional metadata that Mediabunny doesn't understand. When writing, it + * can be used to set arbitrary metadata tags in the output file. + * + * The format of these tags differs per format: + * - MP4/QuickTime: By default, the keys refer to the names of the individual atoms in the `'ilst'` atom inside the + * `'meta'` atom, and the values are derived from the content of the `'data'` atom inside them. When a `'keys'` atom + * is also used, then the keys reflect the keys specified there (such as `'com.apple.quicktime.version'`). + * Additionally, any atoms within the `'udta'` atom are dumped into here, however with unknown internal format + * (`Uint8Array`). + * - WebM/Matroska: `SimpleTag` elements whose target is 50 (MOVIE), either containing string or `Uint8Array` + * values. Additionally, all attached files (such as font files) are included here, where the key corresponds to + * the FileUID and the value is an {@link AttachedFile}. + * - MP3: The ID3v2 tags, or a single `'TAG'` key with the contents of the ID3v1 tag. + * - Ogg: The key-value string pairs from the Vorbis-style comment header (see RFC 7845, Section 5.2). + * Additionally, the `'vendor'` key refers to the vendor string within this header. + * - WAVE: The individual metadata chunks within the RIFF INFO chunk. Values are always ISO 8859-1 strings. + * - FLAC: The key-value string pairs from the vorbis metadata block (see RFC 9639, Section D.2.3). + * Additionally, the `'vendor'` key refers to the vendor string within this header. + */ + raw?: Record; +}; + +/** + * Matroska file format. + * + * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must + * contain alpha side data. + * + * @group Output formats + * @public + */ +export declare class MkvOutputFormat extends OutputFormat { + /** Creates a new {@link MkvOutputFormat} configured with the specified `options`. */ + constructor(options?: MkvOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * Matroska-specific output options. + * @group Output formats + * @public + */ +export declare type MkvOutputFormatOptions = { + /** + * Configures the output to only append new data at the end, useful for live-streaming the file as it's being + * created. When enabled, some features such as storing duration and seeking will be disabled or impacted, so don't + * use this option when you want to write out a clean file for later use. + */ + appendOnly?: boolean; + /** + * This field controls the minimum duration of each Matroska cluster, in seconds. New clusters will only be created + * when the current cluster is longer than this value. Defaults to 1 second. + */ + minimumClusterDuration?: number; + /** + * Will be called once the EBML header of the output file has been written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onEbmlHeader?: (data: Uint8Array, position: number) => void; + /** + * Will be called once the header part of the Matroska Segment element has been written. The header data includes + * the Segment element and everything inside it, up to (but excluding) the first Matroska Cluster. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onSegmentHeader?: (data: Uint8Array, position: number) => unknown; + /** + * Will be called for each finalized Matroska Cluster of the output file. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + * @param timestamp - The start timestamp of the cluster in seconds. + */ + onCluster?: (data: Uint8Array, position: number, timestamp: number) => unknown; +}; + +/** + * QuickTime File Format (QTFF), often called MOV. Supports all video and audio codecs, but not subtitle codecs. + * @group Output formats + * @public + */ +export declare class MovOutputFormat extends IsobmffOutputFormat { + /** Creates a new {@link MovOutputFormat} configured with the specified `options`. */ + constructor(options?: IsobmffOutputFormatOptions); + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; +} + +/** + * MP3 input format singleton. + * @group Input formats + * @public + */ +export declare const MP3: Mp3InputFormat; + +/** + * MP3 file format. + * + * Do not instantiate this class; use the {@link MP3} singleton instead. + * + * @group Input formats + * @public + */ +export declare class Mp3InputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * MP3 file format. + * @group Output formats + * @public + */ +export declare class Mp3OutputFormat extends OutputFormat { + /** Creates a new {@link Mp3OutputFormat} configured with the specified `options`. */ + constructor(options?: Mp3OutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * MP3-specific output options. + * @group Output formats + * @public + */ +export declare type Mp3OutputFormatOptions = { + /** + * Controls whether the Xing header, which contains additional metadata as well as an index, is written to the start + * of the MP3 file. When disabled, the writing process becomes append-only. Defaults to `true`. + */ + xingHeader?: boolean; + /** + * Will be called once the Xing metadata frame is finalized. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + */ + onXingFrame?: (data: Uint8Array, position: number) => unknown; +}; + +/** + * MP4 input format singleton. + * @group Input formats + * @public + */ +export declare const MP4: Mp4InputFormat; + +/** + * MPEG-4 Part 14 (MP4) file format. + * + * Do not instantiate this class; use the {@link MP4} singleton instead. + * + * @group Input formats + * @public + */ +export declare class Mp4InputFormat extends IsobmffInputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * MPEG-4 Part 14 (MP4) file format. Supports most codecs. + * @group Output formats + * @public + */ +export declare class Mp4OutputFormat extends IsobmffOutputFormat { + /** Creates a new {@link Mp4OutputFormat} configured with the specified `options`. */ + constructor(options?: IsobmffOutputFormatOptions); + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; +} + +/** + * List of known compressed audio codecs, ordered by encoding preference. + * @group Codecs + * @public + */ +export declare const NON_PCM_AUDIO_CODECS: readonly ["aac", "opus", "mp3", "vorbis", "flac"]; + +/** + * This target just discards all incoming data. It is useful for when you need an {@link Output} but extract data from + * it differently, for example through format-specific callbacks (`onMoof`, `onMdat`, ...) or encoder events. + * @group Output targets + * @public + */ +export declare class NullTarget extends Target { +} + +/** + * Ogg input format singleton. + * @group Input formats + * @public + */ +export declare const OGG: OggInputFormat; + +/** + * Ogg file format. + * + * Do not instantiate this class; use the {@link OGG} singleton instead. + * + * @group Input formats + * @public + */ +export declare class OggInputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * Ogg file format. + * @group Output formats + * @public + */ +export declare class OggOutputFormat extends OutputFormat { + /** Creates a new {@link OggOutputFormat} configured with the specified `options`. */ + constructor(options?: OggOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * Ogg-specific output options. + * @group Output formats + * @public + */ +export declare type OggOutputFormatOptions = { + /** + * Will be called for each Ogg page that is written. + * + * @param data - The raw bytes. + * @param position - The byte offset of the data in the file. + * @param source - The {@link MediaSource} backing the page's logical bitstream (track). + */ + onPage?: (data: Uint8Array, position: number, source: MediaSource_2) => unknown; +}; + +/** + * Main class orchestrating the creation of a new media file. + * @group Output files + * @public + */ +export declare class Output { + /** The format of the output file. */ + format: F; + /** The target to which the file will be written. */ + target: T; + /** The current state of the output. */ + state: 'pending' | 'started' | 'canceled' | 'finalizing' | 'finalized'; + /** + * Creates a new instance of {@link Output} which can then be used to create a new media file according to the + * specified {@link OutputOptions}. + */ + constructor(options: OutputOptions); + /** Adds a video track to the output with the given source. Can only be called before the output is started. */ + addVideoTrack(source: VideoSource, metadata?: VideoTrackMetadata): void; + /** Adds an audio track to the output with the given source. Can only be called before the output is started. */ + addAudioTrack(source: AudioSource, metadata?: AudioTrackMetadata): void; + /** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */ + addSubtitleTrack(source: SubtitleSource, metadata?: SubtitleTrackMetadata): void; + /** + * Sets descriptive metadata tags about the media file, such as title, author, date, or cover art. When called + * multiple times, only the metadata from the last call will be used. + * + * Can only be called before the output is started. + */ + setMetadataTags(tags: MetadataTags): void; + /** + * Starts the creation of the output file. This method should be called after all tracks have been added. Only after + * the output has started can media samples be added to the tracks. + * + * @returns A promise that resolves when the output has successfully started and is ready to receive media samples. + */ + start(): Promise; + /** + * Resolves with the full MIME type of the output file, including track codecs. + * + * The returned promise will resolve only once the precise codec strings of all tracks are known. + */ + getMimeType(): Promise; + /** + * Cancels the creation of the output file, releasing internal resources like encoders and preventing further + * samples from being added. + * + * @returns A promise that resolves once all internal resources have been released. + */ + cancel(): Promise; + /** + * Finalizes the output file. This method must be called after all media samples across all tracks have been added. + * Once the Promise returned by this method completes, the output file is ready. + */ + finalize(): Promise; +} + +/** + * Base class representing an output media file format. + * @group Output formats + * @public + */ +export declare abstract class OutputFormat { + /** The file extension used by this output format, beginning with a dot. */ + abstract get fileExtension(): string; + /** The base MIME type of the output format. */ + abstract get mimeType(): string; + /** Returns a list of media codecs that this output format can contain. */ + abstract getSupportedCodecs(): MediaCodec[]; + /** Returns the number of tracks that this output format supports. */ + abstract getSupportedTrackCounts(): TrackCountLimits; + /** Whether this output format supports video rotation metadata. */ + abstract get supportsVideoRotationMetadata(): boolean; + /** Returns a list of video codecs that this output format can contain. */ + getSupportedVideoCodecs(): VideoCodec[]; + /** Returns a list of audio codecs that this output format can contain. */ + getSupportedAudioCodecs(): AudioCodec[]; + /** Returns a list of subtitle codecs that this output format can contain. */ + getSupportedSubtitleCodecs(): SubtitleCodec[]; +} + +/** + * The options for creating an Output object. + * @group Output files + * @public + */ +export declare type OutputOptions = { + /** The format of the output file. */ + format: F; + /** The target to which the file will be written. */ + target: T; +}; + +/** + * Additional options for controlling packet retrieval. + * @group Media sinks + * @public + */ +export declare type PacketRetrievalOptions = { + /** + * When set to `true`, only packet metadata (like timestamp) will be retrieved - the actual packet data will not + * be loaded. + */ + metadataOnly?: boolean; + /** + * When set to true, key packets will be verified upon retrieval by looking into the packet's bitstream. + * If not enabled, the packet types will be determined solely by what's stored in the containing file and may be + * incorrect, potentially leading to decoder errors. Since determining a packet's actual type requires looking into + * its data, this option cannot be enabled together with `metadataOnly`. + */ + verifyKeyPackets?: boolean; +}; + +/** + * Contains aggregate statistics about the encoded packets of a track. + * @group Input files & tracks + * @public + */ +export declare type PacketStats = { + /** The total number of packets. */ + packetCount: number; + /** The average number of packets per second. For video tracks, this will equal the average frame rate (FPS). */ + averagePacketRate: number; + /** The average number of bits per second. */ + averageBitrate: number; +}; + +/** + * The type of a packet. Key packets can be decoded without previous packets, while delta packets depend on previous + * packets. + * @group Packets + * @public + */ +export declare type PacketType = 'key' | 'delta'; + +/** + * List of known PCM (uncompressed) audio codecs, ordered by encoding preference. + * @group Codecs + * @public + */ +export declare const PCM_AUDIO_CODECS: readonly ["pcm-s16", "pcm-s16be", "pcm-s24", "pcm-s24be", "pcm-s32", "pcm-s32be", "pcm-f32", "pcm-f32be", "pcm-f64", "pcm-f64be", "pcm-u8", "pcm-s8", "ulaw", "alaw"]; + +/** + * QuickTime File Format input format singleton. + * @group Input formats + * @public + */ +export declare const QTFF: QuickTimeInputFormat; + +/** + * Represents a subjective media quality level. + * @group Encoding + * @public + */ +export declare class Quality { +} + +/** + * Represents a high media quality. + * @group Encoding + * @public + */ +export declare const QUALITY_HIGH: Quality; + +/** + * Represents a low media quality. + * @group Encoding + * @public + */ +export declare const QUALITY_LOW: Quality; + +/** + * Represents a medium media quality. + * @group Encoding + * @public + */ +export declare const QUALITY_MEDIUM: Quality; + +/** + * Represents a very high media quality. + * @group Encoding + * @public + */ +export declare const QUALITY_VERY_HIGH: Quality; + +/** + * Represents a very low media quality. + * @group Encoding + * @public + */ +export declare const QUALITY_VERY_LOW: Quality; + +/** + * QuickTime File Format (QTFF), often called MOV. + * + * Do not instantiate this class; use the {@link QTFF} singleton instead. + * + * @group Input formats + * @public + */ +export declare class QuickTimeInputFormat extends IsobmffInputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of + * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally + * streaming in input files that are still being constructed and whose size we don't yet know, like for example the + * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder). + * + * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the + * lack of random file access. You should only use this source with sequential access patterns, such as reading all + * packets from start to end. This source does not work well with random access patterns unless you increase its + * max cache size. + * + * @group Input sources + * @public + */ +export declare class ReadableStreamSource extends Source { + /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */ + constructor(stream: ReadableStream, options?: ReadableStreamSourceOptions); +} + +/** + * Options for {@link ReadableStreamSource}. + * @group Input sources + * @public + */ +export declare type ReadableStreamSourceOptions = { + /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 16 MiB. */ + maxCacheSize?: number; +}; + +/** + * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever + * possible. + * @group Custom coders + * @public + */ +export declare const registerDecoder: (decoder: typeof CustomVideoDecoder | typeof CustomAudioDecoder) => void; + +/** + * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever + * possible. + * @group Custom coders + * @public + */ +export declare const registerEncoder: (encoder: typeof CustomVideoEncoder | typeof CustomAudioEncoder) => void; + +/** + * Image data with additional metadata. + * + * @group Metadata tags + * @public + */ +export declare class RichImageData { + /** The raw image data. */ + data: Uint8Array; + /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ + mimeType: string; + /** Creates a new {@link RichImageData}. */ + constructor( + /** The raw image data. */ + data: Uint8Array, + /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ + mimeType: string); +} + +/** + * Represents a clockwise rotation in degrees. + * @group Miscellaneous + * @public + */ +export declare type Rotation = 0 | 90 | 180 | 270; + +/** + * Sets all keys K of T to be required. + * @group Miscellaneous + * @public + */ +export declare type SetRequired = T & Required>; + +/** + * The source base class, representing a resource from which bytes can be read. + * @group Input sources + * @public + */ +export declare abstract class Source { + /** + * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call + * will retrieve the size. + * + * Returns null if the source is unsized. + */ + getSizeOrNull(): Promise; + /** + * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call + * will retrieve the size. + * + * Throws an error if the source is unsized. + */ + getSize(): Promise; + /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */ + onread: ((start: number, end: number) => unknown) | null; +} + +/** + * A general-purpose, callback-driven source that can get its data from anywhere. + * @group Input sources + * @public + */ +export declare class StreamSource extends Source { + /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */ + constructor(options: StreamSourceOptions); +} + +/** + * Options for defining a {@link StreamSource}. + * @group Input sources + * @public + */ +export declare type StreamSourceOptions = { + /** + * Called when the size of the entire file is requested. Must return or resolve to the size in bytes. This function + * is guaranteed to be called before `read`. + */ + getSize: () => MaybePromise; + /** + * Called when data is requested. Must return or resolve to the bytes from the specified byte range, or a stream + * that yields these bytes. + */ + read: (start: number, end: number) => MaybePromise>; + /** + * Called when the {@link Input} driven by this source is disposed. + */ + dispose?: () => unknown; + /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ + maxCacheSize?: number; + /** + * Specifies the prefetch profile that the reader should use with this source. A prefetch profile specifies the + * pattern with which bytes outside of the requested range are preloaded to reduce latency for future reads. + * + * - `'none'` (default): No prefetching; only the data needed in the moment is requested. + * - `'fileSystem'`: File system-optimized prefetching: a small amount of data is prefetched bidirectionally, + * aligned with page boundaries. + * - `'network'`: Network-optimized prefetching, or more generally, prefetching optimized for any high-latency + * environment: tries to minimize the amount of read calls and aggressively prefetches data when sequential access + * patterns are detected. + */ + prefetchProfile?: 'none' | 'fileSystem' | 'network'; +}; + +/** + * This target writes data to a [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream), + * making it a general-purpose target for writing data anywhere. It is also compatible with + * [`FileSystemWritableFileStream`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemWritableFileStream) for + * use with the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API). The + * `WritableStream` can also apply backpressure, which will propagate to the output and throttle the encoders. + * @group Output targets + * @public + */ +export declare class StreamTarget extends Target { + /** Creates a new {@link StreamTarget} which writes to the specified `writable`. */ + constructor(writable: WritableStream, options?: StreamTargetOptions); +} + +/** + * A data chunk for {@link StreamTarget}. + * @group Output targets + * @public + */ +export declare type StreamTargetChunk = { + /** The operation type. */ + type: 'write'; + /** The data to write. */ + data: Uint8Array; + /** The byte offset in the output file at which to write the data. */ + position: number; +}; + +/** + * Options for {@link StreamTarget}. + * @group Output targets + * @public + */ +export declare type StreamTargetOptions = { + /** + * When setting this to true, data created by the output will first be accumulated and only written out + * once it has reached sufficient size, using a default chunk size of 16 MiB. This is useful for reducing the total + * amount of writes, at the cost of latency. + */ + chunked?: boolean; + /** When using `chunked: true`, this specifies the maximum size of each chunk. Defaults to 16 MiB. */ + chunkSize?: number; +}; + +/** + * List of known subtitle codecs, ordered by encoding preference. + * @group Codecs + * @public + */ +export declare const SUBTITLE_CODECS: readonly ["webvtt"]; + +/** + * Union type of known subtitle codecs. + * @group Codecs + * @public + */ +export declare type SubtitleCodec = typeof SUBTITLE_CODECS[number]; + +/** + * Base class for subtitle sources - sources for subtitle tracks. + * @group Media sources + * @public + */ +export declare abstract class SubtitleSource extends MediaSource_2 { + /** Internal constructor. */ + constructor(codec: SubtitleCodec); +} + +/** + * Additional metadata for subtitle tracks. + * @group Output files + * @public + */ +export declare type SubtitleTrackMetadata = BaseTrackMetadata & {}; + +/** + * Base class for targets, specifying where output files are written. + * @group Output targets + * @public + */ +export declare abstract class Target { + /** + * Called each time data is written to the target. Will be called with the byte range into which data was written. + * + * Use this callback to track the size of the output file as it grows. But be warned, this function is chatty and + * gets called *extremely* often. + */ + onwrite: ((start: number, end: number) => unknown) | null; +} + +/** + * This source can be used to add subtitles from a subtitle text file. + * @group Media sources + * @public + */ +export declare class TextSubtitleSource extends SubtitleSource { + /** Creates a new {@link TextSubtitleSource} where added text chunks are in the specified `codec`. */ + constructor(codec: SubtitleCodec); + /** + * Parses the subtitle text according to the specified codec and adds it to the output track. You don't have to + * add the entire subtitle file at once here; you can provide it in chunks. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(text: string): Promise; +} + +/** + * Specifies the number of tracks (for each track type and in total) that an output format supports. + * @group Output formats + * @public + */ +export declare type TrackCountLimits = { + [K in TrackType]: InclusiveIntegerRange; +} & { + /** Specifies the overall allowed range of track counts for the output format. */ + total: InclusiveIntegerRange; +}; + +/** + * Specifies a track's disposition, i.e. information about its intended usage. + * @public + * @group Miscellaneous + */ +export declare type TrackDisposition = { + /** + * Indicates that this track is eligible for automatic selection by a player; that it is the main track among other, + * non-default tracks of the same type. + */ + default: boolean; + /** + * Indicates that players should always display this track by default, even if it goes against the user's default + * preferences. For example, a subtitle track only containing translations of foreign-language audio. + */ + forced: boolean; + /** Indicates that this track is in the content's original language. */ + original: boolean; + /** Indicates that this track contains commentary. */ + commentary: boolean; + /** Indicates that this track is intended for hearing-impaired users. */ + hearingImpaired: boolean; + /** Indicates that this track is intended for visually-impaired users. */ + visuallyImpaired: boolean; +}; + +/** + * Union type of all track types. + * @group Miscellaneous + * @public + */ +export declare type TrackType = typeof ALL_TRACK_TYPES[number]; + +/** + * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized + * reading and prefetching pattern to minimize request count and latency. + * @group Input sources + * @public + */ +export declare class UrlSource extends Source { + /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */ + constructor(url: string | URL | Request, options?: UrlSourceOptions); +} + +/** + * Options for {@link UrlSource}. + * @group Input sources + * @public + */ +export declare type UrlSourceOptions = { + /** + * The [`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit) used by the Fetch API. Can be + * used to further control the requests, such as setting custom headers. + */ + requestInit?: RequestInit; + /** + * A function that returns the delay (in seconds) before retrying a failed request. The function is called + * with the number of previous, unsuccessful attempts, as well as with the error with which the previous request + * failed. If the function returns `null`, no more retries will be made. + * + * By default, it uses an exponential backoff algorithm that never gives up unless + * a CORS error is suspected (`fetch()` did reject, `navigator.onLine` is true and origin is different) + */ + getRetryDelay?: (previousAttempts: number, error: unknown, url: string | URL | Request) => number | null; + /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 64 MiB. */ + maxCacheSize?: number; + /** + * A WHATWG-compatible fetch function. You can use this field to polyfill the `fetch` function, add missing + * features, or use a custom implementation. + */ + fetchFn?: typeof fetch; +}; + +/** + * List of known video codecs, ordered by encoding preference. + * @group Codecs + * @public + */ +export declare const VIDEO_CODECS: readonly ["avc", "hevc", "vp9", "av1", "vp8"]; + +/** + * Union type of known video codecs. + * @group Codecs + * @public + */ +export declare type VideoCodec = typeof VIDEO_CODECS[number]; + +/** + * Additional options that control audio encoding. + * @group Encoding + * @public + */ +export declare type VideoEncodingAdditionalOptions = { + /** + * What to do with alpha data contained in the video samples. + * + * - `'discard'` (default): Only the samples' color data is kept; the video is opaque. + * - `'keep'`: The samples' alpha data is also encoded as side data. Make sure to pair this mode with a container + * format that supports transparency (such as WebM or Matroska). + */ + alpha?: 'discard' | 'keep'; + /** Configures the bitrate mode; defaults to `'variable'`. */ + bitrateMode?: 'constant' | 'variable'; + /** + * The latency mode used by the encoder; controls the performance-quality tradeoff. + * + * - `'quality'` (default): The encoder prioritizes quality over latency, and no frames can be dropped. + * - `'realtime'`: The encoder prioritizes low latency over quality, and may drop frames if the encoder becomes + * overloaded to keep up with real-time requirements. + */ + latencyMode?: 'quality' | 'realtime'; + /** + * The full codec string as specified in the WebCodecs Codec Registry. This string must match the codec + * specified in `codec`. When not set, a fitting codec string will be constructed automatically by the library. + */ + fullCodecString?: string; + /** + * A hint that configures the hardware acceleration method of this codec. This is best left on `'no-preference'`, + * the default. + */ + hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software'; + /** + * An encoding scalability mode identifier as defined by + * [WebRTC-SVC](https://w3c.github.io/webrtc-svc/#scalabilitymodes*). + */ + scalabilityMode?: string; + /** + * An encoding video content hint as defined by + * [mst-content-hint](https://w3c.github.io/mst-content-hint/#video-content-hints). + */ + contentHint?: string; +}; + +/** + * Configuration object that controls video encoding. Can be used to set codec, quality, and more. + * @group Encoding + * @public + */ +export declare type VideoEncodingConfig = { + /** The video codec that should be used for encoding the video samples (frames). */ + codec: VideoCodec; + /** + * The target bitrate for the encoded video, in bits per second. Alternatively, a subjective {@link Quality} can + * be provided. + */ + bitrate: number | Quality; + /** + * The interval, in seconds, of how often frames are encoded as a key frame. The default is 5 seconds. Frequent key + * frames improve seeking behavior but increase file size. When using multiple video tracks, you should give them + * all the same key frame interval. + */ + keyFrameInterval?: number; + /** + * Video frames may change size over time. This field controls the behavior in case this happens. + * + * - `'deny'` (default) will throw an error, requiring all frames to have the exact same dimensions. + * - `'passThrough'` will allow the change and directly pass the frame to the encoder. + * - `'fill'` will stretch the image to fill the entire original box, potentially altering aspect ratio. + * - `'contain'` will contain the entire image within the original box while preserving aspect ratio. This may lead + * to letterboxing. + * - `'cover'` will scale the image until the entire original box is filled, while preserving aspect ratio. + * + * The "original box" refers to the dimensions of the first encoded frame. + */ + sizeChangeBehavior?: 'deny' | 'passThrough' | 'fill' | 'contain' | 'cover'; + /** Called for each successfully encoded packet. Both the packet and the encoding metadata are passed. */ + onEncodedPacket?: (packet: EncodedPacket, meta: EncodedVideoChunkMetadata | undefined) => unknown; + /** + * Called when the internal [encoder config](https://www.w3.org/TR/webcodecs/#video-encoder-config), as used by the + * WebCodecs API, is created. + */ + onEncoderConfig?: (config: VideoEncoderConfig) => unknown; +} & VideoEncodingAdditionalOptions; + +/** + * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's + * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame), but can also be used standalone. + * @group Samples + * @public + */ +export declare class VideoSample implements Disposable { + /** + * The internal pixel format in which the frame is stored. + * [See pixel formats](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/format) + */ + readonly format: VideoPixelFormat | null; + /** The width of the frame in pixels. */ + readonly codedWidth: number; + /** The height of the frame in pixels. */ + readonly codedHeight: number; + /** The rotation of the frame in degrees, clockwise. */ + readonly rotation: Rotation; + /** + * The presentation timestamp of the frame in seconds. May be negative. Frames with negative end timestamps should + * not be presented. + */ + readonly timestamp: number; + /** The duration of the frame in seconds. */ + readonly duration: number; + /** The color space of the frame. */ + readonly colorSpace: VideoColorSpace; + /** The width of the frame in pixels after rotation. */ + get displayWidth(): number; + /** The height of the frame in pixels after rotation. */ + get displayHeight(): number; + /** The presentation timestamp of the frame in microseconds. */ + get microsecondTimestamp(): number; + /** The duration of the frame in microseconds. */ + get microsecondDuration(): number; + /** + * Whether this sample uses a pixel format that can hold transparency data. Note that this doesn't necessarily mean + * that the sample is transparent. + */ + get hasAlpha(): boolean | null; + /** + * Creates a new {@link VideoSample} from a + * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame). This is essentially a near zero-cost + * wrapper around `VideoFrame`. The sample's metadata is optionally refined using the data specified in `init`. + */ + constructor(data: VideoFrame, init?: VideoSampleInit); + /** + * Creates a new {@link VideoSample} from a + * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource), similar to the + * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame) constructor. When `VideoFrame` is + * available, this is simply a wrapper around its constructor. If not, it will copy the source's image data to an + * internal canvas for later use. + */ + constructor(data: CanvasImageSource, init: SetRequired); + /** + * Creates a new {@link VideoSample} from raw pixel data specified in `data`. Additional metadata must be provided + * in `init`. + */ + constructor(data: AllowSharedBufferSource, init: SetRequired); + /** Clones this video sample. */ + clone(): VideoSample; + /** + * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not + * needed anymore. + */ + close(): void; + /** Returns the number of bytes required to hold this video sample's pixel data. */ + allocationSize(): number; + /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */ + copyTo(destination: AllowSharedBufferSource): Promise; + /** + * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this + * method *must* be closed separately from this video sample. + */ + toVideoFrame(): VideoFrame; + /** + * Draws the video sample to a 2D canvas context. Rotation metadata will be taken into account. + * + * @param dx - The x-coordinate in the destination canvas at which to place the top-left corner of the source image. + * @param dy - The y-coordinate in the destination canvas at which to place the top-left corner of the source image. + * @param dWidth - The width in pixels with which to draw the image in the destination canvas. + * @param dHeight - The height in pixels with which to draw the image in the destination canvas. + */ + draw(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, dx: number, dy: number, dWidth?: number, dHeight?: number): void; + /** + * Draws the video sample to a 2D canvas context. Rotation metadata will be taken into account. + * + * @param sx - The x-coordinate of the top left corner of the sub-rectangle of the source image to draw into the + * destination context. + * @param sy - The y-coordinate of the top left corner of the sub-rectangle of the source image to draw into the + * destination context. + * @param sWidth - The width of the sub-rectangle of the source image to draw into the destination context. + * @param sHeight - The height of the sub-rectangle of the source image to draw into the destination context. + * @param dx - The x-coordinate in the destination canvas at which to place the top-left corner of the source image. + * @param dy - The y-coordinate in the destination canvas at which to place the top-left corner of the source image. + * @param dWidth - The width in pixels with which to draw the image in the destination canvas. + * @param dHeight - The height in pixels with which to draw the image in the destination canvas. + */ + draw(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth?: number, dHeight?: number): void; + /** + * Draws the sample in the middle of the canvas corresponding to the context with the specified fit behavior. + */ + drawWithFit(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options: { + /** + * Controls the fitting algorithm. + * + * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. + * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to + * letterboxing. + * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. + */ + fit: 'fill' | 'contain' | 'cover'; + /** A way to override rotation. Defaults to the rotation of the sample. */ + rotation?: Rotation; + /** + * Specifies the rectangular region of the video sample to crop to. The crop region will automatically be + * clamped to the dimensions of the video sample. Cropping is performed after rotation but before resizing. + */ + crop?: CropRectangle; + }): void; + /** + * Converts this video sample to a + * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource) for drawing to a canvas. + * + * You must use the value returned by this method immediately, as any VideoFrame created internally will + * automatically be closed in the next microtask. + */ + toCanvasImageSource(): VideoFrame | OffscreenCanvas; + /** Sets the rotation metadata of this video sample. */ + setRotation(newRotation: Rotation): void; + /** Sets the presentation timestamp of this video sample, in seconds. */ + setTimestamp(newTimestamp: number): void; + /** Sets the duration of this video sample, in seconds. */ + setDuration(newDuration: number): void; + /** Calls `.close()`. */ + [Symbol.dispose](): void; +} + +/** + * Metadata used for VideoSample initialization. + * @group Samples + * @public + */ +export declare type VideoSampleInit = { + /** + * The internal pixel format in which the frame is stored. + * [See pixel formats](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/format) + */ + format?: VideoPixelFormat; + /** The width of the frame in pixels. */ + codedWidth?: number; + /** The height of the frame in pixels. */ + codedHeight?: number; + /** The rotation of the frame in degrees, clockwise. */ + rotation?: Rotation; + /** The presentation timestamp of the frame in seconds. */ + timestamp?: number; + /** The duration of the frame in seconds. */ + duration?: number; + /** The color space of the frame. */ + colorSpace?: VideoColorSpaceInit; +}; + +/** + * A sink that retrieves decoded video samples (video frames) from a video track. + * @group Media sinks + * @public + */ +export declare class VideoSampleSink extends BaseMediaSampleSink { + /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */ + constructor(videoTrack: InputVideoTrack); + /** + * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns + * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp. + * Returns null if the timestamp is before the track's first timestamp. + * + * @param timestamp - The timestamp used for retrieval, in seconds. + */ + getSample(timestamp: number): Promise; + /** + * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method + * will intelligently pre-decode a few frames ahead to enable fast iteration. + * + * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). + * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). + */ + samples(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; + /** + * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method + * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most + * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may + * yield null if no frame is available for a given timestamp. + * + * @param timestamps - An iterable or async iterable of timestamps in seconds. + */ + samplesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; +} + +/** + * This source can be used to add raw, unencoded video samples (frames) to an output video track. These frames will + * automatically be encoded and then piped into the output. + * @group Media sources + * @public + */ +export declare class VideoSampleSource extends VideoSource { + /** + * Creates a new {@link VideoSampleSource} whose samples are encoded according to the specified + * {@link VideoEncodingConfig}. + */ + constructor(encodingConfig: VideoEncodingConfig); + /** + * Encodes a video sample (frame) and then adds it to the output. + * + * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise + * to respect writer and encoder backpressure. + */ + add(videoSample: VideoSample, encodeOptions?: VideoEncoderEncodeOptions): Promise; +} + +/** + * Base class for video sources - sources for video tracks. + * @group Media sources + * @public + */ +export declare abstract class VideoSource extends MediaSource_2 { + /** Internal constructor. */ + constructor(codec: VideoCodec); +} + +/** + * Additional metadata for video tracks. + * @group Output files + * @public + */ +export declare type VideoTrackMetadata = BaseTrackMetadata & { + /** The angle in degrees by which the track's frames should be rotated (clockwise). */ + rotation?: Rotation; + /** + * The expected video frame rate in hertz. If set, all timestamps and durations of this track will be snapped to + * this frame rate. You should avoid adding more frames than the rate allows, as this will lead to multiple frames + * with the same timestamp. + */ + frameRate?: number; +}; + +/** + * WAVE input format singleton. + * @group Input formats + * @public + */ +export declare const WAVE: WaveInputFormat; + +/** + * WAVE file format, based on RIFF. + * + * Do not instantiate this class; use the {@link WAVE} singleton instead. + * + * @group Input formats + * @public + */ +export declare class WaveInputFormat extends InputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * WAVE file format, based on RIFF. + * @group Output formats + * @public + */ +export declare class WavOutputFormat extends OutputFormat { + /** Creates a new {@link WavOutputFormat} configured with the specified `options`. */ + constructor(options?: WavOutputFormatOptions); + getSupportedTrackCounts(): TrackCountLimits; + get fileExtension(): string; + get mimeType(): string; + getSupportedCodecs(): MediaCodec[]; + get supportsVideoRotationMetadata(): boolean; +} + +/** + * WAVE-specific output options. + * @group Output formats + * @public + */ +export declare type WavOutputFormatOptions = { + /** + * When enabled, an RF64 file will be written, allowing for file sizes to exceed 4 GiB, which is otherwise not + * possible for regular WAVE files. + */ + large?: boolean; + /** + * The metadata format to use for writing metadata tags. + * + * - `'info'` (default): Writes metadata into a RIFF INFO LIST chunk, the default way to contain metadata tags + * within WAVE. Only allows for a limited subset of tags to be written. + * - `'id3'`: Writes metadata into an ID3 chunk. Non-default, but used by many taggers in practice. Allows for a + * much larger and richer set of tags to be written. + */ + metadataFormat?: 'info' | 'id3'; + /** + * Will be called once the file header is written. The header consists of the RIFF header, the format chunk, + * metadata chunks, and the start of the data chunk (with a placeholder size of 0). + */ + onHeader?: (data: Uint8Array, position: number) => unknown; +}; + +/** + * WebM input format singleton. + * @group Input formats + * @public + */ +export declare const WEBM: WebMInputFormat; + +/** + * WebM file format, based on Matroska. + * + * Do not instantiate this class; use the {@link WEBM} singleton instead. + * + * @group Input formats + * @public + */ +export declare class WebMInputFormat extends MatroskaInputFormat { + get name(): string; + get mimeType(): string; +} + +/** + * WebM file format, based on Matroska. + * + * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must + * contain alpha side data. + * + * @group Output formats + * @public + */ +export declare class WebMOutputFormat extends MkvOutputFormat { + /** Creates a new {@link WebMOutputFormat} configured with the specified `options`. */ + constructor(options?: MkvOutputFormatOptions); + getSupportedCodecs(): MediaCodec[]; + get fileExtension(): string; + get mimeType(): string; +} + +/** + * WebM-specific output options. + * @group Output formats + * @public + */ +export declare type WebMOutputFormatOptions = MkvOutputFormatOptions; + +/** + * An AudioBuffer with additional timing information (timestamp & duration). + * @group Media sinks + * @public + */ +export declare type WrappedAudioBuffer = { + /** An AudioBuffer. */ + buffer: AudioBuffer; + /** The timestamp of the corresponding audio sample, in seconds. */ + timestamp: number; + /** The duration of the corresponding audio sample, in seconds. */ + duration: number; +}; + +/** + * A canvas with additional timing information (timestamp & duration). + * @group Media sinks + * @public + */ +export declare type WrappedCanvas = { + /** A canvas element or offscreen canvas. */ + canvas: HTMLCanvasElement | OffscreenCanvas; + /** The timestamp of the corresponding video sample, in seconds. */ + timestamp: number; + /** The duration of the corresponding video sample, in seconds. */ + duration: number; +}; + +export { } +export as namespace Mediabunny; diff --git a/packages/artplayer-proxy-mediabunny/package.json b/packages/artplayer-proxy-mediabunny/package.json new file mode 100644 index 000000000..8d88654c2 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/package.json @@ -0,0 +1,40 @@ +{ + "name": "artplayer-proxy-mediabunny", + "version": "1.0.0", + "description": "mediabunny proxy for ArtPlayer", + "author": "Harvey Zack ", + "license": "MIT", + "homepage": "https://artplayer.org", + "repository": { + "type": "git", + "url": "git+https://github.com/zhw2590582/ArtPlayer.git" + }, + "bugs": { + "url": "https://github.com/zhw2590582/ArtPlayer/issues" + }, + "keywords": [ + "html5", + "video", + "player" + ], + "exports": { + ".": { + "types": "./types/artplayer-proxy-mediabunny.d.ts", + "import": "./dist/artplayer-proxy-mediabunny.mjs", + "require": "./dist/artplayer-proxy-mediabunny.js" + }, + "./legacy": { + "types": "./types/artplayer-proxy-mediabunny.d.ts", + "import": "./dist/artplayer-proxy-mediabunny.legacy.js", + "require": "./dist/artplayer-proxy-mediabunny.legacy.js" + } + }, + "main": "./dist/artplayer-proxy-mediabunny.js", + "module": "./dist/artplayer-proxy-mediabunny.mjs", + "types": "./types/artplayer-proxy-mediabunny.d.ts", + "legacy": "./dist/artplayer-proxy-mediabunny.legacy.js", + "browserslist": "last 1 Chrome version", + "dependencies": { + "mediabunny": "^1.26.0" + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js new file mode 100644 index 000000000..2dc9b4e0c --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js @@ -0,0 +1,316 @@ +import { + ALL_FORMATS, + AudioBufferSink, + BlobSource, + Input, + ReadableStreamSource, + UrlSource, +} from 'mediabunny' + +export default function createAudioEngine(events) { + let input = null + let audioSink = null + + let audioContext = null + let gainNode = null + + let audioIterator = null + let audioContextStartTime = 0 + let playbackTimeAtStart = 0 + let latestScheduledEndTime = 0 + + let _duration = Number.NaN + let _paused = true + + let _volume = 0.7 + let _muted = false + let _playbackRate = 1 + + let asyncId = 0 + const queuedNodes = new Set() + + function getCurrentTime() { + if (_paused) + return playbackTimeAtStart + return ( + (audioContext.currentTime - audioContextStartTime) * _playbackRate + + playbackTimeAtStart + ) + } + + function updateGain() { + if (!gainNode) + return + const v = _muted ? 0 : _volume + gainNode.gain.value = v * v + } + + function ensureAudioContext(sampleRate) { + if (audioContext) + return + + const AudioContext + = window.AudioContext || window.webkitAudioContext + + try { + audioContext = new AudioContext({ sampleRate }) + } + catch { + audioContext = new AudioContext() + } + + gainNode = audioContext.createGain() + gainNode.connect(audioContext.destination) + updateGain() + } + + function stopQueuedNodes() { + for (const node of queuedNodes) { + node.stop() + } + queuedNodes.clear() + } + + async function stopIterator() { + await audioIterator?.return() + audioIterator = null + } + + function normalizeSource(src) { + if (typeof src === 'string') + return new UrlSource(src) + if (src instanceof Blob) + return new BlobSource(src) + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) + return new ReadableStreamSource(src) + return src + } + + async function load(src, onMetadata) { + asyncId++ + const id = asyncId + + await stopIterator() + stopQueuedNodes() + + _paused = true + playbackTimeAtStart = 0 + audioContextStartTime = 0 + + const source = normalizeSource(src) + if (!source) + return + + input = new Input({ + source, + formats: ALL_FORMATS, + }) + + _duration = await input.computeDuration() + if (id !== asyncId) + return + + const audioTrack = await input.getPrimaryAudioTrack() + if (!audioTrack) { + audioSink = null + ensureAudioContext() + if (onMetadata) + onMetadata() + return + } + + if (audioTrack.codec === null || !(await audioTrack.canDecode())) { + audioSink = null + ensureAudioContext() + if (onMetadata) + onMetadata() + return + } + + ensureAudioContext(audioTrack.sampleRate) + audioSink = new AudioBufferSink(audioTrack) + + if (onMetadata) + onMetadata() + } + + async function runIterator(localId) { + if (!audioSink) + return + + await stopIterator() + audioIterator = audioSink.buffers(getCurrentTime()) + + while (true) { + if (localId !== asyncId) + return + if (_paused) + return + + const nextPromise = audioIterator.next() + + const checkStarvation = setInterval(() => { + if (localId !== asyncId || _paused) { + clearInterval(checkStarvation) + return + } + if (audioContext.state === 'running' + && audioContext.currentTime >= latestScheduledEndTime - 0.2) { + audioContext.suspend() + events.emit('waiting') + } + }, 50) + + let result + try { + result = await nextPromise + } + catch (e) { + console.error(e) + break + } + finally { + clearInterval(checkStarvation) + } + + if (localId !== asyncId) + return + if (_paused) + return + + if (audioContext.state === 'suspended') { + await audioContext.resume() + events.emit('canplay') + events.emit('playing') + } + + if (result.done) + break + + const { buffer, timestamp } = result.value + + const node = audioContext.createBufferSource() + node.buffer = buffer + node.connect(gainNode) + node.playbackRate.value = _playbackRate + + const startAt + = audioContextStartTime + + (timestamp - playbackTimeAtStart) / _playbackRate + + const duration = buffer.duration + const endAt = startAt + duration / _playbackRate + + if (endAt > latestScheduledEndTime) { + latestScheduledEndTime = endAt + } + + if (startAt >= audioContext.currentTime) { + node.start(startAt) + } + else { + node.start( + audioContext.currentTime, + (audioContext.currentTime - startAt) * _playbackRate, + ) + } + + queuedNodes.add(node) + node.onended = () => queuedNodes.delete(node) + } + } + + async function play() { + if (!_paused) + return + + if (!audioContext) { + ensureAudioContext() + } + + if (audioContext.state === 'suspended') { + await audioContext.resume() + } + + audioContextStartTime = audioContext.currentTime + latestScheduledEndTime = audioContextStartTime + _paused = false + + asyncId++ + runIterator(asyncId) + } + + function pause() { + if (_paused) + return + + playbackTimeAtStart = getCurrentTime() + _paused = true + + stopIterator() + stopQueuedNodes() + } + + async function seek(time) { + playbackTimeAtStart = Math.max(0, time) + audioContextStartTime = audioContext.currentTime + latestScheduledEndTime = audioContextStartTime + + asyncId++ + if (!_paused) { + runIterator(asyncId) + } + } + + function destroy() { + asyncId++ + pause() + audioContext?.close() + audioContext = null + input = null + audioSink = null + } + + return { + load, + play, + pause, + seek, + destroy, + + setVolume(v, muted) { + _volume = v + _muted = muted + updateGain() + }, + + setPlaybackRate(rate) { + if (rate === _playbackRate) + return + + if (!_paused) { + playbackTimeAtStart = getCurrentTime() + audioContextStartTime = audioContext.currentTime + } + + _playbackRate = rate + + if (!_paused) { + asyncId++ + runIterator(asyncId) + } + }, + + get currentTime() { + return getCurrentTime() + }, + + get duration() { + return _duration + }, + + get paused() { + return _paused + }, + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js new file mode 100644 index 000000000..1621e0970 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js @@ -0,0 +1,220 @@ +import createAudioEngine from './audioEngine.js' +import createVideoEngine from './videoEngine.js' + +export default function createMediabunnyEngine({ + canvas, + ctx, + events, + option = {}, +}) { + const defaults = { + timeupdateInterval: 250, + avSyncTolerance: 0.12, + loadTimeout: 12000, + dropLateFrames: false, + poster: '', + } + + const audio = createAudioEngine(events) + const video = createVideoEngine({ + canvas, + ctx, + events, + timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval, + avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance, + dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames, + poster: option.poster ?? defaults.poster, + preflightRange: option.preflightRange ?? false, + }) + + let _paused = true + let _ended = false + let _readyState = 0 + let _networkState = 0 + let _error = null + let _seeking = false + let loadSeq = 0 + + events.addEventListener?.('ended', () => { + _ended = true + _paused = true + }) + + async function load(src) { + const id = ++loadSeq + pause() + _ended = false + _error = null + _networkState = 2 + _readyState = 0 + setTimeout(() => events.emit('waiting'), 0) + setTimeout(() => events.emit('loadstart'), 0) + + const loadTimeout = Number.isFinite(option.loadTimeout) + ? option.loadTimeout + : defaults.loadTimeout + + let timer = null + const timeoutPromise + = loadTimeout > 0 + ? new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error('Load timeout')), loadTimeout) + }) + : null + + const loadTask = (async () => { + try { + let videoMetadataLoaded = false + let audioMetadataLoaded = false + + const checkMetadata = () => { + if (videoMetadataLoaded && audioMetadataLoaded) { + _readyState = 1 + events.emit('loadedmetadata') + events.emit('durationchange') + } + } + + const p1 = video.load(src, () => { + if (id !== loadSeq) + return + videoMetadataLoaded = true + checkMetadata() + }) + + const p2 = audio.load(src, () => { + if (id !== loadSeq) + return + audioMetadataLoaded = true + checkMetadata() + }) + + await Promise.all([p1, p2]) + if (id !== loadSeq) + return + + _readyState = 4 + _networkState = 1 + events.emit('loadeddata') + events.emit('canplay') + events.emit('canplaythrough') + } + catch (err) { + if (id !== loadSeq) + return + _error = { code: 4, message: err.message } + _networkState = 3 + events.emit('error') + console.error(err) + } + finally { + if (timer) + clearTimeout(timer) + } + })() + + if (timeoutPromise) { + try { + await Promise.race([loadTask, timeoutPromise]) + } + catch (err) { + if (id !== loadSeq) + return + loadSeq++ + _error = { code: 4, message: err.message } + _networkState = 3 + events.emit('error') + } + } + else { + await loadTask + } + } + + async function play() { + if (!_paused) + return + _ended = false + _paused = false + await audio.play() + video.start(audio) + events.emit('play') + events.emit('playing') + } + + function pause() { + if (_paused) + return + _paused = true + audio.pause() + video.stop() + events.emit('pause') + } + + async function seek(time) { + const shouldResume = !_paused + _ended = false + _seeking = true + events.emit('seeking') + events.emit('waiting') + pause() + await audio.seek(time) + await video.seek(time) + _seeking = false + events.emit('seeked') + if (shouldResume && !_ended) { + await play() + } + } + + function destroy() { + pause() + audio.destroy() + video.destroy() + } + + return { + load, + play, + pause, + seek, + destroy, + + setVolume: audio.setVolume, + setPlaybackRate(rate) { + audio.setPlaybackRate(rate) + video.setPlaybackRate(rate) + }, + + get currentTime() { + return audio.currentTime + }, + get duration() { + return audio.duration || video.duration + }, + get paused() { + return _paused + }, + get seeking() { + return _seeking + }, + get ended() { + return _ended + }, + get readyState() { + return _readyState + }, + get networkState() { + return _networkState + }, + get error() { + return _error + }, + get videoWidth() { + return video.width + }, + get videoHeight() { + return video.height + }, + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js new file mode 100644 index 000000000..2195c6456 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js @@ -0,0 +1,308 @@ +import { + ALL_FORMATS, + BlobSource, + CanvasSink, + Input, + ReadableStreamSource, + UrlSource, +} from 'mediabunny' + +export default function createVideoEngine({ + canvas, + ctx, + events, + timeupdateInterval = 250, + avSyncTolerance = 0.12, + dropLateFrames = false, + poster = '', + preflightRange = false, +}) { + let input = null + let videoSink = null + let videoIterator = null + + let nextFrame = null + let rafId = 0 + let asyncId = 0 + + let _width = 0 + let _height = 0 + let _duration = Number.NaN + + let audioClock = null + let lastTimeUpdate = 0 + let stalled = false + let playbackRate = 1 + let posterDrawn = false + + function normalizeSource(src) { + if (typeof src === 'string') + return new UrlSource(src) + if (src instanceof Blob) + return new BlobSource(src) + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) + return new ReadableStreamSource(src) + return src + } + + async function preflight(url) { + if (!preflightRange || typeof url !== 'string') + return true + try { + const res = await fetch(url, { method: 'HEAD' }) + const acceptRanges = res.headers.get('accept-ranges') + if (!acceptRanges || acceptRanges === 'none') { + events.emit('error', new Event('RangeNotSupported')) + return false + } + return true + } + catch (e) { + console.warn('preflight failed', e) + return true + } + } + + function drawPoster() { + if (!poster || posterDrawn) + return + const img = new Image() + img.onload = () => { + ctx.clearRect(0, 0, canvas.width, canvas.height) + canvas.width = img.naturalWidth || canvas.width + canvas.height = img.naturalHeight || canvas.height + ctx.drawImage(img, 0, 0, canvas.width, canvas.height) + posterDrawn = true + } + img.src = poster + } + + async function stopIterator() { + await videoIterator?.return() + videoIterator = null + } + + function clear() { + ctx.clearRect(0, 0, canvas.width, canvas.height) + } + + async function load(src, onMetadata) { + asyncId++ + const id = asyncId + + await stopIterator() + clear() + posterDrawn = false + + if (!(await preflight(src))) + return + + const source = normalizeSource(src) + if (!source) { + drawPoster() + return + } + + input = new Input({ + source, + formats: ALL_FORMATS, + }) + + _duration = await input.computeDuration() + if (id !== asyncId) + return + + const videoTrack = await input.getPrimaryVideoTrack() + if (!videoTrack) { + videoSink = null + _width = 0 + _height = 0 + canvas.width = 0 + canvas.height = 0 + drawPoster() + if (onMetadata) + onMetadata() + return + } + + if (videoTrack.codec === null || !(await videoTrack.canDecode())) { + videoSink = null + _width = 0 + _height = 0 + canvas.width = 0 + canvas.height = 0 + clear() + drawPoster() + if (onMetadata) + onMetadata() + return + } + + const transparent = await videoTrack.canBeTransparent() + videoSink = new CanvasSink(videoTrack, { + poolSize: 2, + fit: 'contain', + alpha: transparent, + }) + + _width = videoTrack.displayWidth + _height = videoTrack.displayHeight + + canvas.width = _width + canvas.height = _height + + if (onMetadata) + onMetadata() + + await resetIterator(0) + } + + async function resetIterator(time) { + await stopIterator() + + if (!videoSink) + return + + videoIterator = videoSink.canvases(time) + + const first = (await videoIterator.next()).value ?? null + const second = (await videoIterator.next()).value ?? null + + nextFrame = second + + if (first) { + ctx.drawImage(first.canvas, 0, 0) + events.emit('loadeddata') + } + else { + drawPoster() + } + } + + async function updateNextFrame(localId) { + if (!videoIterator) + return + + while (true) { + const frame = (await videoIterator.next()).value ?? null + if (!frame) + return + if (localId !== asyncId) + return + + const t = audioClock.currentTime + if (dropLateFrames) { + const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate)) + if (frame.timestamp < t - tolerance) { + continue + } + if (frame.timestamp <= t + tolerance) { + ctx.clearRect(0, 0, canvas.width, canvas.height) + ctx.drawImage(frame.canvas, 0, 0) + } + else { + nextFrame = frame + return + } + } + else { + if (frame.timestamp <= t) { + ctx.clearRect(0, 0, canvas.width, canvas.height) + ctx.drawImage(frame.canvas, 0, 0) + } + else { + nextFrame = frame + return + } + } + } + } + + function render() { + if (!audioClock) + return + + const t = audioClock.currentTime + const now = Date.now() + if (now - lastTimeUpdate >= timeupdateInterval) { + events.emit('timeupdate') + lastTimeUpdate = now + } + + if (Number.isFinite(_duration) && t >= _duration) { + stop() + events.emit('ended') + return + } + + if (nextFrame && nextFrame.timestamp <= t) { + ctx.clearRect(0, 0, canvas.width, canvas.height) + ctx.drawImage(nextFrame.canvas, 0, 0) + nextFrame = null + updateNextFrame(asyncId) + if (stalled) { + events.emit('canplay') + events.emit('playing') + stalled = false + } + } + else if (!nextFrame) { + updateNextFrame(asyncId) + if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) { + stalled = true + events.emit('waiting') + } + } + + rafId = requestAnimationFrame(render) + } + + function start(audioEngine) { + audioClock = audioEngine + asyncId++ + stalled = false + updateNextFrame(asyncId) + rafId = requestAnimationFrame(render) + } + + function stop() { + cancelAnimationFrame(rafId) + } + + async function seek(time) { + asyncId++ + await resetIterator(time) + } + + function setPlaybackRate(rate) { + playbackRate = Math.max(0.1, Number(rate) || 1) + } + + function destroy() { + asyncId++ + stop() + stopIterator() + posterDrawn = false + input = null + videoSink = null + } + + return { + load, + start, + stop, + seek, + setPlaybackRate, + destroy, + + get width() { + return _width + }, + get height() { + return _height + }, + get duration() { + return _duration + }, + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/index.js b/packages/artplayer-proxy-mediabunny/src/index.js new file mode 100644 index 000000000..b4f9936f2 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/index.js @@ -0,0 +1,11 @@ +import createCanvasProxy from './proxy/canvasProxy.js' + +export default function artplayerProxyMediabunny(option = {}) { + return (art) => { + return createCanvasProxy(art, option) + } +} + +if (typeof window !== 'undefined') { + window.artplayerProxyMediabunny = artplayerProxyMediabunny +} diff --git a/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js b/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js new file mode 100644 index 000000000..2ac7e9a92 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js @@ -0,0 +1,64 @@ +import createMediabunnyVideoShim from '../shim/mediabunnyVideoShim.js' + +export default function createCanvasProxy(art, option) { + const { constructor } = art + const { createElement } = constructor.utils + + const canvas = createElement('canvas') + const ctx = canvas.getContext('2d') + + const shim = createMediabunnyVideoShim({ + art, + canvas, + ctx, + option, + }) + + const originalCanvasMethods = {} + for (const prop in canvas) { + if (typeof canvas[prop] === 'function') { + originalCanvasMethods[prop] = canvas[prop].bind(canvas) + } + } + + for (const prop in shim) { + if (!(prop in canvas)) { + Object.defineProperty(canvas, prop, { + get() { + const value = shim[prop] + return typeof value === 'function' ? value.bind(shim) : value + }, + set(v) { + shim[prop] = v + }, + configurable: true, + enumerable: true, + }) + } + } + + for (const prop in originalCanvasMethods) { + canvas[prop] = (...args) => originalCanvasMethods[prop](...args) + } + + art.on('destroy', () => { + shim.destroy() + }) + + function resize() { + const player = art.template?.$player + if (!player || art.option.autoSize) + return + + Object.assign(canvas.style, { + width: '100%', + height: '100%', + objectFit: 'contain', + }) + } + + art.on('resize', resize) + art.on('video:loadedmetadata', resize) + + return canvas +} diff --git a/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js b/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js new file mode 100644 index 000000000..c15da711d --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js @@ -0,0 +1,278 @@ +import createMediabunnyEngine from '../engine/mediabunnyEngine.js' +import clamp from '../utils/clamp.js' +import { createVideoEventTarget } from './videoEvents.js' + +export default function createMediabunnyVideoShim({ art, canvas, ctx, option }) { + const events = createVideoEventTarget() + const engine = createMediabunnyEngine({ canvas, ctx, events, option }) + + let _src = null + let _volume = option.volume ?? 0.7 + let _muted = !!option.muted + let _playbackRate = 1 + + engine.setVolume(_volume, _muted) + + const { events: artEvents } = art.constructor.config + artEvents.forEach((name) => { + events.addEventListener(name, (e) => { + art.emit(`video:${e.type}`, e) + }) + }) + + const shim = { + addEventListener: events.addEventListener, + removeEventListener: events.removeEventListener, + + get src() { + return _src + }, + set src(v) { + _src = v + if (v) + engine.load(v) + }, + + get currentTime() { + return engine.currentTime + }, + set currentTime(t) { + engine.seek(Number(t) || 0) + }, + + get duration() { + return engine.duration + }, + + get buffered() { + const duration = engine.duration + if (!duration || Number.isNaN(duration)) { + return { + length: 0, + start: () => 0, + end: () => 0, + } + } + return { + length: 1, + start: () => 0, + end: () => duration, + } + }, + + get played() { + const duration = engine.duration + const currentTime = engine.currentTime + if (!duration || Number.isNaN(duration) || currentTime <= 0) { + return { + length: 0, + start: () => 0, + end: () => 0, + } + } + return { + length: 1, + start: () => 0, + end: () => currentTime, + } + }, + + get paused() { + return engine.paused + }, + get playing() { + return !engine.paused && !engine.ended + }, + get ended() { + return engine.ended + }, + + get readyState() { + return engine.readyState + }, + + get networkState() { + return engine.networkState + }, + + get error() { + return engine.error + }, + + get seeking() { + return engine.seeking + }, + + get seekable() { + const duration = engine.duration + if (!duration || Number.isNaN(duration)) { + return { + length: 0, + start: () => 0, + end: () => 0, + } + } + return { + length: 1, + start: () => 0, + end: () => duration, + } + }, + + get playbackRate() { + return _playbackRate + }, + set playbackRate(v) { + const rate = Number(v) + if (Number.isNaN(rate) || rate <= 0) + return + _playbackRate = rate + engine.setPlaybackRate(rate) + events.emit('ratechange') + }, + + get volume() { + return _volume + }, + set volume(v) { + _volume = clamp(v, 0, 1) + _muted = false + engine.setVolume(_volume, _muted) + events.emit('volumechange') + }, + + get muted() { + return _muted + }, + set muted(v) { + _muted = !!v + engine.setVolume(_volume, _muted) + events.emit('volumechange') + }, + + play() { + return engine.play() + }, + pause() { + engine.pause() + }, + load() { + if (_src) + engine.load(_src) + }, + + destroy() { + engine.destroy() + }, + + get videoWidth() { + return engine.videoWidth + }, + get videoHeight() { + return engine.videoHeight + }, + + get playsInline() { + return true + }, + set playsInline(v) {}, + + get autoplay() { + return option.autoplay || false + }, + set autoplay(v) {}, + + get loop() { + return option.loop || false + }, + set loop(v) {}, + + get controls() { + return false + }, + set controls(v) {}, + + get crossOrigin() { + return option.crossOrigin || '' + }, + set crossOrigin(v) {}, + + get currentSrc() { + return _src + }, + + get poster() { + return option.poster || '' + }, + set poster(v) { + option.poster = v + }, + + get preload() { + return 'auto' + }, + set preload(v) {}, + + get defaultMuted() { + return false + }, + set defaultMuted(v) {}, + + get defaultPlaybackRate() { + return 1 + }, + set defaultPlaybackRate(v) {}, + + canPlayType(_type) { + return 'maybe' + }, + + getBoundingClientRect() { + return canvas.getBoundingClientRect() + }, + + requestVideoFrameCallback(callback) { + const id = requestAnimationFrame((time) => { + callback(time, { + presentationTime: engine.currentTime, + expectedDisplayTime: time + 16.6, + width: engine.videoWidth, + height: engine.videoHeight, + mediaTime: engine.currentTime, + presentedFrames: 0, + processingDuration: 0, + captureTime: time, + receiveTime: time, + rtpTimestamp: 0, + }) + }) + return id + }, + + cancelVideoFrameCallback(id) { + cancelAnimationFrame(id) + }, + + setAttribute(name, value) { + if (name === 'src') + this.src = value + else if (name === 'autoplay') + this.autoplay = value + else if (name === 'loop') + this.loop = value + else if (name === 'muted') + this.muted = true + else + canvas.setAttribute(name, value) + }, + } + + if (option.source) { + shim.src = option.source + } + else if (art.option?.url) { + shim.src = art.option.url + } + + return shim +} diff --git a/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js b/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js new file mode 100644 index 000000000..07f094020 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js @@ -0,0 +1,28 @@ +export function createVideoEventTarget() { + const listeners = new Map() + + function addEventListener(type, fn) { + if (!listeners.has(type)) + listeners.set(type, []) + listeners.get(type).push(fn) + } + + function removeEventListener(type, fn) { + const list = listeners.get(type) + if (!list) + return + const i = list.indexOf(fn) + if (i >= 0) + list.splice(i, 1) + } + + function emit(type, detail) { + const evt = new Event(type) + evt.detail = detail + const list = listeners.get(type) + if (list) + list.forEach(fn => fn(evt)) + } + + return { addEventListener, removeEventListener, emit } +} diff --git a/packages/artplayer-proxy-mediabunny/src/utils/clamp.js b/packages/artplayer-proxy-mediabunny/src/utils/clamp.js new file mode 100644 index 000000000..77a79f7e2 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/utils/clamp.js @@ -0,0 +1,3 @@ +export default function clamp(v, min, max) { + return Math.max(min, Math.min(max, Number(v) || 0)) +} diff --git a/packages/artplayer-proxy-mediabunny/src/utils/sleep.js b/packages/artplayer-proxy-mediabunny/src/utils/sleep.js new file mode 100644 index 000000000..1644c9ae9 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/utils/sleep.js @@ -0,0 +1,5 @@ +export default function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms) + }) +} \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts b/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts new file mode 100644 index 000000000..5e3900cb3 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts @@ -0,0 +1,18 @@ +import type Artplayer from 'artplayer' + +type Option = { + eventDelay?: number + loadTimeout?: number + timeupdateInterval?: number + avSyncTolerance?: number + dropLateFrames?: boolean + poster?: string + source?: string | Blob | ReadableStream + preflightRange?: boolean +} + +type Result = HTMLCanvasElement + +declare const artplayerProxyMediabunny: (option?: Option) => (art: Artplayer) => Result + +export default artplayerProxyMediabunny diff --git a/packages/artplayer/dist/artplayer.js b/packages/artplayer/dist/artplayer.js index 05a73eb3a..6f987d28f 100644 --- a/packages/artplayer/dist/artplayer.js +++ b/packages/artplayer/dist/artplayer.js @@ -5,4 +5,4 @@ * (c) 2017-2025 Harvey Zack * Released under the MIT License. */ -!function(e,t,r,a,o,i,n,s){var l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},c="function"==typeof l[a]&&l[a],p=c.i||{},u=c.cache||{},d="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function f(t,r){if(!u[t]){if(!e[t]){if(o[t])return o[t];var i="function"==typeof l[a]&&l[a];if(!r&&i)return i(t,!0);if(c)return c(t,!0);if(d&&"string"==typeof t)return d(t);var n=Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}p.resolve=function(r){var a=e[t][1][r];return null!=a?a:r},p.cache={};var s=u[t]=new f.Module(t);e[t][0].call(s.exports,p,s,s.exports,l)}return u[t].exports;function p(e){var t=p.resolve(e);return!1===t?{}:f(t)}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.require=d,this.exports={}},f.modules=e,f.cache=u,f.parent=c,f.distDir=void 0,f.publicUrl=void 0,f.devServer=void 0,f.i=p,f.register=function(t,r){e[t]=[function(e,t){t.exports=r},{}]},Object.defineProperty(f,"root",{get:function(){return l[a]}}),l[a]=f;for(var h=0;ht.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return u.default}static get utils(){return Z}static get scheme(){return z.default}static get Emitter(){return X.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Z.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Z.isBrowser&&(window.Artplayer=Q,Z.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"1thAY","option-validator":"iscjH","../package.json":"7z0bJ","./config":"icOIG","./contextmenu":"669K4","./control":"g00bY","./events":"hEROU","./hotkey":"2ac95","./i18n":"3G1Oj","./icons":"ddm2l","./info":"bAZEJ","./layer":"2RWc0","./loading":"i4KU0","./mask":"02CNZ","./notice":"eVoav","./player":"cZepx","./plugins":"5A1j1","./scheme":"3maHy","./setting":"4IYMA","./storage":"9Ulkg","./subtitle":"4gOJp","./template":"haag7","./utils":"3eYxa","./utils/emitter":"hyN0U","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1thAY":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],iscjH:[function(e,t,r,a){t.exports=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],icOIG:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"669K4":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),u=o.interopDefault(p),d=e("./flip"),f=o.interopDefault(d),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,u.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:u}=(0,i.getRect)(a),d=t-l,f=o-c;t+u>l+s&&(d=s-u),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${d}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"3eYxa","../utils/component":"1lUmE","./aspectRatio":"cLwhW","./close":"1OdE3","./flip":"gTbXH","./info":"51BMv","./playbackRate":"hzsOn","./version":"gsm66","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3eYxa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var u=e("./subtitle");o.exportAll(u,r);var d=e("./time");o.exportAll(d,r)},{"./compatibility":"kugJP","./dom":"4w3SA","./error":"iu2jQ","./file":"iE5c3","./format":"6uKmQ","./property":"13VsI","./subtitle":"bhlxy","./time":"2xmIQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kugJP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4w3SA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>u),o.export(r,"remove",()=>d),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>k),o.export(r,"getIcon",()=>j),o.export(r,"setStyleText",()=>S),o.export(r,"supportsFlex",()=>$),o.export(r,"getRect",()=>E),o.export(r,"loadImg",()=>I),o.export(r,"getComposedPath",()=>M);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function u(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function d(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return M(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function k(e){return document.createElement(e)}function j(e="",t=""){let r=k("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),u(r,t),r}function S(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function $(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function E(e){return e.getBoundingClientRect()}function I(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function M(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"kugJP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iu2jQ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iE5c3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6uKmQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"13VsI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bhlxy:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2xmIQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1lUmE":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`,a=this.cache.get(r);(0,c.errorHandle)(!a,`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let o=(0,l.createElement)("div");(0,l.addClass)(o,`art-${this.name}`),(0,l.addClass)(o,`art-${this.name}-${r}`);let i=Array.from(this.$parent.children);o.dataset.index=t.index||this.id;let p=i.find(e=>Number(e.dataset.index)>=Number(o.dataset.index));p?p.insertAdjacentElement("beforebegin",o):(0,l.append)(this.$parent,o),t.html&&(0,l.append)(o,t.html),t.style&&(0,l.setStyles)(o,t.style),t.tooltip&&(0,l.tooltip)(o,t.tooltip);let u=[];if(t.click){let e=this.art.events.proxy(o,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});u.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,o,u),this[r]=o,this.cache.set(r,{$ref:o,events:u,option:t}),t.mounted&&t.mounted.call(this.art,o),o}remove(e){let t=this.cache.get(e);(0,c.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;ef);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",u="function";function d(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:d,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${u}`,mounted:`?${u}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${u}`,switch:`?${s}`,onSwitch:`?${u}`,range:`?${n}`,onRange:`?${u}`,onChange:`?${u}`};r.default={id:l,container:d,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${u}`,plugins:[u],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:u},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cLwhW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1OdE3":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gTbXH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"51BMv":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hzsOn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gsm66:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"7z0bJ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g00bY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),u=o.interopDefault(p),d=e("./fullscreenWeb"),f=o.interopDefault(d),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),k=e("./setting"),j=o.interopDefault(k),S=e("./time"),$=o.interopDefault(S),E=e("./volume"),I=o.interopDefault(E);class M extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,I.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,$.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,j.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,u.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=M},{"../utils":"3eYxa","../utils/component":"1lUmE","./airplay":"8gGQa","./fullscreen":"kgZrr","./fullscreenWeb":"9vue2","./pip":"6OjmD","./playAndPause":"g667z","./progress":"iO48g","./screenshot":"958YD","./setting":"i57Di","./time":"6lVHn","./volume":"f1tg5","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8gGQa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kgZrr:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9vue2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6OjmD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g667z:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iO48g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
      `,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),u=(0,i.query)(".art-progress-loaded",e),d=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(u,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(d,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"958YD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i57Di:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6lVHn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
      '),l=(0,i.append)(s,'
      '),c=(0,i.append)(l,'
      '),p=(0,i.append)(l,'
      '),u=(0,i.append)(p,'
      '),d=(0,i.append)(u,'
      '),f=(0,i.append)(p,'
      ');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(d,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(d,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hEROU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),u=e("./hoverInit"),d=o.interopDefault(u),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,d.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){let t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;en);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d9Euh:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,u=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},d=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),u=[3,4].includes(s),d=[1,2].includes(s);if(u&&!e.isRotate||d&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),u=(0,n.clamp)((i-c)/e.height,-1,1),d=e.isRotate?u:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*d*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,u(e)}),t.proxy(r,"touchmove",d)),t.proxy(a,"touchstart",e=>{o=a,u(e)}),t.proxy(a,"touchmove",d),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"iO48g","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cipTv:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jVOGW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1adf7":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3uT2Y":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5vCth":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haLBA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2ac95":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"6dCIe","bundle-text:./arrow-left.svg":"3WFkX","bundle-text:./arrow-right.svg":"lLrP4","bundle-text:./aspect-ratio.svg":"vMweg","bundle-text:./check.svg":"cD1ql","bundle-text:./close.svg":"cVNEq","bundle-text:./config.svg":"7bynv","bundle-text:./error.svg":"5o4dY","bundle-text:./flip.svg":"ltsUt","bundle-text:./fullscreen-off.svg":"1lbXp","bundle-text:./fullscreen-on.svg":"9yJsq","bundle-text:./fullscreen-web-off.svg":"jvyKo","bundle-text:./fullscreen-web-on.svg":"02A58","bundle-text:./loading.svg":"dceB1","bundle-text:./lock.svg":"eJSju","bundle-text:./pause.svg":"jgrId","bundle-text:./pip.svg":"fIFkZ","bundle-text:./play.svg":"4D7Yh","bundle-text:./playback-rate.svg":"e0Gnx","bundle-text:./screenshot.svg":"diXWF","bundle-text:./setting.svg":"8BcoA","bundle-text:./state.svg":"bQPWd","bundle-text:./switch-off.svg":"cvlWN","bundle-text:./switch-on.svg":"hTk01","bundle-text:./unlock.svg":"iwSR9","bundle-text:./volume-close.svg":"kqCDd","bundle-text:./volume.svg":"jABrY","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6dCIe":[function(e,t,r,a){t.exports=''},{}],"3WFkX":[function(e,t,r,a){t.exports=''},{}],lLrP4:[function(e,t,r,a){t.exports=''},{}],vMweg:[function(e,t,r,a){t.exports=''},{}],cD1ql:[function(e,t,r,a){t.exports=''},{}],cVNEq:[function(e,t,r,a){t.exports=''},{}],"7bynv":[function(e,t,r,a){t.exports=''},{}],"5o4dY":[function(e,t,r,a){t.exports=''},{}],ltsUt:[function(e,t,r,a){t.exports=''},{}],"1lbXp":[function(e,t,r,a){t.exports=''},{}],"9yJsq":[function(e,t,r,a){t.exports=''},{}],jvyKo:[function(e,t,r,a){t.exports=''},{}],"02A58":[function(e,t,r,a){t.exports=''},{}],dceB1:[function(e,t,r,a){t.exports=''},{}],eJSju:[function(e,t,r,a){t.exports=''},{}],jgrId:[function(e,t,r,a){t.exports=''},{}],fIFkZ:[function(e,t,r,a){t.exports=''},{}],"4D7Yh":[function(e,t,r,a){t.exports=''},{}],e0Gnx:[function(e,t,r,a){t.exports=''},{}],diXWF:[function(e,t,r,a){t.exports=''},{}],"8BcoA":[function(e,t,r,a){t.exports=''},{}],bQPWd:[function(e,t,r,a){t.exports=''},{}],cvlWN:[function(e,t,r,a){t.exports=''},{}],hTk01:[function(e,t,r,a){t.exports=''},{}],iwSR9:[function(e,t,r,a){t.exports=''},{}],kqCDd:[function(e,t,r,a){t.exports=''},{}],jABrY:[function(e,t,r,a){t.exports=''},{}],bAZEJ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eVoav:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cZepx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),u=e("./autoHeightMix"),d=o.interopDefault(u),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),k=o.interopDefault(w),j=e("./flipMix"),S=o.interopDefault(j),$=e("./fullscreenMix"),E=o.interopDefault($),I=e("./fullscreenWebMix"),M=o.interopDefault(I),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),D=o.interopDefault(F),A=e("./optionInit"),R=o.interopDefault(A),O=e("./pauseMix"),L=o.interopDefault(O),P=e("./pipMix"),Y=o.interopDefault(P),z=e("./playbackRateMix"),_=o.interopDefault(z),H=e("./playedMix"),V=o.interopDefault(H),q=e("./playingMix"),N=o.interopDefault(q),B=e("./playMix"),W=o.interopDefault(B),U=e("./posterMix"),Z=o.interopDefault(U),K=e("./qualityMix"),X=o.interopDefault(K),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),eu=e("./thumbnailsMix"),ed=o.interopDefault(eu),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,L.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,_.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,E.default)(e),(0,M.default)(e),(0,Y.default)(e),(0,C.default)(e),(0,V.default)(e),(0,N.default)(e),(0,h.default)(e),(0,J.default)(e),(0,S.default)(e),(0,D.default)(e),(0,Z.default)(e),(0,d.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,X.default)(e),(0,ed.default)(e),(0,k.default)(e),(0,R.default)(e)}}},{"./airplayMix":"9kvpK","./aspectRatioMix":"f2B8U","./attrMix":"h2lAp","./autoHeightMix":"lxRiE","./autoSizeMix":"k2ukN","./cssVarMix":"c5XqS","./currentTimeMix":"k4e77","./durationMix":"aK1ks","./eventInit":"eodDF","./flipMix":"lcMdX","./fullscreenMix":"6EjsX","./fullscreenWebMix":"4l4zQ","./loadedMix":"gzJMP","./miniMix":"gELHU","./optionInit":"gy71D","./pauseMix":"hoc9H","./pipMix":"4t2vt","./playbackRateMix":"7hqKi","./playedMix":"cK23B","./playingMix":"2Ndus","./playMix":"6o5f2","./posterMix":"1wbXO","./qualityMix":"1ZLJg","./rectMix":"3g2fj","./screenshotMix":"1stNp","./seekMix":"iSBF1","./stateMix":"9v9Z8","./subtitleOffsetMix":"cTVJT","./switchMix":"gms5Y","./themeMix":"aS33X","./thumbnailsMix":"gC24t","./toggleMix":"bAxW2","./typeMix":"dtsPx","./urlMix":"loZvu","./volumeMix":"4DF3Z","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9kvpK":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],f2B8U:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h2lAp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lxRiE:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k2ukN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c5XqS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k4e77:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aK1ks:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eodDF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,u=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{u=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{u{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"icOIG","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lcMdX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6EjsX":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"924dl","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"924dl":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4l4zQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gzJMP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gELHU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function u(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function d(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let d=(0,i.append)(o,'
      ');(0,i.append)(d,t.close),r(d,"click",p);let f=(0,i.append)(o,'
      '),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),u(h,m),e.on("video:playing",()=>u(h,m)),e.on("video:pause",()=>u(h,m)),e.on("video:timeupdate",()=>u(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gy71D:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hoc9H:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4t2vt":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7hqKi":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cK23B:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2Ndus":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6o5f2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1ZLJg":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3g2fj":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1stNp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iSBF1:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9v9Z8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return;let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="",e.once("video:error",o),e.once("video:loadedmetadata",()=>{e.currentTime=r}),e.once("video:canplay",async()=>{e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()})})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aS33X:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gC24t:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,u,d)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&d&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*u;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bAxW2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dtsPx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],loZvu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4DF3Z":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5A1j1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),u=o.interopDefault(p),d=e("./lock"),f=o.interopDefault(d),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(u.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"3eYxa","./autoOrientation":"fbMFj","./autoPlayback":"7w0fA","./fastForward":"3XpBs","./lock":"e4KRZ","./miniProgressBar":"jcqjF","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fbMFj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7w0fA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
      `}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),u=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(u,r.close);let d=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(d),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(u,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{d=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3XpBs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],e4KRZ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jcqjF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4IYMA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),u=o.interopDefault(p),d=e("./playbackRate"),f=o.interopDefault(d),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,u.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),u=s-c+l/2-n/2,d=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${d}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;u+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${u}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t
    '),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
    '),u=(0,i.append)(c,'
    '),d=(0,i.createElement)("div");switch((0,i.addClass)(d,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(d,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(d,e.icon||n.config):(0,i.append)(d,n.check)}(0,i.append)(p,d),(0,i.def)(e,"$icon",{configurable:!0,get:()=>d}),(0,i.def)(e,"icon",{configurable:!0,get:()=>d.innerHTML,set(e){d.innerHTML="",(0,i.append)(d,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(u,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(u,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(u,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(u,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bifrn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fXLq3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"50CCd":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9Ulkg":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4gOJp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),u=o.interopDefault(p);class d extends u.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
    ${e.escape?(0,c.escape)(t):t}
    `).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=d},{"option-validator":"iscjH","./scheme":"3maHy","./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haag7:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
    Player version:
    ${o.version}
    Video url:
    Video volume:
    Video time:
    Video duration:
    Video resolution:
    x
    [x]
    `}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"7z0bJ","./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hyN0U:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;et.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Z}static get scheme(){return z.default}static get Emitter(){return X.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Z.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Z.isBrowser&&(window.Artplayer=Q,Z.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"1thAY","option-validator":"iscjH","../package.json":"7z0bJ","./config":"icOIG","./contextmenu":"669K4","./control":"g00bY","./events":"hEROU","./hotkey":"2ac95","./i18n":"3G1Oj","./icons":"ddm2l","./info":"bAZEJ","./layer":"2RWc0","./loading":"i4KU0","./mask":"02CNZ","./notice":"eVoav","./player":"cZepx","./plugins":"5A1j1","./scheme":"3maHy","./setting":"4IYMA","./storage":"9Ulkg","./subtitle":"4gOJp","./template":"haag7","./utils":"3eYxa","./utils/emitter":"hyN0U","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1thAY":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],iscjH:[function(e,t,r,a){t.exports=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],icOIG:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"669K4":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"3eYxa","../utils/component":"1lUmE","./aspectRatio":"cLwhW","./close":"1OdE3","./flip":"gTbXH","./info":"51BMv","./playbackRate":"hzsOn","./version":"gsm66","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3eYxa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"kugJP","./dom":"4w3SA","./error":"iu2jQ","./file":"iE5c3","./format":"6uKmQ","./property":"13VsI","./subtitle":"bhlxy","./time":"2xmIQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kugJP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4w3SA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>k),o.export(r,"getIcon",()=>j),o.export(r,"setStyleText",()=>S),o.export(r,"supportsFlex",()=>$),o.export(r,"getRect",()=>E),o.export(r,"loadImg",()=>I),o.export(r,"getComposedPath",()=>M);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return M(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function k(e){return document.createElement(e)}function j(e="",t=""){let r=k("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function S(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function $(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function E(e){return e.getBoundingClientRect()}function I(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function M(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"kugJP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iu2jQ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iE5c3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6uKmQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"13VsI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bhlxy:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2xmIQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1lUmE":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`;(0,c.errorHandle)(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let a=(0,l.createElement)("div");(0,l.addClass)(a,`art-${this.name}`),(0,l.addClass)(a,`art-${this.name}-${r}`);let o=Array.from(this.$parent.children);a.dataset.index=t.index||this.id;let i=o.find(e=>Number(e.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement("beforebegin",a):(0,l.append)(this.$parent,a),t.html&&(0,l.append)(a,t.html),t.style&&(0,l.setStyles)(a,t.style),t.tooltip&&(0,l.tooltip)(a,t.tooltip);let p=[];if(t.click){let e=this.art.events.proxy(a,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});p.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,a,p),this[r]=a,this.cache.set(r,{$ref:a,events:p,option:t}),t.mounted&&t.mounted.call(this.art,a),a}remove(e){(0,c.errorHandle)(this.cache.has(e),`Can't find [${e}] from the [${this.name}]`);let t=this.cache.get(e);for(let e of(t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref),t.events))this.art.events.remove(e);this.cache.delete(e),delete this[e],(0,l.remove)(t.$ref)}update(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}},{"option-validator":"iscjH","../scheme":"3maHy","./dom":"4w3SA","./error":"iu2jQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3maHy":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",()=>f);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cLwhW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1OdE3":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gTbXH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"51BMv":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hzsOn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gsm66:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"7z0bJ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g00bY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),k=e("./setting"),j=o.interopDefault(k),S=e("./time"),$=o.interopDefault(S),E=e("./volume"),I=o.interopDefault(E);class M extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,I.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,$.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,j.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=M},{"../utils":"3eYxa","../utils/component":"1lUmE","./airplay":"8gGQa","./fullscreen":"kgZrr","./fullscreenWeb":"9vue2","./pip":"6OjmD","./playAndPause":"g667z","./progress":"iO48g","./screenshot":"958YD","./setting":"i57Di","./time":"6lVHn","./volume":"f1tg5","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8gGQa":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],kgZrr:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9vue2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6OjmD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],g667z:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iO48g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
    `,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"958YD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i57Di:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6lVHn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
    '),l=(0,i.append)(s,'
    '),c=(0,i.append)(l,'
    '),p=(0,i.append)(l,'
    '),d=(0,i.append)(p,'
    '),u=(0,i.append)(d,'
    '),f=(0,i.append)(p,'
    ');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hEROU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.add(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}destroy(){for(let e of this.destroyEvents)try{e()}catch(e){console.warn("Failed to destroy event listener:",e)}this.destroyEvents.clear()}}},{"./clickInit":"at3u2","./gestureInit":"d9Euh","./globalInit":"cipTv","./hoverInit":"jVOGW","./moveInit":"1adf7","./resizeInit":"3uT2Y","./updateInit":"5vCth","./viewInit":"haLBA","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],at3u2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d9Euh:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"iO48g","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cipTv:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jVOGW:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1adf7":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3uT2Y":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5vCth":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haLBA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2ac95":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"6dCIe","bundle-text:./arrow-left.svg":"3WFkX","bundle-text:./arrow-right.svg":"lLrP4","bundle-text:./aspect-ratio.svg":"vMweg","bundle-text:./check.svg":"cD1ql","bundle-text:./close.svg":"cVNEq","bundle-text:./config.svg":"7bynv","bundle-text:./error.svg":"5o4dY","bundle-text:./flip.svg":"ltsUt","bundle-text:./fullscreen-off.svg":"1lbXp","bundle-text:./fullscreen-on.svg":"9yJsq","bundle-text:./fullscreen-web-off.svg":"jvyKo","bundle-text:./fullscreen-web-on.svg":"02A58","bundle-text:./loading.svg":"dceB1","bundle-text:./lock.svg":"eJSju","bundle-text:./pause.svg":"jgrId","bundle-text:./pip.svg":"fIFkZ","bundle-text:./play.svg":"4D7Yh","bundle-text:./playback-rate.svg":"e0Gnx","bundle-text:./screenshot.svg":"diXWF","bundle-text:./setting.svg":"8BcoA","bundle-text:./state.svg":"bQPWd","bundle-text:./switch-off.svg":"cvlWN","bundle-text:./switch-on.svg":"hTk01","bundle-text:./unlock.svg":"iwSR9","bundle-text:./volume-close.svg":"kqCDd","bundle-text:./volume.svg":"jABrY","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6dCIe":[function(e,t,r,a){t.exports=''},{}],"3WFkX":[function(e,t,r,a){t.exports=''},{}],lLrP4:[function(e,t,r,a){t.exports=''},{}],vMweg:[function(e,t,r,a){t.exports=''},{}],cD1ql:[function(e,t,r,a){t.exports=''},{}],cVNEq:[function(e,t,r,a){t.exports=''},{}],"7bynv":[function(e,t,r,a){t.exports=''},{}],"5o4dY":[function(e,t,r,a){t.exports=''},{}],ltsUt:[function(e,t,r,a){t.exports=''},{}],"1lbXp":[function(e,t,r,a){t.exports=''},{}],"9yJsq":[function(e,t,r,a){t.exports=''},{}],jvyKo:[function(e,t,r,a){t.exports=''},{}],"02A58":[function(e,t,r,a){t.exports=''},{}],dceB1:[function(e,t,r,a){t.exports=''},{}],eJSju:[function(e,t,r,a){t.exports=''},{}],jgrId:[function(e,t,r,a){t.exports=''},{}],fIFkZ:[function(e,t,r,a){t.exports=''},{}],"4D7Yh":[function(e,t,r,a){t.exports=''},{}],e0Gnx:[function(e,t,r,a){t.exports=''},{}],diXWF:[function(e,t,r,a){t.exports=''},{}],"8BcoA":[function(e,t,r,a){t.exports=''},{}],bQPWd:[function(e,t,r,a){t.exports=''},{}],cvlWN:[function(e,t,r,a){t.exports=''},{}],hTk01:[function(e,t,r,a){t.exports=''},{}],iwSR9:[function(e,t,r,a){t.exports=''},{}],kqCDd:[function(e,t,r,a){t.exports=''},{}],jABrY:[function(e,t,r,a){t.exports=''},{}],bAZEJ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eVoav:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null,e.on("destroy",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cZepx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),k=o.interopDefault(w),j=e("./flipMix"),S=o.interopDefault(j),$=e("./fullscreenMix"),E=o.interopDefault($),I=e("./fullscreenWebMix"),M=o.interopDefault(I),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),D=o.interopDefault(F),A=e("./optionInit"),R=o.interopDefault(A),O=e("./pauseMix"),L=o.interopDefault(O),P=e("./pipMix"),Y=o.interopDefault(P),z=e("./playbackRateMix"),_=o.interopDefault(z),H=e("./playedMix"),V=o.interopDefault(H),q=e("./playingMix"),N=o.interopDefault(q),B=e("./playMix"),W=o.interopDefault(B),U=e("./posterMix"),Z=o.interopDefault(U),K=e("./qualityMix"),X=o.interopDefault(K),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,L.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,_.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,E.default)(e),(0,M.default)(e),(0,Y.default)(e),(0,C.default)(e),(0,V.default)(e),(0,N.default)(e),(0,h.default)(e),(0,J.default)(e),(0,S.default)(e),(0,D.default)(e),(0,Z.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,X.default)(e),(0,eu.default)(e),(0,k.default)(e),(0,R.default)(e)}}},{"./airplayMix":"9kvpK","./aspectRatioMix":"f2B8U","./attrMix":"h2lAp","./autoHeightMix":"lxRiE","./autoSizeMix":"k2ukN","./cssVarMix":"c5XqS","./currentTimeMix":"k4e77","./durationMix":"aK1ks","./eventInit":"eodDF","./flipMix":"lcMdX","./fullscreenMix":"6EjsX","./fullscreenWebMix":"4l4zQ","./loadedMix":"gzJMP","./miniMix":"gELHU","./optionInit":"gy71D","./pauseMix":"hoc9H","./pipMix":"4t2vt","./playbackRateMix":"7hqKi","./playedMix":"cK23B","./playingMix":"2Ndus","./playMix":"6o5f2","./posterMix":"1wbXO","./qualityMix":"1ZLJg","./rectMix":"3g2fj","./screenshotMix":"1stNp","./seekMix":"iSBF1","./stateMix":"9v9Z8","./subtitleOffsetMix":"cTVJT","./switchMix":"gms5Y","./themeMix":"aS33X","./thumbnailsMix":"gC24t","./toggleMix":"bAxW2","./typeMix":"dtsPx","./urlMix":"loZvu","./volumeMix":"4DF3Z","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9kvpK":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],f2B8U:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h2lAp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lxRiE:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k2ukN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c5XqS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],k4e77:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aK1ks:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eodDF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"icOIG","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lcMdX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6EjsX":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"924dl","../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"924dl":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4l4zQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gzJMP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gELHU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
    ');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
    '),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gy71D:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hoc9H:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4t2vt":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7hqKi":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cK23B:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2Ndus":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6o5f2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1ZLJg":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3g2fj":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"1stNp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],iSBF1:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9v9Z8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return void a();let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="";let l={};l.error=t=>{e.off("video:canplay",l.canplay),e.off("video:loadedmetadata",l.metadata),o(t)},l.metadata=()=>{e.currentTime=r},l.canplay=async()=>{e.off("video:error",l.error),e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()},e.once("video:error",l.error),e.once("video:loadedmetadata",l.metadata),e.once("video:canplay",l.canplay)})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aS33X:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],gC24t:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bAxW2:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dtsPx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],loZvu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4DF3Z":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5A1j1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"3eYxa","./autoOrientation":"fbMFj","./autoPlayback":"7w0fA","./fastForward":"3XpBs","./lock":"e4KRZ","./miniProgressBar":"jcqjF","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fbMFj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"7w0fA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
    `}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3XpBs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],e4KRZ:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],jcqjF:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4IYMA":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t
    '),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
    '),d=(0,i.append)(c,'
    '),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bifrn:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fXLq3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"50CCd":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"9Ulkg":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"4gOJp":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
    ${e.escape?(0,c.escape)(t):t}
    `).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"iscjH","./scheme":"3maHy","./utils":"3eYxa","./utils/component":"1lUmE","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],haag7:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
    Player version:
    ${o.version}
    Video url:
    Video volume:
    Video time:
    Video duration:
    Video resolution:
    x
    [x]
    `}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"7z0bJ","./utils":"3eYxa","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hyN0U:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;e").concat(e))};i("Version@".concat(t.version));for(var c=0;c0)||void 0===arguments[0]||arguments[0];t.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),er.splice(er.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}],[{key:"instances",get:function(){return er}},{key:"version",get:function(){return d.version}},{key:"config",get:function(){return m.default}},{key:"utils",get:function(){return K}},{key:"scheme",get:function(){return V.default}},{key:"Emitter",get:function(){return ee.default}},{key:"validator",get:function(){return f.default}},{key:"kindOf",get:function(){return f.default.kindOf}},{key:"html",get:function(){return Z.default.html}},{key:"option",get:function(){var e;return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:function(e){return e}},moreVideoAttr:{controls:!1,preload:K.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==(e=navigator)?void 0:e.language.toLowerCase()}}}]),t}(ee.default);en.STYLE=u.default,en.DEBUG=!1,en.CONTEXTMENU=!0,en.NOTICE_TIME=2e3,en.SETTING_WIDTH=250,en.SETTING_ITEM_WIDTH=200,en.SETTING_ITEM_HEIGHT=35,en.RESIZE_TIME=200,en.SCROLL_TIME=200,en.SCROLL_GAP=50,en.AUTO_PLAYBACK_MAX=10,en.AUTO_PLAYBACK_MIN=5,en.AUTO_PLAYBACK_TIMEOUT=3e3,en.RECONNECT_TIME_MAX=5,en.RECONNECT_SLEEP_TIME=1e3,en.CONTROL_HIDE_TIME=3e3,en.DBCLICK_TIME=300,en.DBCLICK_FULLSCREEN=!0,en.MOBILE_DBCLICK_PLAY=!0,en.MOBILE_CLICK_PLAY=!1,en.AUTO_ORIENTATION_TIME=200,en.INFO_LOOP_TIME=1e3,en.FAST_FORWARD_VALUE=3,en.FAST_FORWARD_TIME=1e3,en.TOUCH_MOVE_RATIO=.5,en.VOLUME_STEP=.1,en.SEEK_STEP=5,en.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],en.ASPECT_RATIO=["default","4:3","16:9"],en.FLIP=["normal","horizontal","vertical"],en.FULLSCREEN_WEB_IN_BODY=!0,en.LOG_VERSION=!0,en.USE_RAF=!1,en.REMOVE_SRC_WHEN_DESTROY=!0,K.isBrowser&&(window.Artplayer=en,K.setStyleText("artplayer-style",u.default),setTimeout(function(){en.LOG_VERSION&&console.log("%c ArtPlayer %c ".concat(en.version," %c https://artplayer.org"),"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","bundle-text:./style/index.less":"A7TwB","option-validator":"8zKz5","../package.json":"2Jf7W","./config":"3vlyb","./contextmenu":"46D5s","./control":"9MunV","./events":"kSrJ9","./hotkey":"fSjZi","./i18n":"5q3H4","./icons":"lkjMg","./info":"9sVMb","./layer":"dsBH4","./loading":"hLYDH","./mask":"5YaCM","./notice":"6kSNS","./player":"gJ9uy","./plugins":"83Crr","./scheme":"3Srhh","./setting":"4ARoj","./storage":"a5A5h","./subtitle":"kEcFl","./template":"jkHHJ","./utils":"hQMLb","./utils/emitter":"ikoiH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],clpdF:[function(e,t,r,n){"use strict";var o=e("feddc910f69a01a6"),a=e("b644f6b72647b399"),s=e("ba991daace2b8ed9");r._=function(e,t,r){return t=o._(t),s._(e,a._()?Reflect.construct(t,r||[],o._(e).constructor):t.apply(e,r))}},{feddc910f69a01a6:"NOGHw",b644f6b72647b399:"83nDe",ba991daace2b8ed9:"hd12h"}],NOGHw:[function(e,t,r,n){"use strict";function o(e){return r._=o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}r._=o},{}],"83nDe":[function(e,t,r,n){"use strict";function o(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r._=o=function(){return!!e})()}r._=o},{}],hd12h:[function(e,t,r,n){"use strict";var o=e("f7151fe13994d2aa"),a=e("f18e81760bb14899");r._=function(e,t){return t&&("object"===a._(t)||"function"==typeof t)?t:o._(e)}},{f7151fe13994d2aa:"1tlYe",f18e81760bb14899:"iXhRw"}],"1tlYe":[function(e,t,r,n){"use strict";r._=function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},{}],iXhRw:[function(e,t,r,n){"use strict";r._=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}},{}],"4Uf9M":[function(e,t,r,n){"use strict";r._=function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}},{}],igUuK:[function(e,t,r,n){"use strict";function o(e,t){for(var r=0;r","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],"3vlyb":[function(e,t,r,n){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],qpMMf:[function(e,t,r,n){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"46D5s":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return k});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("../utils"),u=e("../utils/component"),p=o.interopDefault(u),f=e("./aspectRatio"),d=o.interopDefault(f),h=e("./close"),m=o.interopDefault(h),v=e("./flip"),g=o.interopDefault(v),y=e("./info"),b=o.interopDefault(y),j=e("./playbackRate"),w=o.interopDefault(j),_=e("./version"),x=o.interopDefault(_),k=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="contextmenu",r.$parent=e.template.$contextmenu,l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.option,n=t.proxy,o=t.template,a=o.$player,s=o.$contextmenu;r.playbackRate&&this.add((0,w.default)({name:"playbackRate",index:10})),r.aspectRatio&&this.add((0,d.default)({name:"aspectRatio",index:20})),r.flip&&this.add((0,g.default)({name:"flip",index:30})),this.add((0,b.default)({name:"info",index:40})),this.add((0,x.default)({name:"version",index:50})),this.add((0,m.default)({name:"close",index:60}));for(var i=0;iu+c&&(m=c-h),n+d>p+i&&(v=i-d),(0,l.setStyles)(s,{top:"".concat(v,"px"),left:"".concat(m,"px")})}}),n(a,"click",function(t){(0,l.includeFromEvent)(t,s)||(e.show=!1)}),this.art.on("blur",function(){e.show=!1})}}]),t}(p.default)},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","../utils":"hQMLb","../utils/component":"hXsfe","./aspectRatio":"dCCaf","./close":"j6SRT","./flip":"cyTC8","./info":"cU7aj","./playbackRate":"01vHs","./version":"64r3r","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQMLb:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var a=e("./compatibility");o.exportAll(a,r);var s=e("./dom");o.exportAll(s,r);var i=e("./error");o.exportAll(i,r);var c=e("./file");o.exportAll(c,r);var l=e("./format");o.exportAll(l,r);var u=e("./property");o.exportAll(u,r);var p=e("./subtitle");o.exportAll(p,r);var f=e("./time");o.exportAll(f,r)},{"./compatibility":"iDd6B","./dom":"7V5Cu","./error":"2cjgc","./file":"8XY4p","./format":"lHh8q","./property":"iccpW","./subtitle":"ctswB","./time":"8KDy9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iDd6B:[function(e,t,r,n){var o,a,s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(r),s.export(r,"userAgent",function(){return i}),s.export(r,"isSafari",function(){return c}),s.export(r,"isIOS",function(){return l}),s.export(r,"isIOS13",function(){return u}),s.export(r,"isMobile",function(){return p}),s.export(r,"isBrowser",function(){return f});var i=null!=(a=null==(o=globalThis)?void 0:o.CUSTOM_USER_AGENT)?a:"undefined"!=typeof navigator?navigator.userAgent:"",c=/^(?:(?!chrome|android).)*safari/i.test(i),l=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,u=l||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||u,f="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7V5Cu":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",function(){return s}),o.export(r,"queryAll",function(){return i}),o.export(r,"addClass",function(){return c}),o.export(r,"removeClass",function(){return l}),o.export(r,"hasClass",function(){return u}),o.export(r,"append",function(){return p}),o.export(r,"remove",function(){return f}),o.export(r,"setStyle",function(){return d}),o.export(r,"setStyles",function(){return h}),o.export(r,"getStyle",function(){return m}),o.export(r,"siblings",function(){return v}),o.export(r,"inverseClass",function(){return g}),o.export(r,"tooltip",function(){return y}),o.export(r,"isInViewport",function(){return b}),o.export(r,"includeFromEvent",function(){return j}),o.export(r,"replaceElement",function(){return w}),o.export(r,"createElement",function(){return _}),o.export(r,"getIcon",function(){return x}),o.export(r,"setStyleText",function(){return k}),o.export(r,"supportsFlex",function(){return M}),o.export(r,"getRect",function(){return S}),o.export(r,"loadImg",function(){return E}),o.export(r,"getComposedPath",function(){return I});var a=e("./compatibility");function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelector(e)}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return Array.from(t.querySelectorAll(e))}function c(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function u(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function f(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function h(e,t){for(var r in t)d(e,r,t[r]);return e}function m(e,t){var r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(n):n}function v(e){return Array.from(e.parentElement.children).filter(function(t){return t!==e})}function g(e,t){v(e).forEach(function(e){return l(e,t)}),c(e,t)}function y(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";a.isMobile||(e.setAttribute("aria-label",t),c(e,"hint--rounded"),c(e,"hint--".concat(r)))}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,a=r.top-t<=n&&r.top+r.height+t>=0,s=r.left-t<=o+t&&r.left+r.width+t>=0;return a&&s}function j(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function _(e){return document.createElement(e)}function x(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=_("i");return c(r,"art-icon"),c(r,"art-icon-".concat(e)),p(r,t),r}function k(e,t){var r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function M(){var e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function S(e){return e.getBoundingClientRect()}function E(e,t){return new Promise(function(r,n){var o=new Image;o.onload=function(){if(t&&1!==t){var a=document.createElement("canvas"),s=a.getContext("2d");a.width=o.width*t,a.height=o.height*t,s.drawImage(o,0,0,a.width,a.height),a.toBlob(function(t){var o=URL.createObjectURL(t),a=new Image;a.onload=function(){r(a)},a.onerror=function(){URL.revokeObjectURL(o),n(Error("Image load failed: ".concat(e)))},a.src=o})}else r(o)},o.onerror=function(){n(Error("Image load failed: ".concat(e)))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();for(var t=[],r=e.target;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"iDd6B","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2cjgc":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",function(){return c}),o.export(r,"errorHandle",function(){return l});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_inherits.cjs"),c=function(e){"use strict";function t(e,r){var n;return(0,s._)(this,t),n=(0,a._)(this,t,[e]),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(n,r||n.constructor),n.name="ArtPlayerError",n}return(0,i._)(t,e),t}((0,e("@swc/helpers/cjs/_wrap_native_super.cjs")._)(Error));function l(e,t){if(!e)throw new c(t);return e}},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,t,r,n){"use strict";var o=e("c8857d56f4968279"),a=e("2ed7bdf1701f2d07"),s=e("5c5ad8846076b9cd"),i=e("2db6fa09e8a5be4c");function c(e){var t="function"==typeof Map?new Map:void 0;return r._=c=function(e){if(null===e||!s._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return o._(e,arguments,a._(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),i._(r,e)},c(e)}r._=c},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,t,r,n){"use strict";var o=e("62fc231ae2e75266"),a=e("3f98bf9d4f706151");function s(e,t,n){return o._()?r._=s=Reflect.construct:r._=s=function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&a._(o,r.prototype),o},s.apply(null,arguments)}r._=s},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,t,r,n){"use strict";r._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"8XY4p":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",function(){return function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}}),o.export(r,"download",function(){return a})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],lHh8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function s(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){if(!e)return"00:00";var t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*r);return(t>0?[t,r,n]:[r,n]).map(function(e){return e<10?"0".concat(e):String(e)}).join(":")}function c(e){return e.replace(/[&<>'"]/g,function(e){return({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e})}function l(e){var t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp("(".concat(Object.keys(t).join("|"),")"),"g");return e.replace(r,function(e){return t[e]||e})}o.defineInteropFlag(r),o.export(r,"clamp",function(){return a}),o.export(r,"capitalize",function(){return s}),o.export(r,"secondToTime",function(){return i}),o.export(r,"escape",function(){return c}),o.export(r,"unescape",function(){return l})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iccpW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",function(){return i}),o.export(r,"has",function(){return l}),o.export(r,"get",function(){return u}),o.export(r,"mergeDeep",function(){return function e(){for(var t=arguments.length,r=Array(t),n=0;ne.length)&&(t=e.length);for(var r=0,n=Array(t);r").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function s(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function i(e){var t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.split(/[:.]/).map(function(e,t,r){if(t===r.length-1){if(1===e.length)return".".concat(e,"00");if(2===e.length)return".".concat(e,"0")}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?".".concat(e):":".concat(e)}).join("")}return"WEBVTT\n"+"\n".concat(e.split(/\r?\n/).map(function(e){var n=e.match(t);return n?{start:r(n[1].trim()),end:r(n[2].trim()),text:n[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(function(e){return e.trim()}).join("\n")}:null}).filter(function(e){return e}).map(function(e,t){return e?"".concat(t+1,"\n")+"".concat(e.start," --\x3e ").concat(e.end)+"\n"+"".concat(e.text):""}).filter(function(e){return e.trim()}).join("\n\n"))}o.defineInteropFlag(r),o.export(r,"srtToVtt",function(){return a}),o.export(r,"vttToBlob",function(){return s}),o.export(r,"assToVtt",function(){return i})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KDy9":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new Promise(function(t){return setTimeout(t,e)})}function s(e,t){var r;return function(){for(var n=this,o=arguments.length,a=Array(o),s=0;s=Number(a.dataset.index)});i?i.insertAdjacentElement("beforebegin",a):(0,u.append)(this.$parent,a),r.html&&(0,u.append)(a,r.html),r.style&&(0,u.setStyles)(a,r.style),r.tooltip&&(0,u.tooltip)(a,r.tooltip);var f=[];if(r.click){var d=this.art.events.proxy(a,"click",function(e){e.preventDefault(),r.click.call(t.art,t,e)});f.push(d)}return r.selector&&["left","right"].includes(r.position)&&this.selector(r,a,f),this[n]=a,this.cache.set(n,{$ref:a,events:f,option:r}),r.mounted&&r.mounted.call(this.art,a),a}}},{key:"remove",value:function(e){var t=this.cache.get(e);(0,p.errorHandle)(t,"Can't find [".concat(e,"] from the [").concat(this.name,"]")),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(var r=0;r').concat("default"===e?r.get("Default"):e,"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Aspect Ratio"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.aspectRatio=n,e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j6SRT:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Close"),click:function(e){e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cyTC8:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.FLIP.map(function(e){return'').concat(r.get((0,i.capitalize)(e)),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Video Flip"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.flip=n.toLowerCase(),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cU7aj:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Video Info"),click:function(e){t.info.show=!0,e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"01vHs":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.PLAYBACK_RATE.map(function(e){return'').concat(1===e?r.get("Normal"):e.toFixed(1),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Play Speed"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.playbackRate=Number(n),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",function(){var r=(0,i.queryAll)("span",e).find(function(e){return Number(e.dataset.value)===t.playbackRate});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"64r3r":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return function(e){return(0,s._)((0,a._)({},e),{html:'ArtPlayer '.concat(i.version,"")})}});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../../package.json")},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../../package.json":"2Jf7W","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9MunV":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return R});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_get.cjs"),u=e("@swc/helpers/cjs/_get_prototype_of.cjs"),p=e("@swc/helpers/cjs/_inherits.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),d=e("../utils"),h=e("../utils/component"),m=o.interopDefault(h),v=e("./airplay"),g=o.interopDefault(v),y=e("./fullscreen"),b=o.interopDefault(y),j=e("./fullscreenWeb"),w=o.interopDefault(j),_=e("./pip"),x=o.interopDefault(_),k=e("./playAndPause"),M=o.interopDefault(k),S=e("./progress"),E=o.interopDefault(S),I=e("./screenshot"),T=o.interopDefault(I),L=e("./setting"),C=o.interopDefault(L),O=e("./time"),D=o.interopDefault(O),F=e("./volume"),A=o.interopDefault(F),R=function(e){"use strict";function t(e){(0,i._)(this,t),(r=(0,s._)(this,t,[e])).isHover=!1,r.name="control",r.timer=Date.now();var r,n=e.constructor,o=r.art.template,a=o.$player,c=o.$bottom;return e.on("mousemove",function(){d.isMobile||(r.show=!0)}),e.on("click",function(){d.isMobile?r.toggle():r.show=!0}),e.on("document:mousemove",function(e){r.isHover=(0,d.includeFromEvent)(e,c)}),e.on("video:timeupdate",function(){!e.setting.show&&!r.isHover&&!e.isInput&&e.playing&&r.show&&Date.now()-r.timer>=n.CONTROL_HIDE_TIME&&(r.show=!1)}),e.on("control",function(e){e?((0,d.removeClass)(a,"art-hide-cursor"),(0,d.addClass)(a,"art-hover"),r.timer=Date.now()):((0,d.addClass)(a,"art-hide-cursor"),(0,d.removeClass)(a,"art-hover"))}),r.init(),r}return(0,p._)(t,e),(0,c._)(t,[{key:"init",value:function(){var e=this,t=this.art.option;t.isLive||this.add((0,E.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,M.default)({name:"playAndPause",position:"left",index:10})),this.add((0,A.default)({name:"volume",position:"left",index:20})),t.isLive||this.add((0,D.default)({name:"time",position:"left",index:30})),t.quality.length&&(0,d.sleep)().then(function(){e.art.quality=t.quality}),t.screenshot&&!d.isMobile&&this.add((0,T.default)({name:"screenshot",position:"right",index:20})),t.setting&&this.add((0,C.default)({name:"setting",position:"right",index:30})),t.pip&&this.add((0,x.default)({name:"pip",position:"right",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,g.default)({name:"airplay",position:"right",index:50})),t.fullscreenWeb&&this.add((0,w.default)({name:"fullscreenWeb",position:"right",index:60})),t.fullscreen&&this.add((0,b.default)({name:"fullscreen",position:"right",index:70}));for(var r=0;rt.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r}function u(e,t,r,n){var o,s=arguments.length,i=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(("undefined"==typeof Reflect?"undefined":(0,a._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(i=(s<3?o(i):s>3?o(t,r,i):o(t,r))||i);return s>3&&i&&Object.defineProperty(t,r,i),i}function p(e,t){return function(r,n){t(r,n,e)}}function f(e,t,r,n,o,s){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var c,l=n.kind,u="getter"===l?"get":"setter"===l?"set":"value",p=!t&&e?n.static?e:e.prototype:null,f=t||(p?Object.getOwnPropertyDescriptor(p,n.name):{}),d=!1,h=r.length-1;h>=0;h--){var m={};for(var v in n)m[v]="access"===v?{}:n[v];for(var v in n.access)m.access[v]=n.access[v];m.addInitializer=function(e){if(d)throw TypeError("Cannot add initializers after decoration has completed");s.push(i(e||null))};var g=(0,r[h])("accessor"===l?{get:f.get,set:f.set}:f[u],m);if("accessor"===l){if(void 0===g)continue;if(null===g||(void 0===g?"undefined":(0,a._)(g))!=="object")throw TypeError("Object expected");(c=i(g.get))&&(f.get=c),(c=i(g.set))&&(f.set=c),(c=i(g.init))&&o.unshift(c)}else(c=i(g))&&("field"===l?o.unshift(c):f[u]=c)}p&&Object.defineProperty(p,n.name,f),d=!0}function d(e,t,r){for(var n=arguments.length>2,o=0;o0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function _(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return s}function x(){for(var e=[],t=0;t1||i(e,t)})},t&&(n[e]=t(n[e])))}function i(e,t){try{var r;(r=o[e](t)).value instanceof S?Promise.resolve(r.value.v).then(c,l):u(a[0][2],r)}catch(e){u(a[0][3],e)}}function c(e){i("next",e)}function l(e){i("throw",e)}function u(e,t){e(t),a.shift(),a.length&&i(a[0][0],a[0][1])}}function I(e){var t,r;return t={},n("next"),n("throw",function(e){throw e}),n("return"),t[Symbol.iterator]=function(){return this},t;function n(n,o){t[n]=e[n]?function(t){return(r=!r)?{value:S(e[n](t)),done:!1}:o?o(t):t}:o}}function T(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e=w(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise(function(n,o){var a,s,i;a=n,s=o,i=(t=e[r](t)).done,Promise.resolve(t.value).then(function(e){a({value:e,done:i})},s)})}}}function L(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},O=function(e){return(O=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)};function D(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=O(e),n=0;n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n ',mounted:function(e){var a=null,s=!1,u=(0,i.query)(".art-progress-hover",e),p=(0,i.query)(".art-progress-loaded",e),f=(0,i.query)(".art-progress-played",e),d=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function v(r,n){var o=n||c(t,r),a=o.width;m.textContent=o.time;var s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-s,"px")):(0,i.setStyle)(m,"left","".concat(a-s/2,"px"))}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,n,o){var s="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(p,"width","".concat(100*n,"%")),"hover"===r&&(0,i.setStyle)(u,"width","".concat(100*n,"%")),"played"===r&&((0,i.setStyle)(f,"width","".concat(100*n,"%")),(0,i.setStyle)(h,"left","".concat(100*n,"%"))),s&&((0,i.setStyle)(m,"display","flex"),v(o,{width:e.clientWidth*n,time:(0,i.secondToTime)(n*t.duration)}),clearTimeout(a),a=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){d.textContent="";for(var e=0;e');(0,i.append)(d,a)}}),t.constructor.USE_RAF?t.on("raf",function(){t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",function(){t.emit("setBar","played",t.played)}),t.on("video:progress",function(){t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",function(){t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",function(e){e.target!==h&&l(t,e)}),o(e,"mousemove",function(r){var n,o,a=c(t,r).percentage;(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,d))?(n=c(t,r).width,m.textContent=r.target.dataset.text,n<=(o=m.clientWidth)/2?(0,i.setStyle)(m,"left",0):n>e.clientWidth-o/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-o,"px")):(0,i.setStyle)(m,"left","".concat(n-o/2,"px"))):v(r)}),o(e,"mouseleave",function(e){(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",function(e){s=0===e.button}),t.on("document:mousemove",function(e){if(s){var r=c(t,e),n=r.second,o=r.percentage;t.emit("setBar","played",o,e),t.seek=n}}),t.on("document:mouseup",function(){s&&(s=!1)}))}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4LBtY":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Screenshot"),mounted:function(e){var r=t.proxy,n=t.icons;(0,i.append)(e,n.screenshot),r(e,"click",function(){t.screenshot()})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hXIX5:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Show Setting"),mounted:function(e){var r=t.proxy,n=t.icons,o=t.i18n;(0,i.append)(e,n.setting),r(e,"click",function(){t.setting.toggle(),t.setting.resize()}),t.on("setting",function(t){(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7Zm5j":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:function(e){function r(){var r="".concat((0,i.secondToTime)(t.currentTime)," / ").concat((0,i.secondToTime)(t.duration));r!==e.textContent&&(e.textContent=r)}r();for(var n=["video:loadedmetadata","video:timeupdate","video:progress"],o=0;o
    '),c=(0,i.append)(s,'
    '),l=(0,i.append)(c,'
    '),u=(0,i.append)(c,'
    '),p=(0,i.append)(u,'
    '),f=(0,i.append)(p,'
    '),d=(0,i.append)(u,'
    ');function h(e){var t=(0,i.getRect)(u),r=t.top,n=t.height;return 1-(e.clientY-r)/n}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(a,"display","flex"),(0,i.setStyle)(d,"top","100%"),(0,i.setStyle)(f,"top","100%"),l.textContent=0;else{var e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(a,"display","none"),(0,i.setStyle)(d,"top","".concat(100-e,"%")),(0,i.setStyle)(f,"top","".concat(100-e,"%")),l.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",function(){t.muted=!0}),r(a,"click",function(){t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{var v=!1;r(u,"mousedown",function(e){v=0===e.button,t.volume=h(e)}),t.on("document:mousemove",function(e){v&&(t.muted=!1,t.volume=h(e))}),t.on("document:mouseup",function(){v&&(v=!1)})}}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kSrJ9:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("./clickInit"),c=o.interopDefault(i),l=e("./gestureInit"),u=o.interopDefault(l),p=e("./globalInit"),f=o.interopDefault(p),d=e("./hoverInit"),h=o.interopDefault(d),m=e("./moveInit"),v=o.interopDefault(m),g=e("./resizeInit"),y=o.interopDefault(g),b=e("./updateInit"),j=o.interopDefault(b),w=e("./viewInit"),_=o.interopDefault(w),x=function(){"use strict";function e(t){(0,a._)(this,e),this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,c.default)(t,this),(0,h.default)(t,this),(0,v.default)(t,this),(0,y.default)(t,this),(0,u.default)(t,this),(0,_.default)(t,this),(0,f.default)(t,this),(0,j.default)(t,this)}return(0,s._)(e,[{key:"proxy",value:function(e,t,r){var n=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Array.isArray(t))return t.map(function(t){return n.proxy(e,t,r,o)});e.addEventListener(t,r,o);var a=function(){return e.removeEventListener(t,r,o)};return this.destroyEvents.push(a),a}},{key:"hover",value:function(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}},{key:"remove",value:function(e){var t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}},{key:"destroy",value:function(){for(var e=0;eMath.abs(a)&&2>Math.abs(o))return s;var i=180*Math.atan2(o,a)/Math.PI;return i>=-45&&i<45?s=4:i>=45&&i<135?s=1:i>=-135&&i<-45?s=2:(i>=135&&i<=180||i>=-180&&i<-135)&&(s=3),s}(l,u,o,a),d=[3,4].includes(f),h=[1,2].includes(f);if(d&&!e.isRotate||h&&e.isRotate){var m=(0,s.clamp)((o-l)/e.width,-1,1),v=(0,s.clamp)((a-u)/e.height,-1,1),g=e.isRotate?v:m,y=i===n?e.constructor.TOUCH_MOVE_RATIO:1,b=(0,s.clamp)(p+e.duration*g*y,0,e.duration);e.seek=b,e.emit("setBar","played",(0,s.clamp)(b/e.duration,0,1),t),e.notice.show="".concat((0,s.secondToTime)(b)," / ").concat((0,s.secondToTime)(e.duration))}}};e.option.gesture&&(t.proxy(n,"touchstart",function(e){i=n,f(e)}),t.proxy(n,"touchmove",d)),t.proxy(o,"touchstart",function(e){i=o,f(e)}),t.proxy(o,"touchmove",d),e.on("document:touchend",function(){c&&(l=0,u=0,p=0,c=!1,i=null)})}}},{"../control/progress":"lLsXv","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hOg1v:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],n=["resize","scroll","orientationchange"],o=[];function a(){for(var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=0;s'},{}],kX2ah:[function(e,t,r,n){t.exports=''},{}],cYqbE:[function(e,t,r,n){t.exports=''},{}],dCZ1q:[function(e,t,r,n){t.exports=''},{}],enWOR:[function(e,t,r,n){t.exports=''},{}],aEYUh:[function(e,t,r,n){t.exports=''},{}],"6sWtx":[function(e,t,r,n){t.exports=''},{}],bhixJ:[function(e,t,r,n){t.exports=''},{}],aonuB:[function(e,t,r,n){t.exports=''},{}],hbNgp:[function(e,t,r,n){t.exports=''},{}],aNXxH:[function(e,t,r,n){t.exports=''},{}],ezk36:[function(e,t,r,n){t.exports=''},{}],kPsyz:[function(e,t,r,n){t.exports=''},{}],cUJ9T:[function(e,t,r,n){t.exports=''},{}],"9MnDP":[function(e,t,r,n){t.exports=''},{}],gtJ8Q:[function(e,t,r,n){t.exports=''},{}],luvRR:[function(e,t,r,n){t.exports=''},{}],"2VikP":[function(e,t,r,n){t.exports=''},{}],"9eYwu":[function(e,t,r,n){t.exports=''},{}],"5m73X":[function(e,t,r,n){t.exports=''},{}],"2ZLsh":[function(e,t,r,n){t.exports=''},{}],fXkDR:[function(e,t,r,n){t.exports=''},{}],jcnGd:[function(e,t,r,n){t.exports=''},{}],"2QwX5":[function(e,t,r,n){t.exports=''},{}],"9oiD9":[function(e,t,r,n){t.exports=''},{}],"68oNy":[function(e,t,r,n){t.exports=''},{}],j2oAd:[function(e,t,r,n){t.exports=''},{}],"9sVMb":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return p});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("./utils"),u=e("./utils/component"),p=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="info",l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.proxy,n=t.constructor,o=t.template,a=o.$infoPanel,s=o.$infoClose,i=o.$video;r(s,"click",function(){e.show=!1});var c=null,u=(0,l.queryAll)("[data-video]",a)||[];this.art.on("destroy",function(){return clearTimeout(c)}),!function e(){for(var t=0;tu?((0,a.setStyle)(o,"width","".concat(u*l,"px")),(0,a.setStyle)(o,"height","100%"),(0,a.setStyle)(o,"margin","0 auto")):((0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","".concat(c/u,"px")),(0,a.setStyle)(o,"margin","auto 0")),s.dataset.aspectRatio=n}r.show="".concat(t.get("Aspect Ratio"),": ").concat("default"===n?t.get("Default"):n),e.emit("aspectRatio",n)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],rWA5h:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"attr",{value:function(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ekP8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$video;(0,a.def)(e,"autoHeight",{value:function(){var t=r.clientWidth,o=n.videoHeight,s=t/n.videoWidth*o;(0,a.setStyle)(r,"height","".concat(s,"px")),e.emit("autoHeight",s)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3d2R8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$player,o=t.$video;(0,a.def)(e,"autoSize",{value:function(){var t=o.videoWidth,s=o.videoHeight,i=(0,a.getRect)(r),c=i.width,l=i.height,u=t/s;c/l>u?((0,a.setStyle)(n,"width","".concat(l*u/c*100,"%")),(0,a.setStyle)(n,"height","100%")):((0,a.setStyle)(n,"width","100%"),(0,a.setStyle)(n,"height","".concat(c/u/l*100,"%"))),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2nLRH":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$player;(0,a.def)(e,"cssVar",{value:function(e,r){return r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3lhzv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"currentTime",{get:function(){return t.currentTime||0},set:function(r){Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,a.clamp)(r,0,e.duration))}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQmmf:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"duration",{get:function(){var t=e.template.$video.duration;return t===1/0?0:t||0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1KU3q":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return u});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../config"),c=o.interopDefault(i),l=e("../utils");function u(e){for(var t=e.i18n,r=e.notice,n=e.option,o=e.constructor,i=e.proxy,u=e.template,p=u.$player,f=u.$video,d=u.$poster,h=0,m=0;m0&&void 0!==arguments[0]?arguments[0]:document.documentElement,t=arguments.length>1?arguments[1]:void 0;return new Promise(function(r,n){var o=function(){c.off("change",o),r()};c.on("change",o);var a=e[s.requestFullscreen](t);a instanceof Promise&&a.then(o).catch(n)})},exit:function(){return new Promise(function(e,t){if(!c.isFullscreen)return void e();var r=function(){c.off("change",r),e()};c.on("change",r);var n=document[s.exitFullscreen]();n instanceof Promise&&n.then(r).catch(t)})},toggle:function(e,t){return c.isFullscreen?c.exit():c.request(e,t)},onchange:function(e){c.on("change",e)},onerror:function(e){c.on("error",e)},on:function(e,t){var r=i[e];r&&document.addEventListener(r,t,!1)},off:function(e,t){var r=i[e];r&&document.removeEventListener(r,t,!1)},raw:s};Object.defineProperties(c,{isFullscreen:{get:function(){return!!document[s.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[s.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return!!document[s.fullscreenEnabled]}}}),r.default=c},{"@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gIQTH:[function(e,t,r,n){"use strict";var o=e("d7c30a5ae0c1ab2"),a=e("3aacfce52f67defd"),s=e("f0dae09a1a08b16a"),i=e("83f3648e614d0830");r._=function(e,t){return o._(e)||a._(e,t)||i._(e,t)||s._()}},{d7c30a5ae0c1ab2:"3QSPl","3aacfce52f67defd":"5SSeo",f0dae09a1a08b16a:"heYSj","83f3648e614d0830":"fh7mx"}],"3QSPl":[function(e,t,r,n){"use strict";r._=function(e){if(Array.isArray(e))return e}},{}],"5SSeo":[function(e,t,r,n){"use strict";r._=function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],s=!0,i=!1;try{for(o=o.call(e);!(s=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);s=!0);}catch(e){i=!0,n=e}finally{try{s||null==o.return||o.return()}finally{if(i)throw n}}return a}}},{}],heYSj:[function(e,t,r,n){"use strict";r._=function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},{}],itVYl:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.template,n=r.$container,o=r.$player,s="";(0,a.def)(e,"fullscreenWeb",{get:function(){return(0,a.hasClass)(o,"art-fullscreen-web")},set:function(r){r?(s=o.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(document.body,o),e.state="fullscreenWeb",(0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","100%"),(0,a.addClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(n,o),s&&(o.style.cssText=s,s=""),(0,a.removeClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],dE0YW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"loaded",{get:function(){return e.loadedTime/t.duration}}),(0,a.def)(e,"loadedTime",{get:function(){return t.buffered.length?t.buffered.end(t.buffered.length-1):0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kwpHL:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.icons,r=e.proxy,n=e.storage,o=e.template,s=o.$player,i=o.$video,c=!1,l=0,u=0;function p(){var t=e.template.$mini;t&&((0,a.removeClass)(s,"art-mini"),(0,a.setStyle)(t,"display","none"),s.prepend(i),e.emit("mini",!1))}function f(t,r){e.playing?((0,a.setStyle)(t,"display","none"),(0,a.setStyle)(r,"display","flex")):((0,a.setStyle)(t,"display","flex"),(0,a.setStyle)(r,"display","none"))}function d(){var t=e.template.$mini,r=(0,a.getRect)(t),o=window.innerHeight-r.height-50,s=window.innerWidth-r.width-50;n.set("top",o),n.set("left",s),(0,a.setStyle)(t,"top","".concat(o,"px")),(0,a.setStyle)(t,"left","".concat(s,"px"))}(0,a.def)(e,"mini",{get:function(){return(0,a.hasClass)(s,"art-mini")},set:function(o){if(o){e.state="mini",(0,a.addClass)(s,"art-mini");var h=function(){var o=e.template.$mini;if(o)return(0,a.append)(o,i),(0,a.setStyle)(o,"display","flex");var s=(0,a.createElement)("div");(0,a.addClass)(s,"art-mini-popup"),(0,a.append)(document.body,s),e.template.$mini=s,(0,a.append)(s,i);var d=(0,a.append)(s,'
    ');(0,a.append)(d,t.close),r(d,"click",p);var h=(0,a.append)(s,'
    '),m=(0,a.append)(h,t.play),v=(0,a.append)(h,t.pause);return r(m,"click",function(){return e.play()}),r(v,"click",function(){return e.pause()}),f(m,v),e.on("video:playing",function(){return f(m,v)}),e.on("video:pause",function(){return f(m,v)}),e.on("video:timeupdate",function(){return f(m,v)}),r(s,"mousedown",function(e){c=0===e.button,l=e.pageX,u=e.pageY}),e.on("document:mousemove",function(e){if(c){(0,a.addClass)(s,"art-mini-dragging");var t=e.pageX-l,r=e.pageY-u;(0,a.setStyle)(s,"transform","translate(".concat(t,"px, ").concat(r,"px)"))}}),e.on("document:mouseup",function(){if(c){c=!1,(0,a.removeClass)(s,"art-mini-dragging");var e=(0,a.getRect)(s);n.set("left",e.left),n.set("top",e.top),(0,a.setStyle)(s,"left","".concat(e.left,"px")),(0,a.setStyle)(s,"top","".concat(e.top,"px")),(0,a.setStyle)(s,"transform",null)}}),s}(),m=n.get("top"),v=n.get("left");"number"==typeof m&&"number"==typeof v?((0,a.setStyle)(h,"top","".concat(m,"px")),(0,a.setStyle)(h,"left","".concat(v,"px")),(0,a.isInViewport)(h)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"72iXq":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.option,r=e.storage,n=e.template,o=n.$video,s=n.$poster;for(var i in t.moreVideoAttr)e.attr(i,t.moreVideoAttr[i]);t.muted&&(e.muted=t.muted),t.volume&&(o.volume=(0,a.clamp)(t.volume,0,1));var c=r.get("volume");for(var l in"number"==typeof c&&(o.volume=(0,a.clamp)(c,0,1)),t.poster&&(0,a.setStyle)(s,"backgroundImage","url(".concat(t.poster,")")),t.autoplay&&(o.autoplay=t.autoplay),t.playsInline&&(o.playsInline=!0,o["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(l,t.cssVar[l]);e.url=t.url}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1B8xv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"pause",{value:function(){var o=t.pause();return n.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2ayfA":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t,r,n,o,s=e.i18n,i=e.notice,c=e.template.$video;document.pictureInPictureEnabled?(t=e.template.$video,r=e.proxy,n=e.notice,t.disablePictureInPicture=!1,(0,a.def)(e,"pip",{get:function(){return document.pictureInPictureElement},set:function(r){r?(e.state="pip",t.requestPictureInPicture().catch(function(e){throw n.show=e,e})):document.exitPictureInPicture().catch(function(e){throw n.show=e,e})}}),r(t,"enterpictureinpicture",function(){e.emit("pip",!0)}),r(t,"leavepictureinpicture",function(){e.emit("pip",!1)})):c.webkitSupportsPresentationMode?((o=e.template.$video).webkitSetPresentationMode("inline"),(0,a.def)(e,"pip",{get:function(){return"picture-in-picture"===o.webkitPresentationMode},set:function(t){t?(e.state="pip",o.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(o.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})):(0,a.def)(e,"pip",{get:function(){return!1},set:function(){i.show=s.get("PIP Not Supported")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4pWSp":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"playbackRate",{get:function(){return t.playbackRate},set:function(o){o?o!==t.playbackRate&&(t.playbackRate=o,n.show="".concat(r.get("Rate"),": ").concat(1===o?r.get("Normal"):"".concat(o,"x"))):e.playbackRate=1}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3GKs4":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"played",{get:function(){return e.currentTime/e.duration}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],in83u:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"playing",{get:function(){return"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cVJNG:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.i18n,r=e.notice,n=e.option,o=e.constructor.instances,c=e.template.$video;(0,i.def)(e,"play",{value:function(){return(0,a._)(function(){var a,i,l;return(0,s._)(this,function(s){switch(s.label){case 0:return[4,c.play()];case 1:if(a=s.sent(),r.show=t.get("Play"),e.emit("play"),n.mutex)for(i=0;i0&&jo.clientWidth-m/2?(0,i.setStyle)(a,"left","".concat(o.clientWidth-m,"px")):(0,i.setStyle)(a,"left","".concat(t-m/2,"px"))}}(j):i.isMobile||(0,i.setStyle)(m,"display","none"),b&&(clearTimeout(l),l=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500)),s.label=3;case 3:return[2]}})})()}),(0,i.def)(e,"thumbnails",{get:function(){return e.option.thumbnails},set:function(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(l),l=null,u=null,p=!1,f=!1)}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],bdo2A:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"toggle",{value:function(){return e.playing?e.pause():e.play()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7uOqt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"type",{get:function(){return e.option.type},set:function(t){e.option.type=t}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4QAa0":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.option,r=e.template.$video;(0,i.def)(e,"url",{get:function(){return r.src},set:function(n){return(0,a._)(function(){var o,a,c;return(0,s._)(this,function(s){switch(s.label){case 0:if(!n)return[3,4];if(o=e.url,a=t.type||(0,i.getExt)(n),c=t.customType[a],!(a&&c))return[3,2];return[4,(0,i.sleep)()];case 1:return s.sent(),e.loading.show=!0,c.call(e,r,n,e),[3,3];case 2:URL.revokeObjectURL(o),r.src=n,s.label=3;case 3:return o!==e.url&&(e.option.url=n,e.isReady&&o&&e.once("video:canplay",function(){e.emit("restart",n)})),[3,6];case 4:return[4,(0,i.sleep)()];case 5:s.sent(),e.loading.show=!0,s.label=6;case 6:return[2]}})})()}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3sLEt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice,o=e.storage;(0,a.def)(e,"volume",{get:function(){return t.volume||0},set:function(e){t.volume=(0,a.clamp)(e,0,1),n.show="".concat(r.get("Volume"),": ").concat(Number.parseInt(100*t.volume,10)),0!==t.volume&&o.set("volume",t.volume)}}),(0,a.def)(e,"muted",{get:function(){return t.muted},set:function(r){t.muted=r,e.emit("muted",r)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"83Crr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return y});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../utils"),c=e("./autoOrientation"),l=o.interopDefault(c),u=e("./autoPlayback"),p=o.interopDefault(u),f=e("./fastForward"),d=o.interopDefault(f),h=e("./lock"),m=o.interopDefault(h),v=e("./miniProgressBar"),g=o.interopDefault(v),y=function(){"use strict";function e(t){(0,a._)(this,e),this.art=t,this.id=0;var r=t.option;r.miniProgressBar&&!r.isLive&&this.add(g.default),r.lock&&i.isMobile&&this.add(m.default),r.autoPlayback&&!r.isLive&&this.add(p.default),r.autoOrientation&&i.isMobile&&this.add(l.default),r.fastForward&&i.isMobile&&!r.isLive&&this.add(d.default);for(var n=0;nt&&rn}return e.on("fullscreenWeb",function(t){if(t){if(f()){var n;setTimeout(function(){var t,r;e.fullscreenWeb&&!(0,i.hasClass)(o,l)&&(t=document.documentElement.clientWidth,r=document.documentElement.clientHeight,(0,i.setStyle)(o,"width","".concat(r,"px")),(0,i.setStyle)(o,"height","".concat(t,"px")),(0,i.setStyle)(o,"transform-origin","0 0"),(0,i.setStyle)(o,"transform","rotate(90deg) translate(0, -".concat(t,"px)")),(0,i.addClass)(o,l),e.isRotate=!0,e.emit("resize"))},Number(null!=(n=r.AUTO_ORIENTATION_TIME)?n:0))}}else(0,i.hasClass)(o,l)&&((0,i.setStyle)(o,"width",""),(0,i.setStyle)(o,"height",""),(0,i.setStyle)(o,"transform-origin",""),(0,i.setStyle)(o,"transform",""),(0,i.removeClass)(o,l),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",function(e){return(0,a._)(function(){var r,n,a,c,l;return(0,s._)(this,function(s){switch(s.label){case 0:if(a=!!(null==(n=screen)||null==(r=n.orientation)?void 0:r.lock),!e)return[3,5];if(!(a&&f()))return[3,4];s.label=1;case 1:return s.trys.push([1,3,,4]),c=screen.orientation.type.startsWith("portrait")?"landscape":"portrait",[4,screen.orientation.lock(c)];case 2:return s.sent(),p=!0,(0,i.addClass)(o,u),[3,4];case 3:return l=s.sent(),p=!1,t.show=l,[3,4];case 4:return[3,6];case 5:if((0,i.hasClass)(o,u)&&(0,i.removeClass)(o,u),a&&p){try{screen.orientation.unlock()}catch(e){}p=!1}s.label=6;case 6:return[2]}})})()}),{name:"autoOrientation",get state(){return(0,i.hasClass)(o,l)}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"76uK8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.i18n,r=e.icons,n=e.storage,o=e.constructor,s=e.proxy,i=e.template.$poster,c=e.layers.add({name:"auto-playback",html:'\n
    \n
    \n
    \n '}),l=(0,a.query)(".art-auto-playback-last",c),u=(0,a.query)(".art-auto-playback-jump",c),p=(0,a.query)(".art-auto-playback-close",c);(0,a.append)(p,r.close);var f=null;function d(){var r=(n.get("times")||{})[e.option.id||e.option.url];clearTimeout(f),(0,a.setStyle)(c,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,a.setStyle)(c,"display","flex"),l.textContent="".concat(t.get("Last Seen")," ").concat((0,a.secondToTime)(r)),u.textContent=t.get("Jump Play"),s(p,"click",function(){(0,a.setStyle)(c,"display","none")}),s(u,"click",function(){e.seek=r,e.play(),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(c,"display","none")}),e.once("video:timeupdate",function(){f=setTimeout(function(){(0,a.setStyle)(c,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",function(){if(e.playing){var t=n.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,n.set("times",t)}}),e.on("ready",d),e.on("restart",d),{name:"auto-playback",get times(){return n.get("times")||{}},clear:function(){return n.del("times")},delete:function(e){var t=n.get("times")||{};return delete t[e],n.set("times",t),t}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gLGPW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.proxy,n=e.template,o=n.$player,s=n.$video,i=null,c=!1,l=1,u=function(){clearTimeout(i),c&&(c=!1,e.playbackRate=l,(0,a.removeClass)(o,"art-fast-forward"))};return r(s,"touchstart",function(r){1===r.touches.length&&e.playing&&!e.isLock&&(i=setTimeout(function(){c=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,a.addClass)(o,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",u),e.on("document:touchend",u),{name:"fastForward",get state(){return(0,a.hasClass)(o,"art-fast-forward")}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9btcI":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.layers,r=e.icons,n=e.template.$player;function o(){return(0,a.hasClass)(n,"art-lock")}function s(){(0,a.addClass)(n,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function i(){(0,a.removeClass)(n,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted:function(t){var n=(0,a.append)(t,r.lock),o=(0,a.append)(t,r.unlock);(0,a.setStyle)(n,"display","none"),e.on("lock",function(e){e?((0,a.setStyle)(n,"display","inline-flex"),(0,a.setStyle)(o,"display","none")):((0,a.setStyle)(n,"display","none"),(0,a.setStyle)(o,"display","inline-flex"))})},click:function(){o()?i():s()}}),{name:"lock",get state(){return o()},set state(value){value?s():i()}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iSnmg:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){return e.on("control",function(t){t?(0,a.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,a.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4ARoj":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),u=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("../utils"),d=e("../utils/component"),h=o.interopDefault(d),m=e("./aspectRatio"),v=o.interopDefault(m),g=e("./flip"),y=o.interopDefault(g),b=e("./playbackRate"),j=o.interopDefault(b),w=e("./subtitleOffset"),_=o.interopDefault(w),x=function(e){"use strict";function t(e){(0,i._)(this,t);var r=(0,s._)(this,t,[e]),n=e.option,o=e.controls,a=e.template.$setting;return r.name="setting",r.$parent=a,r.id=0,r.active=null,r.cache=new Map,r.option=(0,u._)(r.builtin).concat((0,u._)(n.settings)),n.setting&&(r.format(),r.render(),e.on("blur",function(){r.show&&(r.show=!1,r.render())}),e.on("focus",function(e){var t=(0,f.includeFromEvent)(e,o.setting),n=(0,f.includeFromEvent)(e,r.$parent);!r.show||t||n||(r.show=!1,r.render())}),e.on("resize",function(){return r.resize()})),r}return(0,l._)(t,e),(0,c._)(t,[{key:"builtin",get:function(){var e=[],t=this.art.option;return t.playbackRate&&e.push((0,j.default)(this.art)),t.aspectRatio&&e.push((0,v.default)(this.art)),t.flip&&e.push((0,y.default)(this.art)),t.subtitleOffset&&e.push((0,_.default)(this.art)),e}},{key:"traverse",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.option,r=0;r0&&void 0!==arguments[0]?arguments[0]:this.option,r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=0;a0&&void 0!==arguments[0]?arguments[0]:"",t=null;return this.traverse(function(r){r.name===e&&(t=r)}),t}},{key:"resize",value:function(){var e=this.art,t=e.controls,r=e.constructor,n=r.SETTING_WIDTH,o=r.SETTING_ITEM_HEIGHT,a=e.template,s=a.$player,i=a.$setting;if(t.setting&&this.show){var c,l,u=(null==(l=this.active[0])||null==(c=l.$parent)?void 0:c.width)||n,p=(0,f.getRect)(t.setting),d=p.left,h=p.width,m=(0,f.getRect)(s),v=m.left,g=m.width,y=d-v+h/2-u/2,b=this.active===this.option?this.active.length*o:(this.active.length+1)*o;if((0,f.setStyle)(i,"height","".concat(b,"px")),(0,f.setStyle)(i,"width","".concat(u,"px")),this.art.isRotate||f.isMobile)return;y+u>g?((0,f.setStyle)(i,"left",null),(0,f.setStyle)(i,"right",null)):((0,f.setStyle)(i,"left","".concat(y,"px")),(0,f.setStyle)(i,"right","auto"))}}},{key:"inactivate",value:function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:this.option;return t.push(e),this.format(),this.createItem(e),this.render(),e}},{key:"createHeader",value:function(e){var t=this;if(this.cache.has(e.$option)){var r=this.cache.get(e.$option),n=this.art,o=n.proxy,a=n.icons.arrowLeft,s=n.constructor.SETTING_ITEM_HEIGHT,i=(0,f.createElement)("div");(0,f.setStyle)(i,"height","".concat(s,"px")),(0,f.addClass)(i,"art-setting-item"),(0,f.addClass)(i,"art-setting-item-back");var c=(0,f.append)(i,'
    '),l=(0,f.createElement)("div");(0,f.addClass)(l,"art-setting-item-left-icon"),(0,f.append)(l,a),(0,f.append)(c,l),(0,f.append)(c,e.$parent.html);var u=o(i,"click",function(){return t.render(e.$parents)});e.$parent.$events.push(u),(0,f.append)(r,i)}}},{key:"createItem",value:function(e){var t,r,n=this,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.cache.has(e.$option)){var s=this.cache.get(e.$option),i=e.$item,c="selector";(0,f.has)(e,"switch")&&(c="switch"),(0,f.has)(e,"range")&&(c="range"),(0,f.has)(e,"onClick")&&(c="button");var l=this.art,d=l.icons,h=l.proxy,m=l.constructor,v=(0,f.createElement)("div");(0,f.addClass)(v,"art-setting-item"),(0,f.setStyle)(v,"height","".concat(m.SETTING_ITEM_HEIGHT,"px")),v.dataset.name=e.name||"",v.dataset.value=e.value||"";var g=(0,f.append)(v,'
    '),y=(0,f.append)(v,'
    '),b=(0,f.createElement)("div");switch((0,f.addClass)(b,"art-setting-item-left-icon"),c){case"button":case"switch":case"range":(0,f.append)(b,e.icon||d.config);break;case"selector":(null==(t=e.selector)?void 0:t.length)?(0,f.append)(b,e.icon||d.config):(0,f.append)(b,d.check)}(0,f.append)(g,b),(0,f.def)(e,"$icon",{configurable:!0,get:function(){return b}}),(0,f.def)(e,"icon",{configurable:!0,get:function(){return b.innerHTML},set:function(e){b.innerHTML="",(0,f.append)(b,e)}});var j=(0,f.createElement)("div");(0,f.addClass)(j,"art-setting-item-left-text"),(0,f.append)(j,e.html||""),(0,f.append)(g,j),(0,f.def)(e,"$html",{configurable:!0,get:function(){return j}}),(0,f.def)(e,"html",{configurable:!0,get:function(){return j.innerHTML},set:function(e){j.innerHTML="",(0,f.append)(j,e)}});var w=(0,f.createElement)("div");switch((0,f.addClass)(w,"art-setting-item-right-tooltip"),(0,f.append)(w,e.tooltip||""),(0,f.append)(y,w),(0,f.def)(e,"$tooltip",{configurable:!0,get:function(){return w}}),(0,f.def)(e,"tooltip",{configurable:!0,get:function(){return w.innerHTML},set:function(e){w.innerHTML="",(0,f.append)(w,e)}}),c){case"switch":var _=(0,f.createElement)("div");(0,f.addClass)(_,"art-setting-item-right-icon");var x=(0,f.append)(_,d.switchOn),k=(0,f.append)(_,d.switchOff);(0,f.setStyle)(e.switch?k:x,"display","none"),(0,f.append)(y,_),(0,f.def)(e,"$switch",{configurable:!0,get:function(){return _}});var M=e.switch;(0,f.def)(e,"switch",{configurable:!0,get:function(){return M},set:function(e){M=e,e?((0,f.setStyle)(k,"display","none"),(0,f.setStyle)(x,"display",null)):((0,f.setStyle)(k,"display",null),(0,f.setStyle)(x,"display","none"))}});break;case"range":var S=(0,f.createElement)("div");(0,f.addClass)(S,"art-setting-item-right-icon");var E=(0,f.append)(S,'');E.value=e.range[0],E.min=e.range[1],E.max=e.range[2],E.step=e.range[3],(0,f.addClass)(E,"art-setting-range"),(0,f.append)(y,S),(0,f.def)(e,"$range",{configurable:!0,get:function(){return E}});var I=(0,u._)(e.range);(0,f.def)(e,"range",{configurable:!0,get:function(){return I},set:function(e){I=(0,u._)(e),E.value=e[0],E.min=e[1],E.max=e[2],E.step=e[3]}});break;case"selector":if(null==(r=e.selector)?void 0:r.length){var T=(0,f.createElement)("div");(0,f.addClass)(T,"art-setting-item-right-icon"),(0,f.append)(T,d.arrowRight),(0,f.append)(y,T)}}switch(c){case"switch":if(e.onSwitch){var L=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onSwitch.call(this.art,e,v,t)];case 1:return e.switch=r.sent(),[2]}})}).call(n)});e.$events.push(L)}break;case"range":if(e.$range){if(e.onRange){var C=h(e.$range,"change",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onRange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(C)}if(e.onChange){var O=h(e.$range,"input",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onChange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(O)}}break;case"selector":var D=h(v,"click",function(t){return(0,a._)(function(){var r,n;return(0,p._)(this,function(o){switch(o.label){case 0:if(!(null==(r=e.selector)?void 0:r.length))return[3,1];return this.render(e.selector),[3,3];case 1:if(this.check(e),!e.$parent.onSelect)return[3,3];return n=e.$parent,[4,e.$parent.onSelect.call(this.art,e,v,t)];case 2:n.tooltip=o.sent(),o.label=3;case 3:return[2]}})}).call(n)});e.$events.push(D),e.default&&(0,f.addClass)(v,"art-current");break;case"button":if(e.onClick){var F=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onClick.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(F)}}(0,f.def)(e,"$item",{configurable:!0,get:function(){return v}}),o?(0,f.replaceElement)(v,i):(0,f.append)(s,v),e.mounted&&setTimeout(function(){return e.mounted.call(n.art,e.$item,e)},0)}}},{key:"render",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.option;if(this.active=e,this.cache.has(e)){var t=this.cache.get(e);(0,f.inverseClass)(t,"art-current")}else{var r,n=(0,f.createElement)("div");this.cache.set(e,n),(0,f.addClass)(n,"art-setting-panel"),(0,f.append)(this.$parent,n),(0,f.inverseClass)(n,"art-current"),(null==(r=e[0])?void 0:r.$parent)&&this.createHeader(e[0]);for(var o=0;o\n ').concat(t.escape?(0,y.escape)(e):e,"\n
    ")}).join("")}).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}},{key:"switch",value:function(e){return(0,a._)(function(e){var t,r,n,o,a,s,i,c=arguments;return(0,d._)(this,function(l){switch(l.label){case 0:return t=c.length>1&&void 0!==c[1]?c[1]:{},n=(r=this.art).i18n,o=r.notice,a=r.option,s=(0,p._)((0,u._)({},a.subtitle,t),{url:e}),[4,this.init(s)];case 1:return i=l.sent(),t.name&&(o.show="".concat(n.get("Switch Subtitle"),": ").concat(t.name)),[2,i]}})}).apply(this,arguments)}},{key:"createTrack",value:function(e,t){var r=this,n=this.art,o=n.template,a=n.proxy,s=n.option,i=o.$video,c=o.$track,l=(0,y.createElement)("track");l.default=!0,l.kind=e,l.src=t,l.label=s.subtitle.name||"Artplayer",l.track.mode="hidden",l.onload=function(){r.art.emit("subtitleLoad",r.cues,r.option)},this.art.events.remove(this.destroyEvent),c.onload=null,(0,y.remove)(c),(0,y.append)(i,l),o.$track=l,this.destroyEvent=a(this.textTrack,"cuechange",function(){return r.update()})}},{key:"init",value:function(e){return(0,a._)(function(){var t,r,n,o;return(0,d._)(this,function(a){return(t=this,n=(r=this.art).notice,o=r.template.$subtitle,this.textTrack)?((0,m.default)(e,g.default.subtitle),e.url)?(this.option=e,this.style(e.style),[2,fetch(e.url).then(function(e){return e.arrayBuffer()}).then(function(t){var r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,y.getExt)(e.url)){case"srt":var n=(0,y.srtToVtt)(r),o=e.onVttLoad(n);return(0,y.vttToBlob)(o);case"ass":var a=(0,y.assToVtt)(r),s=e.onVttLoad(a);return(0,y.vttToBlob)(s);case"vtt":var i=e.onVttLoad(r);return(0,y.vttToBlob)(i);default:return e.url}}).then(function(e){return o.innerHTML="",t.url===e||(URL.revokeObjectURL(t.url),t.createTrack("metadata",e)),e}).catch(function(e){throw o.innerHTML="",n.show=e,e})]):[2]:[2,null]})}).call(this)}}]),t}(o.interopDefault(b).default)},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","option-validator":"8zKz5","./scheme":"3Srhh","./utils":"hQMLb","./utils/component":"hXsfe","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],jkHHJ:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return l});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../package.json"),c=e("./utils"),l=function(){"use strict";function e(t){var r=this;(0,a._)(this,e),this.art=t;var n=t.option,o=t.constructor;n.container instanceof Element?this.$container=n.container:(this.$container=(0,c.query)(n.container),(0,c.errorHandle)(this.$container,"No container element found by ".concat(n.container))),(0,c.errorHandle)((0,c.supportsFlex)(),"The current browser does not support flex layout");var s=this.$container.tagName.toLowerCase();(0,c.errorHandle)("div"===s,"Unsupported container element type, only support 'div' but got '".concat(s,"'")),(0,c.errorHandle)(o.instances.every(function(e){return e.template.$container!==r.$container}),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}return(0,s._)(e,[{key:"query",value:function(e){return(0,c.query)(e,this.$container)}},{key:"init",value:function(){var t=this.art.option;if(t.useSSR||(this.$container.innerHTML=e.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),t.proxy){var r=t.proxy.call(this.art,this.art);(0,c.errorHandle)(r instanceof HTMLVideoElement||r instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,c.replaceElement)(r,this.$video),r.className="art-video",this.$video=r}t.backdrop&&(0,c.addClass)(this.$player,"art-backdrop"),c.isMobile&&(0,c.addClass)(this.$player,"art-mobile")}},{key:"destroy",value:function(e){e?this.$container.innerHTML="":(0,c.addClass)(this.$player,"art-destroy")}}],[{key:"html",get:function(){return'\n
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    Player version:
    \n
    '.concat(i.version,'
    \n
    \n
    \n
    Video url:
    \n
    \n
    \n
    \n
    Video volume:
    \n
    \n
    \n
    \n
    Video time:
    \n
    \n
    \n
    \n
    Video duration:
    \n
    \n
    \n
    \n
    Video resolution:
    \n
    \nx\n
    \n
    \n
    \n
    [x]
    \n
    \n
    \n
    \n ')}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","../package.json":"2Jf7W","./utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ikoiH:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=function(){"use strict";function e(){(0,a._)(this,e)}return(0,s._)(e,[{key:"on",value:function(e,t,r){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:t,ctx:r}),this}},{key:"once",value:function(e,t,r){var n=this;function o(){for(var a=arguments.length,s=Array(a),i=0;i1?t-1:0),n=1;n").concat(e))};i("Version@".concat(t.version));for(var c=0;c0)||void 0===arguments[0]||arguments[0];t.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),er.splice(er.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}],[{key:"instances",get:function(){return er}},{key:"version",get:function(){return d.version}},{key:"config",get:function(){return m.default}},{key:"utils",get:function(){return K}},{key:"scheme",get:function(){return V.default}},{key:"Emitter",get:function(){return ee.default}},{key:"validator",get:function(){return f.default}},{key:"kindOf",get:function(){return f.default.kindOf}},{key:"html",get:function(){return Z.default.html}},{key:"option",get:function(){var e;return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:function(e){return e}},moreVideoAttr:{controls:!1,preload:K.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==(e=navigator)?void 0:e.language.toLowerCase()}}}]),t}(ee.default);en.STYLE=u.default,en.DEBUG=!1,en.CONTEXTMENU=!0,en.NOTICE_TIME=2e3,en.SETTING_WIDTH=250,en.SETTING_ITEM_WIDTH=200,en.SETTING_ITEM_HEIGHT=35,en.RESIZE_TIME=200,en.SCROLL_TIME=200,en.SCROLL_GAP=50,en.AUTO_PLAYBACK_MAX=10,en.AUTO_PLAYBACK_MIN=5,en.AUTO_PLAYBACK_TIMEOUT=3e3,en.RECONNECT_TIME_MAX=5,en.RECONNECT_SLEEP_TIME=1e3,en.CONTROL_HIDE_TIME=3e3,en.DBCLICK_TIME=300,en.DBCLICK_FULLSCREEN=!0,en.MOBILE_DBCLICK_PLAY=!0,en.MOBILE_CLICK_PLAY=!1,en.AUTO_ORIENTATION_TIME=200,en.INFO_LOOP_TIME=1e3,en.FAST_FORWARD_VALUE=3,en.FAST_FORWARD_TIME=1e3,en.TOUCH_MOVE_RATIO=.5,en.VOLUME_STEP=.1,en.SEEK_STEP=5,en.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],en.ASPECT_RATIO=["default","4:3","16:9"],en.FLIP=["normal","horizontal","vertical"],en.FULLSCREEN_WEB_IN_BODY=!0,en.LOG_VERSION=!0,en.USE_RAF=!1,en.REMOVE_SRC_WHEN_DESTROY=!0,K.isBrowser&&(window.Artplayer=en,K.setStyleText("artplayer-style",u.default),setTimeout(function(){en.LOG_VERSION&&console.log("%c ArtPlayer %c ".concat(en.version," %c https://artplayer.org"),"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","bundle-text:./style/index.less":"A7TwB","option-validator":"8zKz5","../package.json":"2Jf7W","./config":"3vlyb","./contextmenu":"46D5s","./control":"9MunV","./events":"kSrJ9","./hotkey":"fSjZi","./i18n":"5q3H4","./icons":"lkjMg","./info":"9sVMb","./layer":"dsBH4","./loading":"hLYDH","./mask":"5YaCM","./notice":"6kSNS","./player":"gJ9uy","./plugins":"83Crr","./scheme":"3Srhh","./setting":"4ARoj","./storage":"a5A5h","./subtitle":"kEcFl","./template":"jkHHJ","./utils":"hQMLb","./utils/emitter":"ikoiH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],clpdF:[function(e,t,r,n){"use strict";var o=e("feddc910f69a01a6"),a=e("b644f6b72647b399"),s=e("ba991daace2b8ed9");r._=function(e,t,r){return t=o._(t),s._(e,a._()?Reflect.construct(t,r||[],o._(e).constructor):t.apply(e,r))}},{feddc910f69a01a6:"NOGHw",b644f6b72647b399:"83nDe",ba991daace2b8ed9:"hd12h"}],NOGHw:[function(e,t,r,n){"use strict";function o(e){return r._=o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}r._=o},{}],"83nDe":[function(e,t,r,n){"use strict";function o(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(r._=o=function(){return!!e})()}r._=o},{}],hd12h:[function(e,t,r,n){"use strict";var o=e("f7151fe13994d2aa"),a=e("f18e81760bb14899");r._=function(e,t){return t&&("object"===a._(t)||"function"==typeof t)?t:o._(e)}},{f7151fe13994d2aa:"1tlYe",f18e81760bb14899:"iXhRw"}],"1tlYe":[function(e,t,r,n){"use strict";r._=function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},{}],iXhRw:[function(e,t,r,n){"use strict";r._=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}},{}],"4Uf9M":[function(e,t,r,n){"use strict";r._=function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}},{}],igUuK:[function(e,t,r,n){"use strict";function o(e,t){for(var r=0;r","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],"3vlyb":[function(e,t,r,n){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],qpMMf:[function(e,t,r,n){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"46D5s":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return k});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("../utils"),u=e("../utils/component"),p=o.interopDefault(u),f=e("./aspectRatio"),d=o.interopDefault(f),h=e("./close"),m=o.interopDefault(h),v=e("./flip"),g=o.interopDefault(v),y=e("./info"),b=o.interopDefault(y),j=e("./playbackRate"),w=o.interopDefault(j),_=e("./version"),x=o.interopDefault(_),k=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="contextmenu",r.$parent=e.template.$contextmenu,l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.option,n=t.proxy,o=t.template,a=o.$player,s=o.$contextmenu;r.playbackRate&&this.add((0,w.default)({name:"playbackRate",index:10})),r.aspectRatio&&this.add((0,d.default)({name:"aspectRatio",index:20})),r.flip&&this.add((0,g.default)({name:"flip",index:30})),this.add((0,b.default)({name:"info",index:40})),this.add((0,x.default)({name:"version",index:50})),this.add((0,m.default)({name:"close",index:60}));for(var i=0;iu+c&&(m=c-h),n+d>p+i&&(v=i-d),(0,l.setStyles)(s,{top:"".concat(v,"px"),left:"".concat(m,"px")})}}),n(a,"click",function(t){(0,l.includeFromEvent)(t,s)||(e.show=!1)}),this.art.on("blur",function(){e.show=!1})}}]),t}(p.default)},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","../utils":"hQMLb","../utils/component":"hXsfe","./aspectRatio":"dCCaf","./close":"j6SRT","./flip":"cyTC8","./info":"cU7aj","./playbackRate":"01vHs","./version":"64r3r","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQMLb:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var a=e("./compatibility");o.exportAll(a,r);var s=e("./dom");o.exportAll(s,r);var i=e("./error");o.exportAll(i,r);var c=e("./file");o.exportAll(c,r);var l=e("./format");o.exportAll(l,r);var u=e("./property");o.exportAll(u,r);var p=e("./subtitle");o.exportAll(p,r);var f=e("./time");o.exportAll(f,r)},{"./compatibility":"iDd6B","./dom":"7V5Cu","./error":"2cjgc","./file":"8XY4p","./format":"lHh8q","./property":"iccpW","./subtitle":"ctswB","./time":"8KDy9","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iDd6B:[function(e,t,r,n){var o,a,s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(r),s.export(r,"userAgent",function(){return i}),s.export(r,"isSafari",function(){return c}),s.export(r,"isIOS",function(){return l}),s.export(r,"isIOS13",function(){return u}),s.export(r,"isMobile",function(){return p}),s.export(r,"isBrowser",function(){return f});var i=null!=(a=null==(o=globalThis)?void 0:o.CUSTOM_USER_AGENT)?a:"undefined"!=typeof navigator?navigator.userAgent:"",c=/^(?:(?!chrome|android).)*safari/i.test(i),l=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,u=l||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||u,f="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7V5Cu":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",function(){return s}),o.export(r,"queryAll",function(){return i}),o.export(r,"addClass",function(){return c}),o.export(r,"removeClass",function(){return l}),o.export(r,"hasClass",function(){return u}),o.export(r,"append",function(){return p}),o.export(r,"remove",function(){return f}),o.export(r,"setStyle",function(){return d}),o.export(r,"setStyles",function(){return h}),o.export(r,"getStyle",function(){return m}),o.export(r,"siblings",function(){return v}),o.export(r,"inverseClass",function(){return g}),o.export(r,"tooltip",function(){return y}),o.export(r,"isInViewport",function(){return b}),o.export(r,"includeFromEvent",function(){return j}),o.export(r,"replaceElement",function(){return w}),o.export(r,"createElement",function(){return _}),o.export(r,"getIcon",function(){return x}),o.export(r,"setStyleText",function(){return k}),o.export(r,"supportsFlex",function(){return M}),o.export(r,"getRect",function(){return S}),o.export(r,"loadImg",function(){return E}),o.export(r,"getComposedPath",function(){return I});var a=e("./compatibility");function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return t.querySelector(e)}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return Array.from(t.querySelectorAll(e))}function c(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function u(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function f(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function h(e,t){for(var r in t)d(e,r,t[r]);return e}function m(e,t){var r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(n):n}function v(e){return Array.from(e.parentElement.children).filter(function(t){return t!==e})}function g(e,t){v(e).forEach(function(e){return l(e,t)}),c(e,t)}function y(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"top";a.isMobile||(e.setAttribute("aria-label",t),c(e,"hint--rounded"),c(e,"hint--".concat(r)))}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,a=r.top-t<=n&&r.top+r.height+t>=0,s=r.left-t<=o+t&&r.left+r.width+t>=0;return a&&s}function j(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function _(e){return document.createElement(e)}function x(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=_("i");return c(r,"art-icon"),c(r,"art-icon-".concat(e)),p(r,t),r}function k(e,t){var r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function M(){var e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function S(e){return e.getBoundingClientRect()}function E(e,t){return new Promise(function(r,n){var o=new Image;o.onload=function(){if(t&&1!==t){var a=document.createElement("canvas"),s=a.getContext("2d");a.width=o.width*t,a.height=o.height*t,s.drawImage(o,0,0,a.width,a.height),a.toBlob(function(t){var o=URL.createObjectURL(t),a=new Image;a.onload=function(){r(a)},a.onerror=function(){URL.revokeObjectURL(o),n(Error("Image load failed: ".concat(e)))},a.src=o})}else r(o)},o.onerror=function(){n(Error("Image load failed: ".concat(e)))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();for(var t=[],r=e.target;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"iDd6B","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2cjgc":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",function(){return c}),o.export(r,"errorHandle",function(){return l});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_inherits.cjs"),c=function(e){"use strict";function t(e,r){var n;return(0,s._)(this,t),n=(0,a._)(this,t,[e]),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(n,r||n.constructor),n.name="ArtPlayerError",n}return(0,i._)(t,e),t}((0,e("@swc/helpers/cjs/_wrap_native_super.cjs")._)(Error));function l(e,t){if(!e)throw new c(t);return e}},{"@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,t,r,n){"use strict";var o=e("c8857d56f4968279"),a=e("2ed7bdf1701f2d07"),s=e("5c5ad8846076b9cd"),i=e("2db6fa09e8a5be4c");function c(e){var t="function"==typeof Map?new Map:void 0;return r._=c=function(e){if(null===e||!s._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return o._(e,arguments,a._(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),i._(r,e)},c(e)}r._=c},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,t,r,n){"use strict";var o=e("62fc231ae2e75266"),a=e("3f98bf9d4f706151");function s(e,t,n){return o._()?r._=s=Reflect.construct:r._=s=function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&a._(o,r.prototype),o},s.apply(null,arguments)}r._=s},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,t,r,n){"use strict";r._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"8XY4p":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",function(){return function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}}),o.export(r,"download",function(){return a})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],lHh8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function s(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){if(!e)return"00:00";var t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*r);return(t>0?[t,r,n]:[r,n]).map(function(e){return e<10?"0".concat(e):String(e)}).join(":")}function c(e){return e.replace(/[&<>'"]/g,function(e){return({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e})}function l(e){var t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp("(".concat(Object.keys(t).join("|"),")"),"g");return e.replace(r,function(e){return t[e]||e})}o.defineInteropFlag(r),o.export(r,"clamp",function(){return a}),o.export(r,"capitalize",function(){return s}),o.export(r,"secondToTime",function(){return i}),o.export(r,"escape",function(){return c}),o.export(r,"unescape",function(){return l})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iccpW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",function(){return i}),o.export(r,"has",function(){return l}),o.export(r,"get",function(){return u}),o.export(r,"mergeDeep",function(){return function e(){for(var t=arguments.length,r=Array(t),n=0;ne.length)&&(t=e.length);for(var r=0,n=Array(t);r").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function s(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function i(e){var t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.split(/[:.]/).map(function(e,t,r){if(t===r.length-1){if(1===e.length)return".".concat(e,"00");if(2===e.length)return".".concat(e,"0")}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?".".concat(e):":".concat(e)}).join("")}return"WEBVTT\n"+"\n".concat(e.split(/\r?\n/).map(function(e){var n=e.match(t);return n?{start:r(n[1].trim()),end:r(n[2].trim()),text:n[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(function(e){return e.trim()}).join("\n")}:null}).filter(function(e){return e}).map(function(e,t){return e?"".concat(t+1,"\n")+"".concat(e.start," --\x3e ").concat(e.end)+"\n"+"".concat(e.text):""}).filter(function(e){return e.trim()}).join("\n\n"))}o.defineInteropFlag(r),o.export(r,"srtToVtt",function(){return a}),o.export(r,"vttToBlob",function(){return s}),o.export(r,"assToVtt",function(){return i})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"8KDy9":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new Promise(function(t){return setTimeout(t,e)})}function s(e,t){var r;return function(){for(var n=this,o=arguments.length,a=Array(o),s=0;s=Number(o.dataset.index)});s?s.insertAdjacentElement("beforebegin",o):(0,u.append)(this.$parent,o),r.html&&(0,u.append)(o,r.html),r.style&&(0,u.setStyles)(o,r.style),r.tooltip&&(0,u.tooltip)(o,r.tooltip);var i=[];if(r.click){var f=this.art.events.proxy(o,"click",function(e){e.preventDefault(),r.click.call(t.art,t,e)});i.push(f)}return r.selector&&["left","right"].includes(r.position)&&this.selector(r,o,i),this[n]=o,this.cache.set(n,{$ref:o,events:i,option:r}),r.mounted&&r.mounted.call(this.art,o),o}}},{key:"remove",value:function(e){(0,p.errorHandle)(this.cache.has(e),"Can't find [".concat(e,"] from the [").concat(this.name,"]"));var t=this.cache.get(e);t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);var r=!0,n=!1,o=void 0;try{for(var a,s=t.events[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var i=a.value;this.art.events.remove(i)}}catch(e){n=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw o}}this.cache.delete(e),delete this[e],(0,u.remove)(t.$ref)}},{key:"update",value:function(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","option-validator":"8zKz5","../scheme":"3Srhh","./dom":"7V5Cu","./error":"2cjgc","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3Srhh":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",function(){return m});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils"),c="array",l="boolean",u="string",p="number",f="object",d="function";function h(e,t,r){return(0,i.errorHandle)(t===u||t===p||e instanceof Element,"".concat(r.join(".")," require '").concat(u,"' or 'Element' type"))}var m={html:h,disable:"?".concat(l),name:"?".concat(u),index:"?".concat(p),style:"?".concat(f),click:"?".concat(d),mounted:"?".concat(d),tooltip:"?".concat(u,"|").concat(p),width:"?".concat(p),selector:"?".concat(c),onSelect:"?".concat(d),switch:"?".concat(l),onSwitch:"?".concat(d),range:"?".concat(c),onRange:"?".concat(d),onChange:"?".concat(d)};r.default={id:u,container:h,url:u,poster:u,type:u,theme:u,lang:u,volume:p,isLive:l,muted:l,autoplay:l,autoSize:l,autoMini:l,loop:l,flip:l,playbackRate:l,aspectRatio:l,screenshot:l,setting:l,hotkey:l,pip:l,mutex:l,backdrop:l,fullscreen:l,fullscreenWeb:l,subtitleOffset:l,miniProgressBar:l,useSSR:l,playsInline:l,lock:l,gesture:l,fastForward:l,autoPlayback:l,autoOrientation:l,airplay:l,proxy:"?".concat(d),plugins:[d],layers:[m],contextmenu:[m],settings:[m],controls:[(0,s._)((0,a._)({},m),{position:function(e,t,r){var n=["top","left","right"];return(0,i.errorHandle)(n.includes(e),"".concat(r.join(".")," only accept ").concat(n.toString()," as parameters"))}})],quality:[{default:"?".concat(l),html:u,url:u}],highlight:[{time:p,text:u}],thumbnails:{url:u,number:p,column:p,width:p,height:p,scale:p},subtitle:{url:u,name:u,type:u,style:f,escape:l,encoding:u,onVttLoad:d},moreVideoAttr:f,i18n:f,icons:f,cssVar:f,customType:f}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kyoEj:[function(e,t,r,n){"use strict";var o=e("9f9b8a24218ee51e");r._=function(e){for(var t=1;t').concat("default"===e?r.get("Default"):e,"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Aspect Ratio"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.aspectRatio=n,e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j6SRT:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Close"),click:function(e){e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cyTC8:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.FLIP.map(function(e){return'').concat(r.get((0,i.capitalize)(e)),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Video Flip"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.flip=n.toLowerCase(),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",function(t){var r=(0,i.queryAll)("span",e).find(function(e){return e.dataset.value===t});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cU7aj:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs");function i(e){return function(t){return(0,s._)((0,a._)({},e),{html:t.i18n.get("Video Info"),click:function(e){t.info.show=!0,e.show=!1}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"01vHs":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){var r=t.i18n,n=t.constructor.PLAYBACK_RATE.map(function(e){return'').concat(1===e?r.get("Normal"):e.toFixed(1),"")}).join("");return(0,s._)((0,a._)({},e),{html:"".concat(r.get("Play Speed"),": ").concat(n),click:function(e,r){var n=r.target.dataset.value;n&&(t.playbackRate=Number(n),e.show=!1)},mounted:function(e){var r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",function(){var r=(0,i.queryAll)("span",e).find(function(e){return Number(e.dataset.value)===t.playbackRate});r&&(0,i.inverseClass)(r,"art-current")})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"64r3r":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return function(e){return(0,s._)((0,a._)({},e),{html:'ArtPlayer '.concat(i.version,"")})}});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../../package.json")},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../../package.json":"2Jf7W","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9MunV":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return R});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_get.cjs"),u=e("@swc/helpers/cjs/_get_prototype_of.cjs"),p=e("@swc/helpers/cjs/_inherits.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),d=e("../utils"),h=e("../utils/component"),m=o.interopDefault(h),v=e("./airplay"),g=o.interopDefault(v),y=e("./fullscreen"),b=o.interopDefault(y),j=e("./fullscreenWeb"),w=o.interopDefault(j),_=e("./pip"),x=o.interopDefault(_),k=e("./playAndPause"),M=o.interopDefault(k),S=e("./progress"),E=o.interopDefault(S),I=e("./screenshot"),T=o.interopDefault(I),L=e("./setting"),C=o.interopDefault(L),O=e("./time"),F=o.interopDefault(O),D=e("./volume"),A=o.interopDefault(D),R=function(e){"use strict";function t(e){(0,i._)(this,t),(r=(0,s._)(this,t,[e])).isHover=!1,r.name="control",r.timer=Date.now();var r,n=e.constructor,o=r.art.template,a=o.$player,c=o.$bottom;return e.on("mousemove",function(){d.isMobile||(r.show=!0)}),e.on("click",function(){d.isMobile?r.toggle():r.show=!0}),e.on("document:mousemove",function(e){r.isHover=(0,d.includeFromEvent)(e,c)}),e.on("video:timeupdate",function(){!e.setting.show&&!r.isHover&&!e.isInput&&e.playing&&r.show&&Date.now()-r.timer>=n.CONTROL_HIDE_TIME&&(r.show=!1)}),e.on("control",function(e){e?((0,d.removeClass)(a,"art-hide-cursor"),(0,d.addClass)(a,"art-hover"),r.timer=Date.now()):((0,d.addClass)(a,"art-hide-cursor"),(0,d.removeClass)(a,"art-hover"))}),r.init(),r}return(0,p._)(t,e),(0,c._)(t,[{key:"init",value:function(){var e=this,t=this.art.option;t.isLive||this.add((0,E.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,M.default)({name:"playAndPause",position:"left",index:10})),this.add((0,A.default)({name:"volume",position:"left",index:20})),t.isLive||this.add((0,F.default)({name:"time",position:"left",index:30})),t.quality.length&&(0,d.sleep)().then(function(){e.art.quality=t.quality}),t.screenshot&&!d.isMobile&&this.add((0,T.default)({name:"screenshot",position:"right",index:20})),t.setting&&this.add((0,C.default)({name:"setting",position:"right",index:30})),t.pip&&this.add((0,x.default)({name:"pip",position:"right",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,g.default)({name:"airplay",position:"right",index:50})),t.fullscreenWeb&&this.add((0,w.default)({name:"fullscreenWeb",position:"right",index:60})),t.fullscreen&&this.add((0,b.default)({name:"fullscreen",position:"right",index:70}));for(var r=0;rt.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,n=Object.getOwnPropertySymbols(e);ot.indexOf(n[o])&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]]);return r}function u(e,t,r,n){var o,s=arguments.length,i=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(("undefined"==typeof Reflect?"undefined":(0,a._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(i=(s<3?o(i):s>3?o(t,r,i):o(t,r))||i);return s>3&&i&&Object.defineProperty(t,r,i),i}function p(e,t){return function(r,n){t(r,n,e)}}function f(e,t,r,n,o,s){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var c,l=n.kind,u="getter"===l?"get":"setter"===l?"set":"value",p=!t&&e?n.static?e:e.prototype:null,f=t||(p?Object.getOwnPropertyDescriptor(p,n.name):{}),d=!1,h=r.length-1;h>=0;h--){var m={};for(var v in n)m[v]="access"===v?{}:n[v];for(var v in n.access)m.access[v]=n.access[v];m.addInitializer=function(e){if(d)throw TypeError("Cannot add initializers after decoration has completed");s.push(i(e||null))};var g=(0,r[h])("accessor"===l?{get:f.get,set:f.set}:f[u],m);if("accessor"===l){if(void 0===g)continue;if(null===g||(void 0===g?"undefined":(0,a._)(g))!=="object")throw TypeError("Object expected");(c=i(g.get))&&(f.get=c),(c=i(g.set))&&(f.set=c),(c=i(g.init))&&o.unshift(c)}else(c=i(g))&&("field"===l?o.unshift(c):f[u]=c)}p&&Object.defineProperty(p,n.name,f),d=!0}function d(e,t,r){for(var n=arguments.length>2,o=0;o0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function _(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return s}function x(){for(var e=[],t=0;t1||i(e,t)})},t&&(n[e]=t(n[e])))}function i(e,t){try{var r;(r=o[e](t)).value instanceof S?Promise.resolve(r.value.v).then(c,l):u(a[0][2],r)}catch(e){u(a[0][3],e)}}function c(e){i("next",e)}function l(e){i("throw",e)}function u(e,t){e(t),a.shift(),a.length&&i(a[0][0],a[0][1])}}function I(e){var t,r;return t={},n("next"),n("throw",function(e){throw e}),n("return"),t[Symbol.iterator]=function(){return this},t;function n(n,o){t[n]=e[n]?function(t){return(r=!r)?{value:S(e[n](t)),done:!1}:o?o(t):t}:o}}function T(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e=w(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise(function(n,o){var a,s,i;a=n,s=o,i=(t=e[r](t)).done,Promise.resolve(t.value).then(function(e){a({value:e,done:i})},s)})}}}function L(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},O=function(e){return(O=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)};function F(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=O(e),n=0;n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n ',mounted:function(e){var a=null,s=!1,u=(0,i.query)(".art-progress-hover",e),p=(0,i.query)(".art-progress-loaded",e),f=(0,i.query)(".art-progress-played",e),d=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function v(r,n){var o=n||c(t,r),a=o.width;m.textContent=o.time;var s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-s,"px")):(0,i.setStyle)(m,"left","".concat(a-s/2,"px"))}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,n,o){var s="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(p,"width","".concat(100*n,"%")),"hover"===r&&(0,i.setStyle)(u,"width","".concat(100*n,"%")),"played"===r&&((0,i.setStyle)(f,"width","".concat(100*n,"%")),(0,i.setStyle)(h,"left","".concat(100*n,"%"))),s&&((0,i.setStyle)(m,"display","flex"),v(o,{width:e.clientWidth*n,time:(0,i.secondToTime)(n*t.duration)}),clearTimeout(a),a=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){d.textContent="";for(var e=0;e');(0,i.append)(d,a)}}),t.constructor.USE_RAF?t.on("raf",function(){t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",function(){t.emit("setBar","played",t.played)}),t.on("video:progress",function(){t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",function(){t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",function(e){e.target!==h&&l(t,e)}),o(e,"mousemove",function(r){var n,o,a=c(t,r).percentage;(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,d))?(n=c(t,r).width,m.textContent=r.target.dataset.text,n<=(o=m.clientWidth)/2?(0,i.setStyle)(m,"left",0):n>e.clientWidth-o/2?(0,i.setStyle)(m,"left","".concat(e.clientWidth-o,"px")):(0,i.setStyle)(m,"left","".concat(n-o/2,"px"))):v(r)}),o(e,"mouseleave",function(e){(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",function(e){s=0===e.button}),t.on("document:mousemove",function(e){if(s){var r=c(t,e),n=r.second,o=r.percentage;t.emit("setBar","played",o,e),t.seek=n}}),t.on("document:mouseup",function(){s&&(s=!1)}))}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4LBtY":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Screenshot"),mounted:function(e){var r=t.proxy,n=t.icons;(0,i.append)(e,n.screenshot),r(e,"click",function(){t.screenshot()})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hXIX5:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{tooltip:t.i18n.get("Show Setting"),mounted:function(e){var r=t.proxy,n=t.icons,o=t.i18n;(0,i.append)(e,n.setting),r(e,"click",function(){t.setting.toggle(),t.setting.resize()}),t.on("setting",function(t){(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7Zm5j":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_object_spread.cjs"),s=e("@swc/helpers/cjs/_object_spread_props.cjs"),i=e("../utils");function c(e){return function(t){return(0,s._)((0,a._)({},e),{style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:function(e){function r(){var r="".concat((0,i.secondToTime)(t.currentTime)," / ").concat((0,i.secondToTime)(t.duration));r!==e.textContent&&(e.textContent=r)}r();for(var n=["video:loadedmetadata","video:timeupdate","video:progress"],o=0;o
    '),c=(0,i.append)(s,'
    '),l=(0,i.append)(c,'
    '),u=(0,i.append)(c,'
    '),p=(0,i.append)(u,'
    '),f=(0,i.append)(p,'
    '),d=(0,i.append)(u,'
    ');function h(e){var t=(0,i.getRect)(u),r=t.top,n=t.height;return 1-(e.clientY-r)/n}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(a,"display","flex"),(0,i.setStyle)(d,"top","100%"),(0,i.setStyle)(f,"top","100%"),l.textContent=0;else{var e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(a,"display","none"),(0,i.setStyle)(d,"top","".concat(100-e,"%")),(0,i.setStyle)(f,"top","".concat(100-e,"%")),l.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",function(){t.muted=!0}),r(a,"click",function(){t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{var v=!1;r(u,"mousedown",function(e){v=0===e.button,t.volume=h(e)}),t.on("document:mousemove",function(e){v&&(t.muted=!1,t.volume=h(e))}),t.on("document:mouseup",function(){v&&(v=!1)})}}})}}},{"@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kSrJ9:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("./clickInit"),c=o.interopDefault(i),l=e("./gestureInit"),u=o.interopDefault(l),p=e("./globalInit"),f=o.interopDefault(p),d=e("./hoverInit"),h=o.interopDefault(d),m=e("./moveInit"),v=o.interopDefault(m),g=e("./resizeInit"),y=o.interopDefault(g),b=e("./updateInit"),j=o.interopDefault(b),w=e("./viewInit"),_=o.interopDefault(w),x=function(){"use strict";function e(t){(0,a._)(this,e),this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,c.default)(t,this),(0,h.default)(t,this),(0,v.default)(t,this),(0,y.default)(t,this),(0,u.default)(t,this),(0,_.default)(t,this),(0,f.default)(t,this),(0,j.default)(t,this)}return(0,s._)(e,[{key:"proxy",value:function(e,t,r){var n=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Array.isArray(t))return t.map(function(t){return n.proxy(e,t,r,o)});e.addEventListener(t,r,o);var a=function(){return e.removeEventListener(t,r,o)};return this.destroyEvents.add(a),a}},{key:"hover",value:function(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}},{key:"remove",value:function(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}},{key:"destroy",value:function(){var e=!0,t=!1,r=void 0;try{for(var n,o=this.destroyEvents[Symbol.iterator]();!(e=(n=o.next()).done);e=!0){var a=n.value;try{a()}catch(e){console.warn("Failed to destroy event listener:",e)}}}catch(e){t=!0,r=e}finally{try{e||null==o.return||o.return()}finally{if(t)throw r}}this.destroyEvents.clear()}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","./clickInit":"eyr86","./gestureInit":"7TxZr","./globalInit":"hOg1v","./hoverInit":"7OoRN","./moveInit":"6UdvL","./resizeInit":"csHAr","./updateInit":"jOkhG","./viewInit":"k3U5a","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],eyr86:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e,t){var r=e.constructor,n=e.template,o=n.$player,s=n.$video;function i(t){(0,a.includeFromEvent)(t,o)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",i),e.on("document:contextmenu",i);var c=[];t.proxy(s,"click",function(t){var n=Date.now();c.push(n);var o=r.MOBILE_CLICK_PLAY,s=r.DBCLICK_TIME,i=r.MOBILE_DBCLICK_PLAY,l=r.DBCLICK_FULLSCREEN,u=c.filter(function(e){return n-e<=s});switch(u.length){case 1:e.emit("click",t),a.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),c=u;break;case 2:e.emit("dblclick",t),a.isMobile?!e.isLock&&i&&e.toggle():l&&(e.fullscreen=!e.fullscreen),c=[];break;default:c=[]}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7TxZr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("../control/progress"),s=e("../utils");function i(e,t){if(s.isMobile&&!e.option.isLive){var r=e.template,n=r.$video,o=r.$progress,i=null,c=!1,l=0,u=0,p=0,f=function(t){if(1===t.touches.length&&!e.isLock){i===o&&(0,a.setCurrentTime)(e,t),c=!0;var r=t.touches[0],n=r.pageX,s=r.pageY;l=n,u=s,p=e.currentTime}},d=function(t){if(1===t.touches.length&&c&&e.duration){var r=t.touches[0],o=r.pageX,a=r.pageY,f=function(e,t,r,n){var o=t-n,a=r-e,s=0;if(2>Math.abs(a)&&2>Math.abs(o))return s;var i=180*Math.atan2(o,a)/Math.PI;return i>=-45&&i<45?s=4:i>=45&&i<135?s=1:i>=-135&&i<-45?s=2:(i>=135&&i<=180||i>=-180&&i<-135)&&(s=3),s}(l,u,o,a),d=[3,4].includes(f),h=[1,2].includes(f);if(d&&!e.isRotate||h&&e.isRotate){var m=(0,s.clamp)((o-l)/e.width,-1,1),v=(0,s.clamp)((a-u)/e.height,-1,1),g=e.isRotate?v:m,y=i===n?e.constructor.TOUCH_MOVE_RATIO:1,b=(0,s.clamp)(p+e.duration*g*y,0,e.duration);e.seek=b,e.emit("setBar","played",(0,s.clamp)(b/e.duration,0,1),t),e.notice.show="".concat((0,s.secondToTime)(b)," / ").concat((0,s.secondToTime)(e.duration))}}};e.option.gesture&&(t.proxy(n,"touchstart",function(e){i=n,f(e)}),t.proxy(n,"touchmove",d)),t.proxy(o,"touchstart",function(e){i=o,f(e)}),t.proxy(o,"touchmove",d),e.on("document:touchend",function(){c&&(l=0,u=0,p=0,c=!1,i=null)})}}},{"../control/progress":"lLsXv","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hOg1v:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function a(e,t){var r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],n=["resize","scroll","orientationchange"],o=[];function a(){for(var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=0;s'},{}],kX2ah:[function(e,t,r,n){t.exports=''},{}],cYqbE:[function(e,t,r,n){t.exports=''},{}],dCZ1q:[function(e,t,r,n){t.exports=''},{}],enWOR:[function(e,t,r,n){t.exports=''},{}],aEYUh:[function(e,t,r,n){t.exports=''},{}],"6sWtx":[function(e,t,r,n){t.exports=''},{}],bhixJ:[function(e,t,r,n){t.exports=''},{}],aonuB:[function(e,t,r,n){t.exports=''},{}],hbNgp:[function(e,t,r,n){t.exports=''},{}],aNXxH:[function(e,t,r,n){t.exports=''},{}],ezk36:[function(e,t,r,n){t.exports=''},{}],kPsyz:[function(e,t,r,n){t.exports=''},{}],cUJ9T:[function(e,t,r,n){t.exports=''},{}],"9MnDP":[function(e,t,r,n){t.exports=''},{}],gtJ8Q:[function(e,t,r,n){t.exports=''},{}],luvRR:[function(e,t,r,n){t.exports=''},{}],"2VikP":[function(e,t,r,n){t.exports=''},{}],"9eYwu":[function(e,t,r,n){t.exports=''},{}],"5m73X":[function(e,t,r,n){t.exports=''},{}],"2ZLsh":[function(e,t,r,n){t.exports=''},{}],fXkDR:[function(e,t,r,n){t.exports=''},{}],jcnGd:[function(e,t,r,n){t.exports=''},{}],"2QwX5":[function(e,t,r,n){t.exports=''},{}],"9oiD9":[function(e,t,r,n){t.exports=''},{}],"68oNy":[function(e,t,r,n){t.exports=''},{}],j2oAd:[function(e,t,r,n){t.exports=''},{}],"9sVMb":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return p});var a=e("@swc/helpers/cjs/_call_super.cjs"),s=e("@swc/helpers/cjs/_class_call_check.cjs"),i=e("@swc/helpers/cjs/_create_class.cjs"),c=e("@swc/helpers/cjs/_inherits.cjs"),l=e("./utils"),u=e("./utils/component"),p=function(e){"use strict";function t(e){var r;return(0,s._)(this,t),(r=(0,a._)(this,t,[e])).name="info",l.isMobile||r.init(),r}return(0,c._)(t,e),(0,i._)(t,[{key:"init",value:function(){var e=this,t=this.art,r=t.proxy,n=t.constructor,o=t.template,a=o.$infoPanel,s=o.$infoClose,i=o.$video;r(s,"click",function(){e.show=!1});var c=null,u=(0,l.queryAll)("[data-video]",a)||[];this.art.on("destroy",function(){return clearTimeout(c)}),!function e(){for(var t=0;tu?((0,a.setStyle)(o,"width","".concat(u*l,"px")),(0,a.setStyle)(o,"height","100%"),(0,a.setStyle)(o,"margin","0 auto")):((0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","".concat(c/u,"px")),(0,a.setStyle)(o,"margin","auto 0")),s.dataset.aspectRatio=n}r.show="".concat(t.get("Aspect Ratio"),": ").concat("default"===n?t.get("Default"):n),e.emit("aspectRatio",n)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],rWA5h:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"attr",{value:function(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ekP8q:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$video;(0,a.def)(e,"autoHeight",{value:function(){var t=r.clientWidth,o=n.videoHeight,s=t/n.videoWidth*o;(0,a.setStyle)(r,"height","".concat(s,"px")),e.emit("autoHeight",s)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3d2R8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template,r=t.$container,n=t.$player,o=t.$video;(0,a.def)(e,"autoSize",{value:function(){var t=o.videoWidth,s=o.videoHeight,i=(0,a.getRect)(r),c=i.width,l=i.height,u=t/s;c/l>u?((0,a.setStyle)(n,"width","".concat(l*u/c*100,"%")),(0,a.setStyle)(n,"height","100%")):((0,a.setStyle)(n,"width","100%"),(0,a.setStyle)(n,"height","".concat(c/u/l*100,"%"))),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2nLRH":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$player;(0,a.def)(e,"cssVar",{value:function(e,r){return r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3lhzv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"currentTime",{get:function(){return t.currentTime||0},set:function(r){Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,a.clamp)(r,0,e.duration))}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hQmmf:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"duration",{get:function(){var t=e.template.$video.duration;return t===1/0?0:t||0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1KU3q":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return u});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../config"),c=o.interopDefault(i),l=e("../utils");function u(e){for(var t=e.i18n,r=e.notice,n=e.option,o=e.constructor,i=e.proxy,u=e.template,p=u.$player,f=u.$video,d=u.$poster,h=0,m=0;m0&&void 0!==arguments[0]?arguments[0]:document.documentElement,t=arguments.length>1?arguments[1]:void 0;return new Promise(function(r,n){var o=function(){c.off("change",o),r()};c.on("change",o);var a=e[s.requestFullscreen](t);a instanceof Promise&&a.then(o).catch(n)})},exit:function(){return new Promise(function(e,t){if(!c.isFullscreen)return void e();var r=function(){c.off("change",r),e()};c.on("change",r);var n=document[s.exitFullscreen]();n instanceof Promise&&n.then(r).catch(t)})},toggle:function(e,t){return c.isFullscreen?c.exit():c.request(e,t)},onchange:function(e){c.on("change",e)},onerror:function(e){c.on("error",e)},on:function(e,t){var r=i[e];r&&document.addEventListener(r,t,!1)},off:function(e,t){var r=i[e];r&&document.removeEventListener(r,t,!1)},raw:s};Object.defineProperties(c,{isFullscreen:{get:function(){return!!document[s.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[s.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return!!document[s.fullscreenEnabled]}}}),r.default=c},{"@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gIQTH:[function(e,t,r,n){"use strict";var o=e("d7c30a5ae0c1ab2"),a=e("3aacfce52f67defd"),s=e("f0dae09a1a08b16a"),i=e("83f3648e614d0830");r._=function(e,t){return o._(e)||a._(e,t)||i._(e,t)||s._()}},{d7c30a5ae0c1ab2:"3QSPl","3aacfce52f67defd":"5SSeo",f0dae09a1a08b16a:"heYSj","83f3648e614d0830":"fh7mx"}],"3QSPl":[function(e,t,r,n){"use strict";r._=function(e){if(Array.isArray(e))return e}},{}],"5SSeo":[function(e,t,r,n){"use strict";r._=function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],s=!0,i=!1;try{for(o=o.call(e);!(s=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);s=!0);}catch(e){i=!0,n=e}finally{try{s||null==o.return||o.return()}finally{if(i)throw n}}return a}}},{}],heYSj:[function(e,t,r,n){"use strict";r._=function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},{}],itVYl:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.template,n=r.$container,o=r.$player,s="";(0,a.def)(e,"fullscreenWeb",{get:function(){return(0,a.hasClass)(o,"art-fullscreen-web")},set:function(r){r?(s=o.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(document.body,o),e.state="fullscreenWeb",(0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","100%"),(0,a.addClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(n,o),s&&(o.style.cssText=s,s=""),(0,a.removeClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],dE0YW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"loaded",{get:function(){return e.loadedTime/t.duration}}),(0,a.def)(e,"loadedTime",{get:function(){return t.buffered.length?t.buffered.end(t.buffered.length-1):0}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],kwpHL:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.icons,r=e.proxy,n=e.storage,o=e.template,s=o.$player,i=o.$video,c=!1,l=0,u=0;function p(){var t=e.template.$mini;t&&((0,a.removeClass)(s,"art-mini"),(0,a.setStyle)(t,"display","none"),s.prepend(i),e.emit("mini",!1))}function f(t,r){e.playing?((0,a.setStyle)(t,"display","none"),(0,a.setStyle)(r,"display","flex")):((0,a.setStyle)(t,"display","flex"),(0,a.setStyle)(r,"display","none"))}function d(){var t=e.template.$mini,r=(0,a.getRect)(t),o=window.innerHeight-r.height-50,s=window.innerWidth-r.width-50;n.set("top",o),n.set("left",s),(0,a.setStyle)(t,"top","".concat(o,"px")),(0,a.setStyle)(t,"left","".concat(s,"px"))}(0,a.def)(e,"mini",{get:function(){return(0,a.hasClass)(s,"art-mini")},set:function(o){if(o){e.state="mini",(0,a.addClass)(s,"art-mini");var h=function(){var o=e.template.$mini;if(o)return(0,a.append)(o,i),(0,a.setStyle)(o,"display","flex");var s=(0,a.createElement)("div");(0,a.addClass)(s,"art-mini-popup"),(0,a.append)(document.body,s),e.template.$mini=s,(0,a.append)(s,i);var d=(0,a.append)(s,'
    ');(0,a.append)(d,t.close),r(d,"click",p);var h=(0,a.append)(s,'
    '),m=(0,a.append)(h,t.play),v=(0,a.append)(h,t.pause);return r(m,"click",function(){return e.play()}),r(v,"click",function(){return e.pause()}),f(m,v),e.on("video:playing",function(){return f(m,v)}),e.on("video:pause",function(){return f(m,v)}),e.on("video:timeupdate",function(){return f(m,v)}),r(s,"mousedown",function(e){c=0===e.button,l=e.pageX,u=e.pageY}),e.on("document:mousemove",function(e){if(c){(0,a.addClass)(s,"art-mini-dragging");var t=e.pageX-l,r=e.pageY-u;(0,a.setStyle)(s,"transform","translate(".concat(t,"px, ").concat(r,"px)"))}}),e.on("document:mouseup",function(){if(c){c=!1,(0,a.removeClass)(s,"art-mini-dragging");var e=(0,a.getRect)(s);n.set("left",e.left),n.set("top",e.top),(0,a.setStyle)(s,"left","".concat(e.left,"px")),(0,a.setStyle)(s,"top","".concat(e.top,"px")),(0,a.setStyle)(s,"transform",null)}}),s}(),m=n.get("top"),v=n.get("left");"number"==typeof m&&"number"==typeof v?((0,a.setStyle)(h,"top","".concat(m,"px")),(0,a.setStyle)(h,"left","".concat(v,"px")),(0,a.isInViewport)(h)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"72iXq":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.option,r=e.storage,n=e.template,o=n.$video,s=n.$poster;for(var i in t.moreVideoAttr)e.attr(i,t.moreVideoAttr[i]);t.muted&&(e.muted=t.muted),t.volume&&(o.volume=(0,a.clamp)(t.volume,0,1));var c=r.get("volume");for(var l in"number"==typeof c&&(o.volume=(0,a.clamp)(c,0,1)),t.poster&&(0,a.setStyle)(s,"backgroundImage","url(".concat(t.poster,")")),t.autoplay&&(o.autoplay=t.autoplay),t.playsInline&&(o.playsInline=!0,o["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(l,t.cssVar[l]);e.url=t.url}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"1B8xv":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"pause",{value:function(){var o=t.pause();return n.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"2ayfA":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t,r,n,o,s=e.i18n,i=e.notice,c=e.template.$video;document.pictureInPictureEnabled?(t=e.template.$video,r=e.proxy,n=e.notice,t.disablePictureInPicture=!1,(0,a.def)(e,"pip",{get:function(){return document.pictureInPictureElement},set:function(r){r?(e.state="pip",t.requestPictureInPicture().catch(function(e){throw n.show=e,e})):document.exitPictureInPicture().catch(function(e){throw n.show=e,e})}}),r(t,"enterpictureinpicture",function(){e.emit("pip",!0)}),r(t,"leavepictureinpicture",function(){e.emit("pip",!1)})):c.webkitSupportsPresentationMode?((o=e.template.$video).webkitSetPresentationMode("inline"),(0,a.def)(e,"pip",{get:function(){return"picture-in-picture"===o.webkitPresentationMode},set:function(t){t?(e.state="pip",o.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(o.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})):(0,a.def)(e,"pip",{get:function(){return!1},set:function(){i.show=s.get("PIP Not Supported")}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4pWSp":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice;(0,a.def)(e,"playbackRate",{get:function(){return t.playbackRate},set:function(o){o?o!==t.playbackRate&&(t.playbackRate=o,n.show="".concat(r.get("Rate"),": ").concat(1===o?r.get("Normal"):"".concat(o,"x"))):e.playbackRate=1}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3GKs4":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"played",{get:function(){return e.currentTime/e.duration}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],in83u:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video;(0,a.def)(e,"playing",{get:function(){return"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cVJNG:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.i18n,r=e.notice,n=e.option,o=e.constructor.instances,c=e.template.$video;(0,i.def)(e,"play",{value:function(){return(0,a._)(function(){var a,i,l;return(0,s._)(this,function(s){switch(s.label){case 0:return[4,c.play()];case 1:if(a=s.sent(),r.show=t.get("Play"),e.emit("play"),n.mutex)for(i=0;i0&&jo.clientWidth-m/2?(0,i.setStyle)(a,"left","".concat(o.clientWidth-m,"px")):(0,i.setStyle)(a,"left","".concat(t-m/2,"px"))}}(j):i.isMobile||(0,i.setStyle)(m,"display","none"),b&&(clearTimeout(l),l=setTimeout(function(){(0,i.setStyle)(m,"display","none")},500)),s.label=3;case 3:return[2]}})})()}),(0,i.def)(e,"thumbnails",{get:function(){return e.option.thumbnails},set:function(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(l),l=null,u=null,p=!1,f=!1)}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],bdo2A:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"toggle",{value:function(){return e.playing?e.pause():e.play()}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"7uOqt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){(0,a.def)(e,"type",{get:function(){return e.option.type},set:function(t){e.option.type=t}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4QAa0":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return c});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_ts_generator.cjs"),i=e("../utils");function c(e){var t=e.option,r=e.template.$video;(0,i.def)(e,"url",{get:function(){return r.src},set:function(n){return(0,a._)(function(){var o,a,c;return(0,s._)(this,function(s){switch(s.label){case 0:if(!n)return[3,4];if(o=e.url,a=t.type||(0,i.getExt)(n),c=t.customType[a],!(a&&c))return[3,2];return[4,(0,i.sleep)()];case 1:return s.sent(),e.loading.show=!0,c.call(e,r,n,e),[3,3];case 2:URL.revokeObjectURL(o),r.src=n,s.label=3;case 3:return o!==e.url&&(e.option.url=n,e.isReady&&o&&e.once("video:canplay",function(){e.emit("restart",n)})),[3,6];case 4:return[4,(0,i.sleep)()];case 5:s.sent(),e.loading.show=!0,s.label=6;case 6:return[2]}})})()}})}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3sLEt":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.template.$video,r=e.i18n,n=e.notice,o=e.storage;(0,a.def)(e,"volume",{get:function(){return t.volume||0},set:function(e){t.volume=(0,a.clamp)(e,0,1),n.show="".concat(r.get("Volume"),": ").concat(Number.parseInt(100*t.volume,10)),0!==t.volume&&o.set("volume",t.volume)}}),(0,a.def)(e,"muted",{get:function(){return t.muted},set:function(r){t.muted=r,e.emit("muted",r)}})}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"83Crr":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return y});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../utils"),c=e("./autoOrientation"),l=o.interopDefault(c),u=e("./autoPlayback"),p=o.interopDefault(u),f=e("./fastForward"),d=o.interopDefault(f),h=e("./lock"),m=o.interopDefault(h),v=e("./miniProgressBar"),g=o.interopDefault(v),y=function(){"use strict";function e(t){(0,a._)(this,e),this.art=t,this.id=0;var r=t.option;r.miniProgressBar&&!r.isLive&&this.add(g.default),r.lock&&i.isMobile&&this.add(m.default),r.autoPlayback&&!r.isLive&&this.add(p.default),r.autoOrientation&&i.isMobile&&this.add(l.default),r.fastForward&&i.isMobile&&!r.isLive&&this.add(d.default);for(var n=0;nt&&rn}return e.on("fullscreenWeb",function(t){if(t){if(f()){var n;setTimeout(function(){var t,r;e.fullscreenWeb&&!(0,i.hasClass)(o,l)&&(t=document.documentElement.clientWidth,r=document.documentElement.clientHeight,(0,i.setStyle)(o,"width","".concat(r,"px")),(0,i.setStyle)(o,"height","".concat(t,"px")),(0,i.setStyle)(o,"transform-origin","0 0"),(0,i.setStyle)(o,"transform","rotate(90deg) translate(0, -".concat(t,"px)")),(0,i.addClass)(o,l),e.isRotate=!0,e.emit("resize"))},Number(null!=(n=r.AUTO_ORIENTATION_TIME)?n:0))}}else(0,i.hasClass)(o,l)&&((0,i.setStyle)(o,"width",""),(0,i.setStyle)(o,"height",""),(0,i.setStyle)(o,"transform-origin",""),(0,i.setStyle)(o,"transform",""),(0,i.removeClass)(o,l),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",function(e){return(0,a._)(function(){var r,n,a,c,l;return(0,s._)(this,function(s){switch(s.label){case 0:if(a=!!(null==(n=screen)||null==(r=n.orientation)?void 0:r.lock),!e)return[3,5];if(!(a&&f()))return[3,4];s.label=1;case 1:return s.trys.push([1,3,,4]),c=screen.orientation.type.startsWith("portrait")?"landscape":"portrait",[4,screen.orientation.lock(c)];case 2:return s.sent(),p=!0,(0,i.addClass)(o,u),[3,4];case 3:return l=s.sent(),p=!1,t.show=l,[3,4];case 4:return[3,6];case 5:if((0,i.hasClass)(o,u)&&(0,i.removeClass)(o,u),a&&p){try{screen.orientation.unlock()}catch(e){}p=!1}s.label=6;case 6:return[2]}})})()}),{name:"autoOrientation",get state(){return(0,i.hasClass)(o,l)}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"76uK8":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.i18n,r=e.icons,n=e.storage,o=e.constructor,s=e.proxy,i=e.template.$poster,c=e.layers.add({name:"auto-playback",html:'\n
    \n
    \n
    \n '}),l=(0,a.query)(".art-auto-playback-last",c),u=(0,a.query)(".art-auto-playback-jump",c),p=(0,a.query)(".art-auto-playback-close",c);(0,a.append)(p,r.close);var f=null;function d(){var r=(n.get("times")||{})[e.option.id||e.option.url];clearTimeout(f),(0,a.setStyle)(c,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,a.setStyle)(c,"display","flex"),l.textContent="".concat(t.get("Last Seen")," ").concat((0,a.secondToTime)(r)),u.textContent=t.get("Jump Play"),s(p,"click",function(){(0,a.setStyle)(c,"display","none")}),s(u,"click",function(){e.seek=r,e.play(),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(c,"display","none")}),e.once("video:timeupdate",function(){f=setTimeout(function(){(0,a.setStyle)(c,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",function(){if(e.playing){var t=n.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,n.set("times",t)}}),e.on("ready",d),e.on("restart",d),{name:"auto-playback",get times(){return n.get("times")||{}},clear:function(){return n.del("times")},delete:function(e){var t=n.get("times")||{};return delete t[e],n.set("times",t),t}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],gLGPW:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.constructor,r=e.proxy,n=e.template,o=n.$player,s=n.$video,i=null,c=!1,l=1,u=function(){clearTimeout(i),c&&(c=!1,e.playbackRate=l,(0,a.removeClass)(o,"art-fast-forward"))};return r(s,"touchstart",function(r){1===r.touches.length&&e.playing&&!e.isLock&&(i=setTimeout(function(){c=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,a.addClass)(o,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",u),e.on("document:touchend",u),{name:"fastForward",get state(){return(0,a.hasClass)(o,"art-fast-forward")}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"9btcI":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){var t=e.layers,r=e.icons,n=e.template.$player;function o(){return(0,a.hasClass)(n,"art-lock")}function s(){(0,a.addClass)(n,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function i(){(0,a.removeClass)(n,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted:function(t){var n=(0,a.append)(t,r.lock),o=(0,a.append)(t,r.unlock);(0,a.setStyle)(n,"display","none"),e.on("lock",function(e){e?((0,a.setStyle)(n,"display","inline-flex"),(0,a.setStyle)(o,"display","none")):((0,a.setStyle)(n,"display","none"),(0,a.setStyle)(o,"display","inline-flex"))})},click:function(){o()?i():s()}}),{name:"lock",get state(){return o()},set state(value){value?s():i()}}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],iSnmg:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return s});var a=e("../utils");function s(e){return e.on("control",function(t){t?(0,a.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,a.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4ARoj":[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return x});var a=e("@swc/helpers/cjs/_async_to_generator.cjs"),s=e("@swc/helpers/cjs/_call_super.cjs"),i=e("@swc/helpers/cjs/_class_call_check.cjs"),c=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),u=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("../utils"),d=e("../utils/component"),h=o.interopDefault(d),m=e("./aspectRatio"),v=o.interopDefault(m),g=e("./flip"),y=o.interopDefault(g),b=e("./playbackRate"),j=o.interopDefault(b),w=e("./subtitleOffset"),_=o.interopDefault(w),x=function(e){"use strict";function t(e){(0,i._)(this,t);var r=(0,s._)(this,t,[e]),n=e.option,o=e.controls,a=e.template.$setting;return r.name="setting",r.$parent=a,r.id=0,r.active=null,r.cache=new Map,r.option=(0,u._)(r.builtin).concat((0,u._)(n.settings)),n.setting&&(r.format(),r.render(),e.on("blur",function(){r.show&&(r.show=!1,r.render())}),e.on("focus",function(e){var t=(0,f.includeFromEvent)(e,o.setting),n=(0,f.includeFromEvent)(e,r.$parent);!r.show||t||n||(r.show=!1,r.render())}),e.on("resize",function(){return r.resize()})),r}return(0,l._)(t,e),(0,c._)(t,[{key:"builtin",get:function(){var e=[],t=this.art.option;return t.playbackRate&&e.push((0,j.default)(this.art)),t.aspectRatio&&e.push((0,v.default)(this.art)),t.flip&&e.push((0,y.default)(this.art)),t.subtitleOffset&&e.push((0,_.default)(this.art)),e}},{key:"traverse",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.option,r=0;r0&&void 0!==arguments[0]?arguments[0]:this.option,r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=0;a0&&void 0!==arguments[0]?arguments[0]:"",t=null;return this.traverse(function(r){r.name===e&&(t=r)}),t}},{key:"resize",value:function(){var e=this.art,t=e.controls,r=e.constructor,n=r.SETTING_WIDTH,o=r.SETTING_ITEM_HEIGHT,a=e.template,s=a.$player,i=a.$setting;if(t.setting&&this.show){var c,l,u=(null==(l=this.active[0])||null==(c=l.$parent)?void 0:c.width)||n,p=(0,f.getRect)(t.setting),d=p.left,h=p.width,m=(0,f.getRect)(s),v=m.left,g=m.width,y=d-v+h/2-u/2,b=this.active===this.option?this.active.length*o:(this.active.length+1)*o;if((0,f.setStyle)(i,"height","".concat(b,"px")),(0,f.setStyle)(i,"width","".concat(u,"px")),this.art.isRotate||f.isMobile)return;y+u>g?((0,f.setStyle)(i,"left",null),(0,f.setStyle)(i,"right",null)):((0,f.setStyle)(i,"left","".concat(y,"px")),(0,f.setStyle)(i,"right","auto"))}}},{key:"inactivate",value:function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:this.option;return t.push(e),this.format(),this.createItem(e),this.render(),e}},{key:"createHeader",value:function(e){var t=this;if(this.cache.has(e.$option)){var r=this.cache.get(e.$option),n=this.art,o=n.proxy,a=n.icons.arrowLeft,s=n.constructor.SETTING_ITEM_HEIGHT,i=(0,f.createElement)("div");(0,f.setStyle)(i,"height","".concat(s,"px")),(0,f.addClass)(i,"art-setting-item"),(0,f.addClass)(i,"art-setting-item-back");var c=(0,f.append)(i,'
    '),l=(0,f.createElement)("div");(0,f.addClass)(l,"art-setting-item-left-icon"),(0,f.append)(l,a),(0,f.append)(c,l),(0,f.append)(c,e.$parent.html);var u=o(i,"click",function(){return t.render(e.$parents)});e.$parent.$events.push(u),(0,f.append)(r,i)}}},{key:"createItem",value:function(e){var t,r,n=this,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.cache.has(e.$option)){var s=this.cache.get(e.$option),i=e.$item,c="selector";(0,f.has)(e,"switch")&&(c="switch"),(0,f.has)(e,"range")&&(c="range"),(0,f.has)(e,"onClick")&&(c="button");var l=this.art,d=l.icons,h=l.proxy,m=l.constructor,v=(0,f.createElement)("div");(0,f.addClass)(v,"art-setting-item"),(0,f.setStyle)(v,"height","".concat(m.SETTING_ITEM_HEIGHT,"px")),v.dataset.name=e.name||"",v.dataset.value=e.value||"";var g=(0,f.append)(v,'
    '),y=(0,f.append)(v,'
    '),b=(0,f.createElement)("div");switch((0,f.addClass)(b,"art-setting-item-left-icon"),c){case"button":case"switch":case"range":(0,f.append)(b,e.icon||d.config);break;case"selector":(null==(t=e.selector)?void 0:t.length)?(0,f.append)(b,e.icon||d.config):(0,f.append)(b,d.check)}(0,f.append)(g,b),(0,f.def)(e,"$icon",{configurable:!0,get:function(){return b}}),(0,f.def)(e,"icon",{configurable:!0,get:function(){return b.innerHTML},set:function(e){b.innerHTML="",(0,f.append)(b,e)}});var j=(0,f.createElement)("div");(0,f.addClass)(j,"art-setting-item-left-text"),(0,f.append)(j,e.html||""),(0,f.append)(g,j),(0,f.def)(e,"$html",{configurable:!0,get:function(){return j}}),(0,f.def)(e,"html",{configurable:!0,get:function(){return j.innerHTML},set:function(e){j.innerHTML="",(0,f.append)(j,e)}});var w=(0,f.createElement)("div");switch((0,f.addClass)(w,"art-setting-item-right-tooltip"),(0,f.append)(w,e.tooltip||""),(0,f.append)(y,w),(0,f.def)(e,"$tooltip",{configurable:!0,get:function(){return w}}),(0,f.def)(e,"tooltip",{configurable:!0,get:function(){return w.innerHTML},set:function(e){w.innerHTML="",(0,f.append)(w,e)}}),c){case"switch":var _=(0,f.createElement)("div");(0,f.addClass)(_,"art-setting-item-right-icon");var x=(0,f.append)(_,d.switchOn),k=(0,f.append)(_,d.switchOff);(0,f.setStyle)(e.switch?k:x,"display","none"),(0,f.append)(y,_),(0,f.def)(e,"$switch",{configurable:!0,get:function(){return _}});var M=e.switch;(0,f.def)(e,"switch",{configurable:!0,get:function(){return M},set:function(e){M=e,e?((0,f.setStyle)(k,"display","none"),(0,f.setStyle)(x,"display",null)):((0,f.setStyle)(k,"display",null),(0,f.setStyle)(x,"display","none"))}});break;case"range":var S=(0,f.createElement)("div");(0,f.addClass)(S,"art-setting-item-right-icon");var E=(0,f.append)(S,'');E.value=e.range[0],E.min=e.range[1],E.max=e.range[2],E.step=e.range[3],(0,f.addClass)(E,"art-setting-range"),(0,f.append)(y,S),(0,f.def)(e,"$range",{configurable:!0,get:function(){return E}});var I=(0,u._)(e.range);(0,f.def)(e,"range",{configurable:!0,get:function(){return I},set:function(e){I=(0,u._)(e),E.value=e[0],E.min=e[1],E.max=e[2],E.step=e[3]}});break;case"selector":if(null==(r=e.selector)?void 0:r.length){var T=(0,f.createElement)("div");(0,f.addClass)(T,"art-setting-item-right-icon"),(0,f.append)(T,d.arrowRight),(0,f.append)(y,T)}}switch(c){case"switch":if(e.onSwitch){var L=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onSwitch.call(this.art,e,v,t)];case 1:return e.switch=r.sent(),[2]}})}).call(n)});e.$events.push(L)}break;case"range":if(e.$range){if(e.onRange){var C=h(e.$range,"change",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onRange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(C)}if(e.onChange){var O=h(e.$range,"input",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return e.range[0]=e.$range.valueAsNumber,[4,e.onChange.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(O)}}break;case"selector":var F=h(v,"click",function(t){return(0,a._)(function(){var r,n;return(0,p._)(this,function(o){switch(o.label){case 0:if(!(null==(r=e.selector)?void 0:r.length))return[3,1];return this.render(e.selector),[3,3];case 1:if(this.check(e),!e.$parent.onSelect)return[3,3];return n=e.$parent,[4,e.$parent.onSelect.call(this.art,e,v,t)];case 2:n.tooltip=o.sent(),o.label=3;case 3:return[2]}})}).call(n)});e.$events.push(F),e.default&&(0,f.addClass)(v,"art-current");break;case"button":if(e.onClick){var D=h(v,"click",function(t){return(0,a._)(function(){return(0,p._)(this,function(r){switch(r.label){case 0:return[4,e.onClick.call(this.art,e,v,t)];case 1:return e.tooltip=r.sent(),[2]}})}).call(n)});e.$events.push(D)}}(0,f.def)(e,"$item",{configurable:!0,get:function(){return v}}),o?(0,f.replaceElement)(v,i):(0,f.append)(s,v),e.mounted&&setTimeout(function(){return e.mounted.call(n.art,e.$item,e)},0)}}},{key:"render",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.option;if(this.active=e,this.cache.has(e)){var t=this.cache.get(e);(0,f.inverseClass)(t,"art-current")}else{var r,n=(0,f.createElement)("div");this.cache.set(e,n),(0,f.addClass)(n,"art-setting-panel"),(0,f.append)(this.$parent,n),(0,f.inverseClass)(n,"art-current"),(null==(r=e[0])?void 0:r.$parent)&&this.createHeader(e[0]);for(var o=0;o\n ').concat(t.escape?(0,y.escape)(e):e,"\n
    ")}).join("")}).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}},{key:"switch",value:function(e){return(0,a._)(function(e){var t,r,n,o,a,s,i,c=arguments;return(0,d._)(this,function(l){switch(l.label){case 0:return t=c.length>1&&void 0!==c[1]?c[1]:{},n=(r=this.art).i18n,o=r.notice,a=r.option,s=(0,p._)((0,u._)({},a.subtitle,t),{url:e}),[4,this.init(s)];case 1:return i=l.sent(),t.name&&(o.show="".concat(n.get("Switch Subtitle"),": ").concat(t.name)),[2,i]}})}).apply(this,arguments)}},{key:"createTrack",value:function(e,t){var r=this,n=this.art,o=n.template,a=n.proxy,s=n.option,i=o.$video,c=o.$track,l=(0,y.createElement)("track");l.default=!0,l.kind=e,l.src=t,l.label=s.subtitle.name||"Artplayer",l.track.mode="hidden",l.onload=function(){r.art.emit("subtitleLoad",r.cues,r.option)},this.art.events.remove(this.destroyEvent),c.onload=null,(0,y.remove)(c),(0,y.append)(i,l),o.$track=l,this.destroyEvent=a(this.textTrack,"cuechange",function(){return r.update()})}},{key:"init",value:function(e){return(0,a._)(function(){var t,r,n,o;return(0,d._)(this,function(a){return(t=this,n=(r=this.art).notice,o=r.template.$subtitle,this.textTrack)?((0,m.default)(e,g.default.subtitle),e.url)?(this.option=e,this.style(e.style),[2,fetch(e.url).then(function(e){return e.arrayBuffer()}).then(function(t){var r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,y.getExt)(e.url)){case"srt":var n=(0,y.srtToVtt)(r),o=e.onVttLoad(n);return(0,y.vttToBlob)(o);case"ass":var a=(0,y.assToVtt)(r),s=e.onVttLoad(a);return(0,y.vttToBlob)(s);case"vtt":var i=e.onVttLoad(r);return(0,y.vttToBlob)(i);default:return e.url}}).then(function(e){return o.innerHTML="",t.url===e||(URL.revokeObjectURL(t.url),t.createTrack("metadata",e)),e}).catch(function(e){throw o.innerHTML="",n.show=e,e})]):[2]:[2,null]})}).call(this)}}]),t}(o.interopDefault(b).default)},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","option-validator":"8zKz5","./scheme":"3Srhh","./utils":"hQMLb","./utils/component":"hXsfe","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],jkHHJ:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return l});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=e("../package.json"),c=e("./utils"),l=function(){"use strict";function e(t){var r=this;(0,a._)(this,e),this.art=t;var n=t.option,o=t.constructor;n.container instanceof Element?this.$container=n.container:(this.$container=(0,c.query)(n.container),(0,c.errorHandle)(this.$container,"No container element found by ".concat(n.container))),(0,c.errorHandle)((0,c.supportsFlex)(),"The current browser does not support flex layout");var s=this.$container.tagName.toLowerCase();(0,c.errorHandle)("div"===s,"Unsupported container element type, only support 'div' but got '".concat(s,"'")),(0,c.errorHandle)(o.instances.every(function(e){return e.template.$container!==r.$container}),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}return(0,s._)(e,[{key:"query",value:function(e){return(0,c.query)(e,this.$container)}},{key:"init",value:function(){var t=this.art.option;if(t.useSSR||(this.$container.innerHTML=e.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),t.proxy){var r=t.proxy.call(this.art,this.art);(0,c.errorHandle)(r instanceof HTMLVideoElement||r instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,c.replaceElement)(r,this.$video),r.className="art-video",this.$video=r}t.backdrop&&(0,c.addClass)(this.$player,"art-backdrop"),c.isMobile&&(0,c.addClass)(this.$player,"art-mobile")}},{key:"destroy",value:function(e){e?this.$container.innerHTML="":(0,c.addClass)(this.$player,"art-destroy")}}],[{key:"html",get:function(){return'\n
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    Player version:
    \n
    '.concat(i.version,'
    \n
    \n
    \n
    Video url:
    \n
    \n
    \n
    \n
    Video volume:
    \n
    \n
    \n
    \n
    Video time:
    \n
    \n
    \n
    \n
    Video duration:
    \n
    \n
    \n
    \n
    Video resolution:
    \n
    \nx\n
    \n
    \n
    \n
    [x]
    \n
    \n
    \n
    \n ')}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","../package.json":"2Jf7W","./utils":"hQMLb","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ikoiH:[function(e,t,r,n){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",function(){return i});var a=e("@swc/helpers/cjs/_class_call_check.cjs"),s=e("@swc/helpers/cjs/_create_class.cjs"),i=function(){"use strict";function e(){(0,a._)(this,e)}return(0,s._)(e,[{key:"on",value:function(e,t,r){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:t,ctx:r}),this}},{key:"once",value:function(e,t,r){var n=this;function o(){for(var a=arguments.length,s=Array(a),i=0;i1?t-1:0),n=1;nt.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Y}static get scheme(){return P.default}static get Emitter(){return K.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Y.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Y.isBrowser&&(window.Artplayer=Q,Y.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"2wh8D","option-validator":"g7VGh","../package.json":"lh3R5","./config":"eJfh8","./contextmenu":"9zso8","./control":"dp1yk","./events":"jmVSD","./hotkey":"dswts","./i18n":"d9ktO","./icons":"fFHY0","./info":"kZ0F8","./layer":"j9lbi","./loading":"bMjWd","./mask":"k1nkQ","./notice":"fPVaU","./player":"uR0Sw","./plugins":"cjxJL","./scheme":"biLjm","./setting":"bwLGT","./storage":"kwqbK","./subtitle":"k5613","./template":"fwOA1","./utils":"aBlEo","./utils/emitter":"4NM7P","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2wh8D":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],g7VGh:[function(e,t,r,a){t.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],eJfh8:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"9zso8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"aBlEo","../utils/component":"idCEj","./aspectRatio":"6XHP2","./close":"eF6AX","./flip":"7Wg1P","./info":"fjRnU","./playbackRate":"hm1DY","./version":"aJBeL","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBlEo:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"jg0yq","./dom":"eANXw","./error":"4FwTI","./file":"i2JbS","./format":"dy9GH","./property":"jY49c","./subtitle":"ke7ox","./time":"f7gsx","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jg0yq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eANXw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>j),o.export(r,"getIcon",()=>k),o.export(r,"setStyleText",()=>E),o.export(r,"supportsFlex",()=>S),o.export(r,"getRect",()=>$),o.export(r,"loadImg",()=>M),o.export(r,"getComposedPath",()=>I);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function j(e){return document.createElement(e)}function k(e="",t=""){let r=j("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function E(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function S(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function $(e){return e.getBoundingClientRect()}function M(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"jg0yq","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4FwTI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i2JbS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dy9GH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jY49c:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ke7ox:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f7gsx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],idCEj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`,a=this.cache.get(r);(0,c.errorHandle)(!a,`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let o=(0,l.createElement)("div");(0,l.addClass)(o,`art-${this.name}`),(0,l.addClass)(o,`art-${this.name}-${r}`);let i=Array.from(this.$parent.children);o.dataset.index=t.index||this.id;let p=i.find(e=>Number(e.dataset.index)>=Number(o.dataset.index));p?p.insertAdjacentElement("beforebegin",o):(0,l.append)(this.$parent,o),t.html&&(0,l.append)(o,t.html),t.style&&(0,l.setStyles)(o,t.style),t.tooltip&&(0,l.tooltip)(o,t.tooltip);let d=[];if(t.click){let e=this.art.events.proxy(o,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});d.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,o,d),this[r]=o,this.cache.set(r,{$ref:o,events:d,option:t}),t.mounted&&t.mounted.call(this.art,o),o}remove(e){let t=this.cache.get(e);(0,c.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;ef);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6XHP2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eF6AX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7Wg1P":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjRnU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hm1DY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aJBeL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"lh3R5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dp1yk:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),j=e("./setting"),k=o.interopDefault(j),E=e("./time"),S=o.interopDefault(E),$=e("./volume"),M=o.interopDefault($);class I extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,M.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,S.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,k.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=I},{"../utils":"aBlEo","../utils/component":"idCEj","./airplay":"amOzz","./fullscreen":"3GuBU","./fullscreenWeb":"jj1KV","./pip":"jMeHN","./playAndPause":"u3h8M","./progress":"1XZSS","./screenshot":"dIscA","./setting":"aqA0g","./time":"ihweO","./volume":"fJVWn","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],amOzz:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3GuBU":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jj1KV:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jMeHN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],u3h8M:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1XZSS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
    `,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dIscA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aqA0g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ihweO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
    '),l=(0,i.append)(s,'
    '),c=(0,i.append)(l,'
    '),p=(0,i.append)(l,'
    '),d=(0,i.append)(p,'
    '),u=(0,i.append)(d,'
    '),f=(0,i.append)(p,'
    ');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jmVSD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){let t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;en);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"9wEzB":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"1XZSS","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ikBrS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jwNq0:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eqSsP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"42JNz":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7kM1M":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2IW9m":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dswts:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"gkZgZ","bundle-text:./arrow-left.svg":"kQyD4","bundle-text:./arrow-right.svg":"64ztm","bundle-text:./aspect-ratio.svg":"72LvA","bundle-text:./check.svg":"4QmBo","bundle-text:./close.svg":"j1hoe","bundle-text:./config.svg":"hNZaT","bundle-text:./error.svg":"dKh4l","bundle-text:./flip.svg":"lIEIE","bundle-text:./fullscreen-off.svg":"1533e","bundle-text:./fullscreen-on.svg":"76ut3","bundle-text:./fullscreen-web-off.svg":"3NzMk","bundle-text:./fullscreen-web-on.svg":"12xHc","bundle-text:./loading.svg":"iVcUF","bundle-text:./lock.svg":"1J4so","bundle-text:./pause.svg":"1KgkK","bundle-text:./pip.svg":"4h4tM","bundle-text:./play.svg":"jecAY","bundle-text:./playback-rate.svg":"anPe9","bundle-text:./screenshot.svg":"9BPYQ","bundle-text:./setting.svg":"hsI9k","bundle-text:./state.svg":"gr1ZU","bundle-text:./switch-off.svg":"6kdAr","bundle-text:./switch-on.svg":"ksdMo","bundle-text:./unlock.svg":"iz5Qc","bundle-text:./volume-close.svg":"3OZoa","bundle-text:./volume.svg":"hRYA4","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gkZgZ:[function(e,t,r,a){t.exports=''},{}],kQyD4:[function(e,t,r,a){t.exports=''},{}],"64ztm":[function(e,t,r,a){t.exports=''},{}],"72LvA":[function(e,t,r,a){t.exports=''},{}],"4QmBo":[function(e,t,r,a){t.exports=''},{}],j1hoe:[function(e,t,r,a){t.exports=''},{}],hNZaT:[function(e,t,r,a){t.exports=''},{}],dKh4l:[function(e,t,r,a){t.exports=''},{}],lIEIE:[function(e,t,r,a){t.exports=''},{}],"1533e":[function(e,t,r,a){t.exports=''},{}],"76ut3":[function(e,t,r,a){t.exports=''},{}],"3NzMk":[function(e,t,r,a){t.exports=''},{}],"12xHc":[function(e,t,r,a){t.exports=''},{}],iVcUF:[function(e,t,r,a){t.exports=''},{}],"1J4so":[function(e,t,r,a){t.exports=''},{}],"1KgkK":[function(e,t,r,a){t.exports=''},{}],"4h4tM":[function(e,t,r,a){t.exports=''},{}],jecAY:[function(e,t,r,a){t.exports=''},{}],anPe9:[function(e,t,r,a){t.exports=''},{}],"9BPYQ":[function(e,t,r,a){t.exports=''},{}],hsI9k:[function(e,t,r,a){t.exports=''},{}],gr1ZU:[function(e,t,r,a){t.exports=''},{}],"6kdAr":[function(e,t,r,a){t.exports=''},{}],ksdMo:[function(e,t,r,a){t.exports=''},{}],iz5Qc:[function(e,t,r,a){t.exports=''},{}],"3OZoa":[function(e,t,r,a){t.exports=''},{}],hRYA4:[function(e,t,r,a){t.exports=''},{}],kZ0F8:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fPVaU:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],uR0Sw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),j=o.interopDefault(w),k=e("./flipMix"),E=o.interopDefault(k),S=e("./fullscreenMix"),$=o.interopDefault(S),M=e("./fullscreenWebMix"),I=o.interopDefault(M),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),q=o.interopDefault(F),D=e("./optionInit"),A=o.interopDefault(D),R=e("./pauseMix"),B=o.interopDefault(R),L=e("./pipMix"),O=o.interopDefault(L),P=e("./playbackRateMix"),z=o.interopDefault(P),X=e("./playedMix"),V=o.interopDefault(X),_=e("./playingMix"),H=o.interopDefault(_),N=e("./playMix"),W=o.interopDefault(N),U=e("./posterMix"),Y=o.interopDefault(U),Z=e("./qualityMix"),K=o.interopDefault(Z),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,B.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,z.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,$.default)(e),(0,I.default)(e),(0,O.default)(e),(0,C.default)(e),(0,V.default)(e),(0,H.default)(e),(0,h.default)(e),(0,J.default)(e),(0,E.default)(e),(0,q.default)(e),(0,Y.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,K.default)(e),(0,eu.default)(e),(0,j.default)(e),(0,A.default)(e)}}},{"./airplayMix":"d8BTB","./aspectRatioMix":"aQNJl","./attrMix":"5DA9e","./autoHeightMix":"1swKn","./autoSizeMix":"lSbiD","./cssVarMix":"32Hp1","./currentTimeMix":"kfZbu","./durationMix":"eV1ag","./eventInit":"f8NQq","./flipMix":"ea3Qm","./fullscreenMix":"ffXE3","./fullscreenWebMix":"8tarF","./loadedMix":"f9syH","./miniMix":"dLuS7","./optionInit":"d1F69","./pauseMix":"kewk9","./pipMix":"4XzDs","./playbackRateMix":"jphfi","./playedMix":"iNpeS","./playingMix":"aBIWL","./playMix":"hRBri","./posterMix":"fgfXC","./qualityMix":"17rUP","./rectMix":"55qzI","./screenshotMix":"bC6TG","./seekMix":"j8GRO","./stateMix":"cn7iR","./subtitleOffsetMix":"2k4nP","./switchMix":"6SU6j","./themeMix":"7iMuh","./thumbnailsMix":"6P0RS","./toggleMix":"eNi78","./typeMix":"7AUBD","./urlMix":"cnlLL","./volumeMix":"iX66j","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d8BTB:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aQNJl:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"5DA9e":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1swKn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lSbiD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"32Hp1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kfZbu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eV1ag:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f8NQq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"eJfh8","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ea3Qm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ffXE3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"iSPAQ","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iSPAQ:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8tarF":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f9syH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dLuS7:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
    ');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
    '),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d1F69:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kewk9:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4XzDs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jphfi:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNpeS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBIWL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hRBri:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"17rUP":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"55qzI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bC6TG:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],j8GRO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cn7iR:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return;let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="",e.once("video:error",o),e.once("video:loadedmetadata",()=>{e.currentTime=r}),e.once("video:canplay",async()=>{e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()})})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7iMuh":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6P0RS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eNi78:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7AUBD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cnlLL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iX66j:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cjxJL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"aBlEo","./autoOrientation":"jb9jb","./autoPlayback":"21HWM","./fastForward":"4sxBO","./lock":"fjy9V","./miniProgressBar":"d0xRp","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jb9jb:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"21HWM":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
    `}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4sxBO":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjy9V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d0xRp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bwLGT:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t
    '),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
    '),d=(0,i.append)(c,'
    '),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ljJTO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3QcSQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eB5hg:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kwqbK:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],k5613:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
    ${e.escape?(0,c.escape)(t):t}
    `).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"g7VGh","./scheme":"biLjm","./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fwOA1:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
    Player version:
    ${o.version}
    Video url:
    Video volume:
    Video time:
    Video duration:
    Video resolution:
    x
    [x]
    `}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"lh3R5","./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4NM7P":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;et.call(this,this)),Q.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(`Version@${Q.version}`);for(let t=0;te(`Event@${t.type}`))}J.push(this)}static get instances(){return J}static get version(){return c.version}static get config(){return d.default}static get utils(){return Y}static get scheme(){return P.default}static get Emitter(){return K.default}static get validator(){return l.default}static get kindOf(){return l.default.kindOf}static get html(){return U.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:"",type:"",style:{},name:"",escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:Y.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute("src"),this.video.load()}destroy(e=!0){Q.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(e),J.splice(J.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}r.default=Q,Q.STYLE=n.default,Q.DEBUG=!1,Q.CONTEXTMENU=!0,Q.NOTICE_TIME=2e3,Q.SETTING_WIDTH=250,Q.SETTING_ITEM_WIDTH=200,Q.SETTING_ITEM_HEIGHT=35,Q.RESIZE_TIME=200,Q.SCROLL_TIME=200,Q.SCROLL_GAP=50,Q.AUTO_PLAYBACK_MAX=10,Q.AUTO_PLAYBACK_MIN=5,Q.AUTO_PLAYBACK_TIMEOUT=3e3,Q.RECONNECT_TIME_MAX=5,Q.RECONNECT_SLEEP_TIME=1e3,Q.CONTROL_HIDE_TIME=3e3,Q.DBCLICK_TIME=300,Q.DBCLICK_FULLSCREEN=!0,Q.MOBILE_DBCLICK_PLAY=!0,Q.MOBILE_CLICK_PLAY=!1,Q.AUTO_ORIENTATION_TIME=200,Q.INFO_LOOP_TIME=1e3,Q.FAST_FORWARD_VALUE=3,Q.FAST_FORWARD_TIME=1e3,Q.TOUCH_MOVE_RATIO=.5,Q.VOLUME_STEP=.1,Q.SEEK_STEP=5,Q.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Q.ASPECT_RATIO=["default","4:3","16:9"],Q.FLIP=["normal","horizontal","vertical"],Q.FULLSCREEN_WEB_IN_BODY=!0,Q.LOG_VERSION=!0,Q.USE_RAF=!1,Q.REMOVE_SRC_WHEN_DESTROY=!0,Y.isBrowser&&(window.Artplayer=Q,Y.setStyleText("artplayer-style",n.default),setTimeout(()=>{Q.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Q.version} %c https://artplayer.org`,"color: #fff; background: #5f5f5f","color: #fff; background: #4bc729","")},100))},{"bundle-text:./style/index.less":"2wh8D","option-validator":"g7VGh","../package.json":"lh3R5","./config":"eJfh8","./contextmenu":"9zso8","./control":"dp1yk","./events":"jmVSD","./hotkey":"dswts","./i18n":"d9ktO","./icons":"fFHY0","./info":"kZ0F8","./layer":"j9lbi","./loading":"bMjWd","./mask":"k1nkQ","./notice":"fPVaU","./player":"uR0Sw","./plugins":"cjxJL","./scheme":"biLjm","./setting":"bwLGT","./storage":"kwqbK","./subtitle":"k5613","./template":"fwOA1","./utils":"aBlEo","./utils/emitter":"4NM7P","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2wh8D":[function(e,t,r,a){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-progress-top-gap:8px;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;width:100%;height:100%;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);width:100%;bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;width:100%;height:100%;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{width:100%;height:50%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;width:100%;height:100%;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],g7VGh:[function(e,t,r,a){t.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return"GeneratorFunction"===a(r)?"generatorfunction":"function";if(Array.isArray?Array.isArray(r):r instanceof Array)return"array";if(r.constructor&&"function"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(r instanceof Date||"function"==typeof r.toDateString&&"function"==typeof r.getDate&&"function"==typeof r.setDate)return"date";if(r instanceof Error||"string"==typeof r.message&&r.constructor&&"number"==typeof r.constructor.stackTraceLimit)return"error";if(r instanceof RegExp||"string"==typeof r.flags&&"boolean"==typeof r.ignoreCase&&"boolean"==typeof r.multiline&&"boolean"==typeof r.global)return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if("function"==typeof r.throw&&"function"==typeof r.return&&"function"==typeof r.next)return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2","license":"MIT","homepage":"https://artplayer.org","repository":{"type":"git","url":"git+https://github.com/zhw2590582/ArtPlayer.git"},"bugs":{"url":"https://github.com/zhw2590582/ArtPlayer/issues"},"keywords":["html5","video","player"],"exports":{".":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.mjs","require":"./dist/artplayer.js"},"./legacy":{"types":"./types/artplayer.d.ts","import":"./dist/artplayer.legacy.js","require":"./dist/artplayer.legacy.js"},"./i18n/*":{"types":"./types/i18n.d.ts","import":"./dist/i18n/*.mjs","require":"./dist/i18n/*.js"}},"main":"./dist/artplayer.js","module":"./dist/artplayer.mjs","types":"./types/artplayer.d.ts","typesVersions":{"*":{"i18n/*":["types/i18n.d.ts"],"legacy":["types/artplayer.d.ts"]}},"legacy":"./dist/artplayer.legacy.js","browserslist":"last 1 Chrome version","dependencies":{"option-validator":"^2.0.6"}}')},{}],eJfh8:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={properties:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,t,r,a){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],"9zso8":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./close"),d=o.interopDefault(p),u=e("./flip"),f=o.interopDefault(u),h=e("./info"),m=o.interopDefault(h),g=e("./playbackRate"),v=o.interopDefault(g),y=e("./version"),b=o.interopDefault(y);class x extends s.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,i.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,v.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,c.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,f.default)({name:"flip",index:30})),this.add((0,m.default)({name:"info",index:40})),this.add((0,b.default)({name:"version",index:50})),this.add((0,d.default)({name:"close",index:60}));for(let t=0;t{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,o=e.clientY,{height:n,width:s,left:l,top:c}=(0,i.getRect)(r),{height:p,width:d}=(0,i.getRect)(a),u=t-l,f=o-c;t+d>l+s&&(u=s-d),o+p>c+n&&(f=n-p),(0,i.setStyles)(a,{top:`${f}px`,left:`${u}px`})}),t(r,"click",e=>{(0,i.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on("blur",()=>{this.show=!1})}}r.default=x},{"../utils":"aBlEo","../utils/component":"idCEj","./aspectRatio":"6XHP2","./close":"eF6AX","./flip":"7Wg1P","./info":"fjRnU","./playbackRate":"hm1DY","./version":"aJBeL","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBlEo:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./compatibility");o.exportAll(i,r);var n=e("./dom");o.exportAll(n,r);var s=e("./error");o.exportAll(s,r);var l=e("./file");o.exportAll(l,r);var c=e("./format");o.exportAll(c,r);var p=e("./property");o.exportAll(p,r);var d=e("./subtitle");o.exportAll(d,r);var u=e("./time");o.exportAll(u,r)},{"./compatibility":"jg0yq","./dom":"eANXw","./error":"4FwTI","./file":"i2JbS","./format":"dy9GH","./property":"jY49c","./subtitle":"ke7ox","./time":"f7gsx","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jg0yq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"userAgent",()=>i),o.export(r,"isSafari",()=>n),o.export(r,"isIOS",()=>s),o.export(r,"isIOS13",()=>l),o.export(r,"isMobile",()=>c),o.export(r,"isBrowser",()=>p);let i=globalThis?.CUSTOM_USER_AGENT??("undefined"!=typeof navigator?navigator.userAgent:""),n=/^(?:(?!chrome|android).)*safari/i.test(i),s=/iPad|iPhone|iPod/i.test(i)&&!window.MSStream,l=s||i.includes("Macintosh")&&navigator.maxTouchPoints>=1,c=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(i)||l,p="undefined"!=typeof window&&"undefined"!=typeof document},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eANXw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"query",()=>n),o.export(r,"queryAll",()=>s),o.export(r,"addClass",()=>l),o.export(r,"removeClass",()=>c),o.export(r,"hasClass",()=>p),o.export(r,"append",()=>d),o.export(r,"remove",()=>u),o.export(r,"setStyle",()=>f),o.export(r,"setStyles",()=>h),o.export(r,"getStyle",()=>m),o.export(r,"siblings",()=>g),o.export(r,"inverseClass",()=>v),o.export(r,"tooltip",()=>y),o.export(r,"isInViewport",()=>b),o.export(r,"includeFromEvent",()=>x),o.export(r,"replaceElement",()=>w),o.export(r,"createElement",()=>j),o.export(r,"getIcon",()=>k),o.export(r,"setStyleText",()=>E),o.export(r,"supportsFlex",()=>S),o.export(r,"getRect",()=>$),o.export(r,"loadImg",()=>M),o.export(r,"getComposedPath",()=>I);var i=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function s(e,t=document){return Array.from(t.querySelectorAll(e))}function l(e,t){return e.classList.add(t)}function c(e,t){return e.classList.remove(t)}function p(e,t){return e.classList.contains(t)}function d(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function f(e,t,r){return e.style[t]=r,e}function h(e,t){for(let r in t)f(e,r,t[r]);return e}function m(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?Number.parseFloat(a):a}function g(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function v(e,t){g(e).forEach(e=>c(e,t)),l(e,t)}function y(e,t,r="top"){i.isMobile||(e.setAttribute("aria-label",t),l(e,"hint--rounded"),l(e,`hint--${r}`))}function b(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function x(e,t){return I(e).includes(t)}function w(e,t){return t.parentNode.replaceChild(e,t),e}function j(e){return document.createElement(e)}function k(e="",t=""){let r=j("i");return l(r,"art-icon"),l(r,`art-icon-${e}`),d(r,t),r}function E(e,t){let r=document.getElementById(e);r||((r=document.createElement("style")).id=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function S(){let e=document.createElement("div");return e.style.display="flex","flex"===e.style.display}function $(e){return e.getBoundingClientRect()}function M(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement("canvas"),n=i.getContext("2d");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}function I(e){if(e.composedPath)return e.composedPath();let t=[],r=e.target;for(;r;)t.push(r),r=r.parentNode;return t.includes(window)||void 0===window||t.push(window),t}},{"./compatibility":"jg0yq","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4FwTI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ArtPlayerError",()=>i),o.export(r,"errorHandle",()=>n);class i extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new i(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i2JbS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}o.defineInteropFlag(r),o.export(r,"getExt",()=>function e(t){return t.includes("?")?e(t.split("?")[0]):t.includes("#")?e(t.split("#")[0]):t.trim().toLowerCase().split(".").pop()}),o.export(r,"download",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dy9GH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function s(e){if(!e)return"00:00";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(":")}function l(e){return e.replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e]||e)}function c(e){let t={"&":"&","<":"<",">":">","'":"'",""":'"'},r=RegExp(`(${Object.keys(t).join("|")})`,"g");return e.replace(r,e=>t[e]||e)}o.defineInteropFlag(r),o.export(r,"clamp",()=>i),o.export(r,"capitalize",()=>n),o.export(r,"secondToTime",()=>s),o.export(r,"escape",()=>l),o.export(r,"unescape",()=>c)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jY49c:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"def",()=>i),o.export(r,"has",()=>s),o.export(r,"get",()=>l),o.export(r,"mergeDeep",()=>function e(...t){let r=e=>e&&"object"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let i=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function s(e,t){return n.call(e,t)}function l(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ke7ox:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return"WEBVTT \r\n\r\n".concat(e.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${t},${a}`}).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/\{[\s\S]*?\}/g,"").concat("\r\n\r\n"))}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function s(e){let t=RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join("")}return`WEBVTT ${e.split(/\r?\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\{[\s\S]*?\}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map(e=>e.trim()).join("\n")}:null}).filter(e=>e).map((e,t)=>e?`${t+1} ${e.start} --> ${e.end} ${e.text}`:"").filter(e=>e.trim()).join("\n\n")}`}o.defineInteropFlag(r),o.export(r,"srtToVtt",()=>i),o.export(r,"vttToBlob",()=>n),o.export(r,"assToVtt",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f7gsx:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e=0){return new Promise(t=>setTimeout(t,e))}function n(e,t){let r;return function(...a){let o=()=>(r=null,e.apply(this,a));clearTimeout(r),r=setTimeout(o,t)}}function s(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(()=>{r=!1},t))}}o.defineInteropFlag(r),o.export(r,"sleep",()=>i),o.export(r,"debounce",()=>n),o.export(r,"throttle",()=>s)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],idCEj:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("../scheme"),l=e("./dom"),c=e("./error");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,l.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,l.addClass)(t,r):(0,l.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t="function"==typeof e?e(this.art):e;if(t.html=t.html||"",(0,n.default)(t,s.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`;(0,c.errorHandle)(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let a=(0,l.createElement)("div");(0,l.addClass)(a,`art-${this.name}`),(0,l.addClass)(a,`art-${this.name}-${r}`);let o=Array.from(this.$parent.children);a.dataset.index=t.index||this.id;let i=o.find(e=>Number(e.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement("beforebegin",a):(0,l.append)(this.$parent,a),t.html&&(0,l.append)(a,t.html),t.style&&(0,l.setStyles)(a,t.style),t.tooltip&&(0,l.tooltip)(a,t.tooltip);let p=[];if(t.click){let e=this.art.events.proxy(a,"click",e=>{e.preventDefault(),t.click.call(this.art,this,e)});p.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.selector(t,a,p),this[r]=a,this.cache.set(r,{$ref:a,events:p,option:t}),t.mounted&&t.mounted.call(this.art,a),a}remove(e){(0,c.errorHandle)(this.cache.has(e),`Can't find [${e}] from the [${this.name}]`);let t=this.cache.get(e);for(let e of(t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref),t.events))this.art.events.remove(e);this.cache.delete(e),delete this[e],(0,l.remove)(t.$ref)}update(e){return this.cache.has(e.name)&&(e=Object.assign(this.cache.get(e.name).option,e),this.remove(e.name)),this.add(e)}}},{"option-validator":"g7VGh","../scheme":"biLjm","./dom":"eANXw","./error":"4FwTI","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],biLjm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"ComponentOption",()=>f);var i=e("../utils");let n="array",s="boolean",l="string",c="number",p="object",d="function";function u(e,t,r){return(0,i.errorHandle)(t===l||t===c||e instanceof Element,`${r.join(".")} require '${l}' or 'Element' type`)}let f={html:u,disable:`?${s}`,name:`?${l}`,index:`?${c}`,style:`?${p}`,click:`?${d}`,mounted:`?${d}`,tooltip:`?${l}|${c}`,width:`?${c}`,selector:`?${n}`,onSelect:`?${d}`,switch:`?${s}`,onSwitch:`?${d}`,range:`?${n}`,onRange:`?${d}`,onChange:`?${d}`};r.default={id:l,container:u,url:l,poster:l,type:l,theme:l,lang:l,volume:c,isLive:s,muted:s,autoplay:s,autoSize:s,autoMini:s,loop:s,flip:s,playbackRate:s,aspectRatio:s,screenshot:s,setting:s,hotkey:s,pip:s,mutex:s,backdrop:s,fullscreen:s,fullscreenWeb:s,subtitleOffset:s,miniProgressBar:s,useSSR:s,playsInline:s,lock:s,gesture:s,fastForward:s,autoPlayback:s,autoOrientation:s,airplay:s,proxy:`?${d}`,plugins:[d],layers:[f],contextmenu:[f],settings:[f],controls:[{...f,position:(e,t,r)=>{let a=["top","left","right"];return(0,i.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${s}`,html:l,url:l}],highlight:[{time:c,text:l}],thumbnails:{url:l,number:c,column:c,width:c,height:c,scale:c},subtitle:{url:l,name:l,type:l,style:p,escape:s,encoding:l,onVttLoad:d},moreVideoAttr:p,i18n:p,icons:p,cssVar:p,customType:p}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6XHP2":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,o=a.map(e=>`${"default"===e?r.get("Default"):e}`).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="default"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("aspectRatio",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eF6AX:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7Wg1P":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,o=a.map(e=>`${r.get((0,i.capitalize)(e))}`).join("");return{...e,html:`${r.get("Video Flip")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="normal"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("flip",t=>{let r=(0,i.queryAll)("span",e).find(e=>e.dataset.value===t);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjRnU:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hm1DY:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,o=a.map(e=>`${1===e?r.get("Normal"):e.toFixed(1)}`).join("");return{...e,html:`${r.get("Play Speed")}: ${o}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,i.query)('[data-value="1"]',e);r&&(0,i.inverseClass)(r,"art-current"),t.on("video:ratechange",()=>{let r=(0,i.queryAll)("span",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,i.inverseClass)(r,"art-current")})}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aJBeL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>function(e){return{...e,html:`ArtPlayer ${i.version}`}});var i=e("../../package.json")},{"../../package.json":"lh3R5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dp1yk:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./airplay"),c=o.interopDefault(l),p=e("./fullscreen"),d=o.interopDefault(p),u=e("./fullscreenWeb"),f=o.interopDefault(u),h=e("./pip"),m=o.interopDefault(h),g=e("./playAndPause"),v=o.interopDefault(g),y=e("./progress"),b=o.interopDefault(y),x=e("./screenshot"),w=o.interopDefault(x),j=e("./setting"),k=o.interopDefault(j),E=e("./time"),S=o.interopDefault(E),$=e("./volume"),M=o.interopDefault($);class I extends s.default{constructor(e){super(e),this.isHover=!1,this.name="control",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on("mousemove",()=>{i.isMobile||(this.show=!0)}),e.on("click",()=>{i.isMobile?this.toggle():this.show=!0}),e.on("document:mousemove",e=>{this.isHover=(0,i.includeFromEvent)(e,a)}),e.on("video:timeupdate",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on("control",e=>{e?((0,i.removeClass)(r,"art-hide-cursor"),(0,i.addClass)(r,"art-hover"),this.timer=Date.now()):((0,i.addClass)(r,"art-hide-cursor"),(0,i.removeClass)(r,"art-hover"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,b.default)({name:"progress",position:"top",index:10})),this.add({name:"thumbnails",position:"top",index:20}),this.add((0,v.default)({name:"playAndPause",position:"left",index:10})),this.add((0,M.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,S.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,i.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!i.isMobile&&this.add((0,w.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,k.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,m.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,c.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,f.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,d.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;te.selector}),(0,i.def)(r,"$control_item",{get:()=>a}),(0,i.def)(r,"$control_value",{get:()=>o})}let s=a(n,"click",async t=>{let r=(0,i.getComposedPath)(t),a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(s)}}r.default=I},{"../utils":"aBlEo","../utils/component":"idCEj","./airplay":"amOzz","./fullscreen":"3GuBU","./fullscreenWeb":"jj1KV","./pip":"jMeHN","./playAndPause":"u3h8M","./progress":"1XZSS","./screenshot":"dIscA","./setting":"aqA0g","./time":"ihweO","./volume":"fJVWn","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],amOzz:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.airplay),r(e,"click",()=>t.airplay())}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3GuBU":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenOn),s=(0,i.append)(e,a.fullscreenOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreen=!t.fullscreen}),t.on("fullscreen",t=>{t?((0,i.tooltip)(e,o.get("Exit Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jj1KV:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.fullscreenWebOn),s=(0,i.append)(e,a.fullscreenWebOff);(0,i.setStyle)(s,"display","none"),r(e,"click",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on("fullscreenWeb",t=>{t?((0,i.tooltip)(e,o.get("Exit Web Fullscreen")),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","inline-flex")):((0,i.tooltip)(e,o.get("Web Fullscreen")),(0,i.setStyle)(n,"display","inline-flex"),(0,i.setStyle)(s,"display","none"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jMeHN:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.pip),r(e,"click",()=>{t.pip=!t.pip}),t.on("pip",t=>{(0,i.tooltip)(e,o.get(t?"Exit PIP Mode":"PIP Mode"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],u3h8M:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:o}=t,n=(0,i.append)(e,a.play),s=(0,i.append)(e,a.pause);function l(){(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(s,"display","none")}function c(){(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(s,"display","flex")}(0,i.tooltip)(n,o.get("Play")),(0,i.tooltip)(s,o.get("Pause")),r(n,"click",()=>{t.play()}),r(s,"click",()=>{t.pause()}),t.playing?c():l(),t.on("video:playing",()=>{c()}),t.on("video:pause",()=>{l()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1XZSS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"getPosFromEvent",()=>n),o.export(r,"setCurrentTime",()=>s),o.export(r,"default",()=>l);var i=e("../utils");function n(e,t){let{$progress:r}=e.template,{left:a}=(0,i.getRect)(r),o=i.isMobile?t.touches[0].clientX:t.clientX,n=(0,i.clamp)(o-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,i.secondToTime)(s),c=(0,i.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function s(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r,t),e.seek=a}else{let{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a,t),e.seek=r}}function l(e){return t=>{let{icons:r,option:a,proxy:o}=t;return{...e,html:`
    `,mounted:e=>{let l=null,c=!1,p=(0,i.query)(".art-progress-hover",e),d=(0,i.query)(".art-progress-loaded",e),u=(0,i.query)(".art-progress-played",e),f=(0,i.query)(".art-progress-highlight",e),h=(0,i.query)(".art-progress-indicator",e),m=(0,i.query)(".art-progress-tip",e);function g(r,a){let{width:o,time:s}=a||n(t,r);m.textContent=s;let l=m.clientWidth;o<=l/2?(0,i.setStyle)(m,"left",0):o>e.clientWidth-l/2?(0,i.setStyle)(m,"left",`${e.clientWidth-l}px`):(0,i.setStyle)(m,"left",`${o-l/2}px`)}r.indicator?(0,i.append)(h,r.indicator):(0,i.setStyle)(h,"backgroundColor","var(--art-theme)"),t.on("setBar",function(r,a,o){let n="played"===r&&o&&i.isMobile;"loaded"===r&&(0,i.setStyle)(d,"width",`${100*a}%`),"hover"===r&&(0,i.setStyle)(p,"width",`${100*a}%`),"played"===r&&((0,i.setStyle)(u,"width",`${100*a}%`),(0,i.setStyle)(h,"left",`${100*a}%`)),n&&((0,i.setStyle)(m,"display","flex"),g(o,{width:e.clientWidth*a,time:(0,i.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,i.setStyle)(m,"display","none")},500))}),t.on("video:loadedmetadata",function(){f.textContent="";for(let e=0;e`;(0,i.append)(f,n)}}),t.constructor.USE_RAF?t.on("raf",()=>{t.emit("setBar","played",t.played),t.emit("setBar","loaded",t.loaded)}):(t.on("video:timeupdate",()=>{t.emit("setBar","played",t.played)}),t.on("video:progress",()=>{t.emit("setBar","loaded",t.loaded)}),t.on("video:ended",()=>{t.emit("setBar","played",1)})),t.emit("setBar","loaded",t.loaded||0),i.isMobile||(o(e,"click",e=>{e.target!==h&&s(t,e)}),o(e,"mousemove",r=>{let{percentage:a}=n(t,r);if(t.emit("setBar","hover",a,r),(0,i.setStyle)(m,"display","flex"),(0,i.includeFromEvent)(r,f)){let{width:a}=n(t,r),{text:o}=r.target.dataset;m.textContent=o;let s=m.clientWidth;a<=s/2?(0,i.setStyle)(m,"left",0):a>e.clientWidth-s/2?(0,i.setStyle)(m,"left",`${e.clientWidth-s}px`):(0,i.setStyle)(m,"left",`${a-s/2}px`)}else g(r)}),o(e,"mouseleave",e=>{(0,i.setStyle)(m,"display","none"),t.emit("setBar","hover",0,e)}),o(e,"mousedown",e=>{c=0===e.button}),t.on("document:mousemove",e=>{if(c){let{second:r,percentage:a}=n(t,e);t.emit("setBar","played",a,e),t.seek=r}}),t.on("document:mouseup",()=>{c&&(c=!1)}))}}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dIscA:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{let{proxy:r,icons:a}=t;(0,i.append)(e,a.screenshot),r(e,"click",()=>{t.screenshot()})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aqA0g:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{let{proxy:r,icons:a,i18n:o}=t;(0,i.append)(e,a.setting),r(e,"click",()=>{t.setting.toggle(),t.setting.resize()}),t.on("setting",t=>{(0,i.tooltip)(e,o.get(t?"Hide Setting":"Show Setting"))})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ihweO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return t=>({...e,style:i.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){let r=`${(0,i.secondToTime)(t.currentTime)} / ${(0,i.secondToTime)(t.duration)}`;r!==e.textContent&&(e.textContent=r)}r();let a=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;en);var i=e("../utils");function n(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,o=(0,i.append)(e,a.volume),n=(0,i.append)(e,a.volumeClose),s=(0,i.append)(e,'
    '),l=(0,i.append)(s,'
    '),c=(0,i.append)(l,'
    '),p=(0,i.append)(l,'
    '),d=(0,i.append)(p,'
    '),u=(0,i.append)(d,'
    '),f=(0,i.append)(p,'
    ');function h(e){let{top:t,height:r}=(0,i.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display","flex"),(0,i.setStyle)(f,"top","100%"),(0,i.setStyle)(u,"top","100%"),c.textContent=0;else{let e=100*t.volume;(0,i.setStyle)(o,"display","flex"),(0,i.setStyle)(n,"display","none"),(0,i.setStyle)(f,"top",`${100-e}%`),(0,i.setStyle)(u,"top",`${100-e}%`),c.textContent=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(o,"click",()=>{t.muted=!0}),r(n,"click",()=>{t.muted=!1}),i.isMobile)(0,i.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",r=>{e=0===r.button,t.volume=h(r)}),t.on("document:mousemove",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on("document:mouseup",()=>{e&&(e=!1)})}}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jmVSD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./clickInit"),n=o.interopDefault(i),s=e("./gestureInit"),l=o.interopDefault(s),c=e("./globalInit"),p=o.interopDefault(c),d=e("./hoverInit"),u=o.interopDefault(d),f=e("./moveInit"),h=o.interopDefault(f),m=e("./resizeInit"),g=o.interopDefault(m),v=e("./updateInit"),y=o.interopDefault(v),b=e("./viewInit"),x=o.interopDefault(b);r.default=class{constructor(e){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,n.default)(e,this),(0,u.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,l.default)(e,this),(0,x.default)(e,this),(0,p.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.add(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}remove(e){if(this.destroyEvents.has(e))try{e()}catch(e){console.warn("Failed to remove event listener:",e)}finally{this.destroyEvents.delete(e)}}destroy(){for(let e of this.destroyEvents)try{e()}catch(e){console.warn("Failed to destroy event listener:",e)}this.destroyEvents.clear()}}},{"./clickInit":"i8G6V","./gestureInit":"9wEzB","./globalInit":"ikBrS","./hoverInit":"jwNq0","./moveInit":"eqSsP","./resizeInit":"42JNz","./updateInit":"7kM1M","./viewInit":"2IW9m","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],i8G6V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{constructor:r,template:{$player:a,$video:o}}=e;function n(t){(0,i.includeFromEvent)(t,a)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}e.on("document:click",n),e.on("document:contextmenu",n);let s=[];t.proxy(o,"click",t=>{let a=Date.now();s.push(a);let{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=s.filter(e=>a-e<=n);switch(p.length){case 1:e.emit("click",t),i.isMobile?!e.isLock&&o&&e.toggle():e.toggle(),s=p;break;case 2:e.emit("dblclick",t),i.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),s=[];break;default:s=[]}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"9wEzB":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>s);var i=e("../control/progress"),n=e("../utils");function s(e,t){if(n.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,o=null,s=!1,l=0,c=0,p=0,d=t=>{if(1===t.touches.length&&!e.isLock){o===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:n}=t.touches[0];l=r,c=n,p=e.currentTime}},u=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){let o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;let s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),d=[3,4].includes(s),u=[1,2].includes(s);if(d&&!e.isRotate||u&&e.isRotate){let s=(0,n.clamp)((a-l)/e.width,-1,1),d=(0,n.clamp)((i-c)/e.height,-1,1),u=e.isRotate?d:s,f=o===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,n.clamp)(p+e.duration*u*f,0,e.duration);e.seek=h,e.emit("setBar","played",(0,n.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,n.secondToTime)(h)} / ${(0,n.secondToTime)(e.duration)}`}}};e.option.gesture&&(t.proxy(r,"touchstart",e=>{o=r,d(e)}),t.proxy(r,"touchmove",u)),t.proxy(a,"touchstart",e=>{o=a,d(e)}),t.proxy(a,"touchmove",u),e.on("document:touchend",()=>{s&&(l=0,c=0,p=0,s=!1,o=null)})}}},{"../control/progress":"1XZSS","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ikBrS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let r=["click","mouseup","keydown","touchend","touchmove","mousemove","pointerup","contextmenu","pointermove","visibilitychange","webkitfullscreenchange"],a=["resize","scroll","orientationchange"],o=[];function i(n={}){for(let e=0;e{let a=n.document||s.ownerDocument||document,i=t.proxy(a,r,t=>{e.emit(`document:${r}`,t)});o.push(i)}),a.forEach(r=>{let a=n.window||s.ownerDocument?.defaultView||window,i=t.proxy(a,r,t=>{e.emit(`window:${r}`,t)});o.push(i)})}i(),t.bindGlobalEvents=i}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jwNq0:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,i.addClass)(r,"art-hover"),e.emit("hover",!0,t)},t=>{(0,i.removeClass)(r,"art-hover"),e.emit("hover",!1,t)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eqSsP:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e,t){let{$player:r}=e.template;t.proxy(r,"mousemove",t=>{e.emit("mousemove",t)})}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"42JNz":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e,t){let{option:r,constructor:a}=e;e.on("resize",()=>{let{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""});let o=(0,i.debounce)(()=>e.emit("resize"),a.RESIZE_TIME);e.on("window:orientationchange",()=>o()),e.on("window:resize",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",()=>o())}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7kM1M":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit("raf"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on("destroy",()=>{cancelAnimationFrame(t)})}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"2IW9m":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,constructor:r,template:{$container:a}}=e,o=(0,i.throttle)(()=>{e.emit("view",(0,i.isInViewport)(a,r.SCROLL_GAP))},r.SCROLL_TIME);e.on("window:scroll",()=>o()),e.on("view",r=>{t.autoMini&&(e.mini=!r)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dswts:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},o.isMobile||this.init()}init(){let{constructor:e}=this.art;this.art.option.hotkey&&(this.add("Escape",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add("Space",()=>{this.art.toggle()}),this.add("ArrowLeft",()=>{this.art.backward=e.SEEK_STEP}),this.add("ArrowUp",()=>{this.art.volume+=e.VOLUME_STEP}),this.add("ArrowRight",()=>{this.art.forward=e.SEEK_STEP}),this.add("ArrowDown",()=>{this.art.volume-=e.VOLUME_STEP})),this.art.on("document:keydown",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r(0,ei.getIcon)(e,t[e])})}}},{"bundle-text:./airplay.svg":"gkZgZ","bundle-text:./arrow-left.svg":"kQyD4","bundle-text:./arrow-right.svg":"64ztm","bundle-text:./aspect-ratio.svg":"72LvA","bundle-text:./check.svg":"4QmBo","bundle-text:./close.svg":"j1hoe","bundle-text:./config.svg":"hNZaT","bundle-text:./error.svg":"dKh4l","bundle-text:./flip.svg":"lIEIE","bundle-text:./fullscreen-off.svg":"1533e","bundle-text:./fullscreen-on.svg":"76ut3","bundle-text:./fullscreen-web-off.svg":"3NzMk","bundle-text:./fullscreen-web-on.svg":"12xHc","bundle-text:./loading.svg":"iVcUF","bundle-text:./lock.svg":"1J4so","bundle-text:./pause.svg":"1KgkK","bundle-text:./pip.svg":"4h4tM","bundle-text:./play.svg":"jecAY","bundle-text:./playback-rate.svg":"anPe9","bundle-text:./screenshot.svg":"9BPYQ","bundle-text:./setting.svg":"hsI9k","bundle-text:./state.svg":"gr1ZU","bundle-text:./switch-off.svg":"6kdAr","bundle-text:./switch-on.svg":"ksdMo","bundle-text:./unlock.svg":"iz5Qc","bundle-text:./volume-close.svg":"3OZoa","bundle-text:./volume.svg":"hRYA4","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gkZgZ:[function(e,t,r,a){t.exports=''},{}],kQyD4:[function(e,t,r,a){t.exports=''},{}],"64ztm":[function(e,t,r,a){t.exports=''},{}],"72LvA":[function(e,t,r,a){t.exports=''},{}],"4QmBo":[function(e,t,r,a){t.exports=''},{}],j1hoe:[function(e,t,r,a){t.exports=''},{}],hNZaT:[function(e,t,r,a){t.exports=''},{}],dKh4l:[function(e,t,r,a){t.exports=''},{}],lIEIE:[function(e,t,r,a){t.exports=''},{}],"1533e":[function(e,t,r,a){t.exports=''},{}],"76ut3":[function(e,t,r,a){t.exports=''},{}],"3NzMk":[function(e,t,r,a){t.exports=''},{}],"12xHc":[function(e,t,r,a){t.exports=''},{}],iVcUF:[function(e,t,r,a){t.exports=''},{}],"1J4so":[function(e,t,r,a){t.exports=''},{}],"1KgkK":[function(e,t,r,a){t.exports=''},{}],"4h4tM":[function(e,t,r,a){t.exports=''},{}],jecAY:[function(e,t,r,a){t.exports=''},{}],anPe9:[function(e,t,r,a){t.exports=''},{}],"9BPYQ":[function(e,t,r,a){t.exports=''},{}],hsI9k:[function(e,t,r,a){t.exports=''},{}],gr1ZU:[function(e,t,r,a){t.exports=''},{}],"6kdAr":[function(e,t,r,a){t.exports=''},{}],ksdMo:[function(e,t,r,a){t.exports=''},{}],iz5Qc:[function(e,t,r,a){t.exports=''},{}],"3OZoa":[function(e,t,r,a){t.exports=''},{}],hRYA4:[function(e,t,r,a){t.exports=''},{}],kZ0F8:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./utils"),n=e("./utils/component"),s=o.interopDefault(n);class l extends s.default{constructor(e){super(e),this.name="info",i.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;e(a,"click",()=>{this.show=!1});let n=null,s=(0,i.queryAll)("[data-video]",r)||[];this.art.on("destroy",()=>clearTimeout(n)),!function e(){for(let e=0;e{(0,i.setStyle)(o,"display","none"),(0,i.setStyle)(n,"display",null)}),a.proxy(t.$state,"click",()=>e.play())}}r.default=l},{"./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fPVaU:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("./utils");r.default=class{constructor(e){this.art=e,this.timer=null,e.on("destroy",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(e){let{constructor:t,template:{$player:r,$noticeInner:a}}=this.art;e?(a.textContent=e instanceof Error?e.message.trim():e,(0,o.addClass)(r,"art-notice-show"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent="",(0,o.removeClass)(r,"art-notice-show")},t.NOTICE_TIME)):(0,o.removeClass)(r,"art-notice-show")}get show(){let{template:{$player:e}}=this.art;return e.classList.contains("art-notice-show")}}},{"./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],uR0Sw:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("./airplayMix"),n=o.interopDefault(i),s=e("./aspectRatioMix"),l=o.interopDefault(s),c=e("./attrMix"),p=o.interopDefault(c),d=e("./autoHeightMix"),u=o.interopDefault(d),f=e("./autoSizeMix"),h=o.interopDefault(f),m=e("./cssVarMix"),g=o.interopDefault(m),v=e("./currentTimeMix"),y=o.interopDefault(v),b=e("./durationMix"),x=o.interopDefault(b),w=e("./eventInit"),j=o.interopDefault(w),k=e("./flipMix"),E=o.interopDefault(k),S=e("./fullscreenMix"),$=o.interopDefault(S),M=e("./fullscreenWebMix"),I=o.interopDefault(M),T=e("./loadedMix"),C=o.interopDefault(T),F=e("./miniMix"),q=o.interopDefault(F),D=e("./optionInit"),A=o.interopDefault(D),R=e("./pauseMix"),B=o.interopDefault(R),L=e("./pipMix"),O=o.interopDefault(L),P=e("./playbackRateMix"),z=o.interopDefault(P),X=e("./playedMix"),V=o.interopDefault(X),_=e("./playingMix"),H=o.interopDefault(_),N=e("./playMix"),W=o.interopDefault(N),U=e("./posterMix"),Y=o.interopDefault(U),Z=e("./qualityMix"),K=o.interopDefault(Z),G=e("./rectMix"),J=o.interopDefault(G),Q=e("./screenshotMix"),ee=o.interopDefault(Q),et=e("./seekMix"),er=o.interopDefault(et),ea=e("./stateMix"),eo=o.interopDefault(ea),ei=e("./subtitleOffsetMix"),en=o.interopDefault(ei),es=e("./switchMix"),el=o.interopDefault(es),ec=e("./themeMix"),ep=o.interopDefault(ec),ed=e("./thumbnailsMix"),eu=o.interopDefault(ed),ef=e("./toggleMix"),eh=o.interopDefault(ef),em=e("./typeMix"),eg=o.interopDefault(em),ev=e("./urlMix"),ey=o.interopDefault(ev),eb=e("./volumeMix"),ex=o.interopDefault(eb);r.default=class{constructor(e){(0,ey.default)(e),(0,p.default)(e),(0,W.default)(e),(0,B.default)(e),(0,eh.default)(e),(0,er.default)(e),(0,ex.default)(e),(0,y.default)(e),(0,x.default)(e),(0,el.default)(e),(0,z.default)(e),(0,l.default)(e),(0,ee.default)(e),(0,$.default)(e),(0,I.default)(e),(0,O.default)(e),(0,C.default)(e),(0,V.default)(e),(0,H.default)(e),(0,h.default)(e),(0,J.default)(e),(0,E.default)(e),(0,q.default)(e),(0,Y.default)(e),(0,u.default)(e),(0,g.default)(e),(0,ep.default)(e),(0,eg.default)(e),(0,eo.default)(e),(0,en.default)(e),(0,n.default)(e),(0,K.default)(e),(0,eu.default)(e),(0,j.default)(e),(0,A.default)(e)}}},{"./airplayMix":"d8BTB","./aspectRatioMix":"aQNJl","./attrMix":"5DA9e","./autoHeightMix":"1swKn","./autoSizeMix":"lSbiD","./cssVarMix":"32Hp1","./currentTimeMix":"kfZbu","./durationMix":"eV1ag","./eventInit":"f8NQq","./flipMix":"ea3Qm","./fullscreenMix":"ffXE3","./fullscreenWebMix":"8tarF","./loadedMix":"f9syH","./miniMix":"dLuS7","./optionInit":"d1F69","./pauseMix":"kewk9","./pipMix":"4XzDs","./playbackRateMix":"jphfi","./playedMix":"iNpeS","./playingMix":"aBIWL","./playMix":"hRBri","./posterMix":"fgfXC","./qualityMix":"17rUP","./rectMix":"55qzI","./screenshotMix":"bC6TG","./seekMix":"j8GRO","./stateMix":"cn7iR","./subtitleOffsetMix":"2k4nP","./switchMix":"6SU6j","./themeMix":"7iMuh","./thumbnailsMix":"6P0RS","./toggleMix":"eNi78","./typeMix":"7AUBD","./urlMix":"cnlLL","./volumeMix":"iX66j","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d8BTB:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,proxy:a,template:{$video:o}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,"webkitplaybacktargetavailabilitychanged",e=>{switch(e.availability){case"available":n=!0;break;case"not-available":n=!1}}):n=!1,(0,i.def)(e,"airplay",{value(){n?(o.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aQNJl:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;(0,i.def)(e,"aspectRatio",{get:()=>o.dataset.aspectRatio||"default",set(n){if(n||(n="default"),"default"===n)(0,i.setStyle)(a,"width",null),(0,i.setStyle)(a,"height",null),(0,i.setStyle)(a,"margin",null),delete o.dataset.aspectRatio;else{let e=n.split(":").map(Number),{clientWidth:t,clientHeight:r}=o,s=e[0]/e[1];t/r>s?((0,i.setStyle)(a,"width",`${s*r}px`),(0,i.setStyle)(a,"height","100%"),(0,i.setStyle)(a,"margin","0 auto")):((0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height",`${t/s}px`),(0,i.setStyle)(a,"margin","auto 0")),o.dataset.aspectRatio=n}r.show=`${t.get("Aspect Ratio")}: ${"default"===n?t.get("Default"):n}`,e.emit("aspectRatio",n)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"5DA9e":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t}}=e;(0,i.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1swKn":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$container:t,$video:r}}=e;(0,i.def)(e,"autoHeight",{value(){let{clientWidth:a}=t,{videoHeight:o,videoWidth:n}=r,s=a/n*o;(0,i.setStyle)(t,"height",`${s}px`),e.emit("autoHeight",s)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lSbiD:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$container:t,$player:r,$video:a}=e.template;(0,i.def)(e,"autoSize",{value(){let{videoWidth:o,videoHeight:n}=a,{width:s,height:l}=(0,i.getRect)(t),c=o/n;s/l>c?((0,i.setStyle)(r,"width",`${l*c/s*100}%`),(0,i.setStyle)(r,"height","100%")):((0,i.setStyle)(r,"width","100%"),(0,i.setStyle)(r,"height",`${s/c/l*100}%`)),e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"32Hp1":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$player:t}=e.template;(0,i.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kfZbu:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=Number.parseFloat(r))||(t.currentTime=(0,i.clamp)(r,0,e.duration))}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eV1ag:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"duration",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f8NQq:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../config"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:i,template:{$player:l,$video:c,$poster:p}}=e,d=0;for(let t=0;t{e.emit(`video:${t.type}`,t)});e.on("video:canplay",()=>{d=0,e.loading.show=!1}),e.once("video:canplay",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")}),e.on("video:ended",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on("video:error",async i=>{d{e.emit("resize"),s.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on("video:loadstart",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on("video:pause",()=>{e.controls.show=!0,e.mask.show=!0}),e.on("video:play",()=>{e.mask.show=!1,(0,s.setStyle)(p,"display","none")}),e.on("video:playing",()=>{e.mask.show=!1}),e.on("video:progress",()=>{e.playing&&(e.loading.show=!1)}),e.on("video:seeked",()=>{e.loading.show=!1,e.mask.show=!0}),e.on("video:seeking",()=>{e.loading.show=!0,e.mask.show=!1}),e.on("video:timeupdate",()=>{e.mask.show=!1}),e.on("video:waiting",()=>{e.loading.show=!0,e.mask.show=!1})}},{"../config":"eJfh8","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ea3Qm:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,i.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(o){o||(o="normal"),"normal"===o?delete t.dataset.flip:t.dataset.flip=o,a.show=`${r.get("Video Flip")}: ${r.get((0,i.capitalize)(o))}`,e.emit("flip",o)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ffXE3:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>l);var i=e("../libs/screenfull"),n=o.interopDefault(i),s=e("../utils");function l(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",()=>{n.default.isEnabled?(n.default.on("change",()=>{e.emit("fullscreen",n.default.isFullscreen),n.default.isFullscreen?(e.state="fullscreen",(0,s.addClass)(o,"art-fullscreen")):(0,s.removeClass)(o,"art-fullscreen"),e.emit("resize")}),n.default.on("error",t=>{e.emit("fullscreenError",t)}),(0,s.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(e){e?await n.default.request(o):await n.default.exit()}})):a.webkitSupportsFullscreen?(e.on("document:webkitfullscreenchange",()=>{e.emit("fullscreen",e.fullscreen),e.emit("resize")}),(0,s.def)(e,"fullscreen",{get:()=>document.fullscreenElement===a,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})):(0,s.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,s.def)(e,"fullscreen",(0,s.get)(e,"fullscreen"))})}},{"../libs/screenfull":"iSPAQ","../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iSPAQ:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);let o=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=(()=>{if("undefined"==typeof document)return!1;let e=o[0],t={};for(let r of o)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),n={change:i.fullscreenchange,error:i.fullscreenerror},s={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let o=()=>{s.off("change",o),r()};s.on("change",o);let n=e[i.requestFullscreen](t);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((e,t)=>{if(!s.isFullscreen)return void e();let r=()=>{s.off("change",r),e()};s.on("change",r);let a=document[i.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>s.isFullscreen?s.exit():s.request(e,t),onchange(e){s.on("change",e)},onerror(e){s.on("error",e)},on(e,t){let r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=n[e];r&&document.removeEventListener(r,t,!1)},raw:i};Object.defineProperties(s,{isFullscreen:{get:()=>!!document[i.fullscreenElement]},element:{enumerable:!0,get:()=>document[i.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[i.fullscreenEnabled]}}),r.default=s},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8tarF":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,template:{$container:r,$player:a}}=e,o="";(0,i.def)(e,"fullscreenWeb",{get:()=>(0,i.hasClass)(a,"art-fullscreen-web"),set(n){n?(o=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(document.body,a),e.state="fullscreenWeb",(0,i.setStyle)(a,"width","100%"),(0,i.setStyle)(a,"height","100%"),(0,i.addClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,i.append)(r,a),o&&(a.style.cssText=o,o=""),(0,i.removeClass)(a,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],f9syH:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,i.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dLuS7:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{icons:t,proxy:r,storage:a,template:{$player:o,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,i.removeClass)(o,"art-mini"),(0,i.setStyle)(t,"display","none"),o.prepend(n),e.emit("mini",!1))}function d(t,r){e.playing?((0,i.setStyle)(t,"display","none"),(0,i.setStyle)(r,"display","flex")):((0,i.setStyle)(t,"display","flex"),(0,i.setStyle)(r,"display","none"))}function u(){let{$mini:t}=e.template,r=(0,i.getRect)(t),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set("top",o),a.set("left",n),(0,i.setStyle)(t,"top",`${o}px`),(0,i.setStyle)(t,"left",`${n}px`)}(0,i.def)(e,"mini",{get:()=>(0,i.hasClass)(o,"art-mini"),set(f){if(f){e.state="mini",(0,i.addClass)(o,"art-mini");let f=function(){let{$mini:o}=e.template;if(o)return(0,i.append)(o,n),(0,i.setStyle)(o,"display","flex");{let o=(0,i.createElement)("div");(0,i.addClass)(o,"art-mini-popup"),(0,i.append)(document.body,o),e.template.$mini=o,(0,i.append)(o,n);let u=(0,i.append)(o,'
    ');(0,i.append)(u,t.close),r(u,"click",p);let f=(0,i.append)(o,'
    '),h=(0,i.append)(f,t.play),m=(0,i.append)(f,t.pause);return r(h,"click",()=>e.play()),r(m,"click",()=>e.pause()),d(h,m),e.on("video:playing",()=>d(h,m)),e.on("video:pause",()=>d(h,m)),e.on("video:timeupdate",()=>d(h,m)),r(o,"mousedown",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on("document:mousemove",e=>{if(s){(0,i.addClass)(o,"art-mini-dragging");let t=e.pageX-l,r=e.pageY-c;(0,i.setStyle)(o,"transform",`translate(${t}px, ${r}px)`)}}),e.on("document:mouseup",()=>{if(s){s=!1,(0,i.removeClass)(o,"art-mini-dragging");let e=(0,i.getRect)(o);a.set("left",e.left),a.set("top",e.top),(0,i.setStyle)(o,"left",`${e.left}px`),(0,i.setStyle)(o,"top",`${e.top}px`),(0,i.setStyle)(o,"transform",null)}}),o}}(),h=a.get("top"),m=a.get("left");"number"==typeof h&&"number"==typeof m?((0,i.setStyle)(f,"top",`${h}px`),(0,i.setStyle)(f,"left",`${m}px`),(0,i.isInViewport)(f)||u()):u(),e.emit("mini",!0)}else p()}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d1F69:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,storage:r,template:{$video:a,$poster:o}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,i.clamp)(t.volume,0,1));let n=r.get("volume");for(let r in"number"==typeof n&&(a.volume=(0,i.clamp)(n,0,1)),t.poster&&(0,i.setStyle)(o,"backgroundImage",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kewk9:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"pause",{value(){let o=t.pause();return a.show=r.get("Pause"),e.emit("pause"),o}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4XzDs":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,template:{$video:a}}=e;if(document.pictureInPictureEnabled){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,i.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,"enterpictureinpicture",()=>{e.emit("pip",!0)}),r(t,"leavepictureinpicture",()=>{e.emit("pip",!1)})}else if(a.webkitSupportsPresentationMode){let{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,i.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}else(0,i.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jphfi:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,i.def)(e,"playbackRate",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get("Rate")}: ${1===o?r.get("Normal"):`${o}x`}`):e.playbackRate=1}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNpeS:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aBIWL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{$video:t}=e.template;(0,i.def)(e,"playing",{get:()=>"boolean"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],hRBri:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=e;(0,i.def)(e,"play",{async value(){let i=await n.play();if(r.show=t.get("Play"),e.emit("play"),a.mutex)for(let t=0;tn);var i=e("../utils");function n(e){let{template:{$poster:t}}=e;(0,i.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch{return""}},set(e){(0,i.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"17rUP":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"quality",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:i?.html||"",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`,t.html)})}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"55qzI":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"rect",{get:()=>(0,i.getRect)(e.template.$player)});let t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[a]})}(0,i.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,i.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bC6TG:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,template:{$video:r}}=e,a=(0,i.createElement)("canvas");(0,i.def)(e,"getDataURL",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),e(a.toDataURL("image/png"))}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"getBlobUrl",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext("2d").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,i.def)(e,"screenshot",{value:async t=>{let a=await e.getDataURL(),o=t||`artplayer_${(0,i.secondToTime)(r.currentTime)}`;return(0,i.download)(a,`${o}.png`),e.emit("screenshot",a),a}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],j8GRO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t}=e;(0,i.def)(e,"seek",{set(r){e.currentTime=r,e.duration&&(t.show=`${(0,i.secondToTime)(e.currentTime)} / ${(0,i.secondToTime)(e.duration)}`),e.emit("seek",e.currentTime,r)}}),(0,i.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,i.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cn7iR:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let t=["mini","pip","fullscreen","fullscreenWeb"];(0,i.def)(e,"state",{get:()=>t.find(t=>e[t])||"standard",set(r){for(let a=0;an);var i=e("../utils");function n(e){let{notice:t,i18n:r,template:a}=e;(0,i.def)(e,"subtitleOffset",{get:()=>a.$track?.offset||0,set(o){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,i.clamp)(o,-10,10);a.$track.offset=s;for(let t=0;tn);var i=e("../utils");function n(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return void a();let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="";let l={};l.error=t=>{e.off("video:canplay",l.canplay),e.off("video:loadedmetadata",l.metadata),o(t)},l.metadata=()=>{e.currentTime=r},l.canplay=async()=>{e.off("video:error",l.error),e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show="",a()},e.once("video:error",l.error),e.once("video:loadedmetadata",l.metadata),e.once("video:canplay",l.canplay)})}(0,i.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,i.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,i.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7iMuh":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6P0RS":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{events:t,option:r,template:{$progress:a,$video:o}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on("setBar",async(t,d,u)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g="played"===t&&u&&i.isMobile;if("hover"===t||g){if(l||(l=!0,s=await (0,i.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*d;(0,i.setStyle)(f,"display","flex"),t>0&&ta.clientWidth-f/2?(0,i.setStyle)(n,"left",`${a.clientWidth-f}px`):(0,i.setStyle)(n,"left",`${t-f/2}px`)}(t):i.isMobile||(0,i.setStyle)(f,"display","none"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,i.setStyle)(f,"display","none")},500))}}),(0,i.def)(e,"thumbnails",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eNi78:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"toggle",{value:()=>e.playing?e.pause():e.play()})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"7AUBD":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){(0,i.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cnlLL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{option:t,template:{$video:r}}=e;(0,i.def)(e,"url",{get:()=>r.src,async set(a){if(a){let o=e.url,n=t.type||(0,i.getExt)(a),s=t.customType[n];n&&s?(await (0,i.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(o),r.src=a),o!==e.url&&(e.option.url=a,e.isReady&&o&&e.once("video:canplay",()=>{e.emit("restart",a)}))}else await (0,i.sleep)(),e.loading.show=!0}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iX66j:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{template:{$video:t},i18n:r,notice:a,storage:o}=e;(0,i.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,i.clamp)(e,0,1),a.show=`${r.get("Volume")}: ${Number.parseInt(100*t.volume,10)}`,0!==t.volume&&o.set("volume",t.volume)}}),(0,i.def)(e,"muted",{get:()=>t.muted,set:r=>{t.muted=r,e.emit("muted",r)}})}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],cjxJL:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("./autoOrientation"),s=o.interopDefault(n),l=e("./autoPlayback"),c=o.interopDefault(l),p=e("./fastForward"),d=o.interopDefault(p),u=e("./lock"),f=o.interopDefault(u),h=e("./miniProgressBar"),m=o.interopDefault(h);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(m.default),t.lock&&i.isMobile&&this.add(f.default),t.autoPlayback&&!t.isLive&&this.add(c.default),t.autoOrientation&&i.isMobile&&this.add(s.default),t.fastForward&&i.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;ethis.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,i.errorHandle)(!(0,i.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,i.def)(this,r,{value:t}),this}}},{"../utils":"aBlEo","./autoOrientation":"jb9jb","./autoPlayback":"21HWM","./fastForward":"4sxBO","./lock":"fjy9V","./miniProgressBar":"d0xRp","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jb9jb:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{notice:t,constructor:r,template:{$player:a,$video:o}}=e,n="art-auto-orientation",s="art-auto-orientation-fullscreen",l=!1;function c(){let{videoWidth:e,videoHeight:t}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return e>t&&ra}return e.on("fullscreenWeb",t=>{t?c()&&setTimeout(()=>{e.fullscreenWeb&&!(0,i.hasClass)(a,n)&&function(){let t=document.documentElement.clientWidth,r=document.documentElement.clientHeight;(0,i.setStyle)(a,"width",`${r}px`),(0,i.setStyle)(a,"height",`${t}px`),(0,i.setStyle)(a,"transform-origin","0 0"),(0,i.setStyle)(a,"transform",`rotate(90deg) translate(0, -${t}px)`),(0,i.addClass)(a,n),e.isRotate=!0,e.emit("resize")}()},Number(r.AUTO_ORIENTATION_TIME??0)):(0,i.hasClass)(a,n)&&((0,i.setStyle)(a,"width",""),(0,i.setStyle)(a,"height",""),(0,i.setStyle)(a,"transform-origin",""),(0,i.setStyle)(a,"transform",""),(0,i.removeClass)(a,n),e.isRotate=!1,e.emit("resize"))}),e.on("fullscreen",async e=>{let r=!!screen?.orientation?.lock;if(e){if(r&&c())try{let e=screen.orientation.type.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),l=!0,(0,i.addClass)(a,s)}catch(e){l=!1,t.show=e}}else if((0,i.hasClass)(a,s)&&(0,i.removeClass)(a,s),r&&l){try{screen.orientation.unlock()}catch{}l=!1}}),{name:"autoOrientation",get state(){return(0,i.hasClass)(a,n)}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"21HWM":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:`
    `}),c=(0,i.query)(".art-auto-playback-last",l),p=(0,i.query)(".art-auto-playback-jump",l),d=(0,i.query)(".art-auto-playback-close",l);(0,i.append)(d,r.close);let u=null;function f(){let r=(a.get("times")||{})[e.option.id||e.option.url];clearTimeout(u),(0,i.setStyle)(l,"display","none"),r&&r>=o.AUTO_PLAYBACK_MIN&&((0,i.setStyle)(l,"display","flex"),c.textContent=`${t.get("Last Seen")} ${(0,i.secondToTime)(r)}`,p.textContent=t.get("Jump Play"),n(d,"click",()=>{(0,i.setStyle)(l,"display","none")}),n(p,"click",()=>{e.seek=r,e.play(),(0,i.setStyle)(s,"display","none"),(0,i.setStyle)(l,"display","none")}),e.once("video:timeupdate",()=>{u=setTimeout(()=>{(0,i.setStyle)(l,"display","none")},o.AUTO_PLAYBACK_TIMEOUT)}))}return e.on("video:timeupdate",()=>{if(e.playing){let t=a.get("times")||{},r=Object.keys(t);r.length>o.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set("times",t)}}),e.on("ready",f),e.on("restart",f),{name:"auto-playback",get times(){return a.get("times")||{}},clear:()=>a.del("times"),delete(e){let t=a.get("times")||{};return delete t[e],a.set("times",t),t}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4sxBO":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{constructor:t,proxy:r,template:{$player:a,$video:o}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,i.removeClass)(a,"art-fast-forward"))};return r(o,"touchstart",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,i.addClass)(a,"art-fast-forward")},t.FAST_FORWARD_TIME))}),e.on("document:touchmove",c),e.on("document:touchend",c),{name:"fastForward",get state(){return(0,i.hasClass)(a,"art-fast-forward")}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fjy9V:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{layers:t,icons:r,template:{$player:a}}=e;function o(){return(0,i.hasClass)(a,"art-lock")}function n(){(0,i.addClass)(a,"art-lock"),e.isLock=!0,e.emit("lock",!0)}function s(){(0,i.removeClass)(a,"art-lock"),e.isLock=!1,e.emit("lock",!1)}return t.add({name:"lock",mounted(t){let a=(0,i.append)(t,r.lock),o=(0,i.append)(t,r.unlock);(0,i.setStyle)(a,"display","none"),e.on("lock",e=>{e?((0,i.setStyle)(a,"display","inline-flex"),(0,i.setStyle)(o,"display","none")):((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(o,"display","inline-flex"))})},click(){o()?s():n()}}),{name:"lock",get state(){return o()},set state(value){value?n():s()}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],d0xRp:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){return e.on("control",t=>{t?(0,i.removeClass)(e.template.$player,"art-mini-progress-bar"):(0,i.addClass)(e.template.$player,"art-mini-progress-bar")}),{name:"mini-progress-bar"}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],bwLGT:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("../utils"),n=e("../utils/component"),s=o.interopDefault(n),l=e("./aspectRatio"),c=o.interopDefault(l),p=e("./flip"),d=o.interopDefault(p),u=e("./playbackRate"),f=o.interopDefault(u),h=e("./subtitleOffset"),m=o.interopDefault(h);class g extends s.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on("blur",()=>{this.show&&(this.show=!1,this.render())}),e.on("focus",e=>{let t=(0,i.includeFromEvent)(e,r.setting),a=(0,i.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on("resize",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,f.default)(this.art)),t.aspectRatio&&e.push((0,c.default)(this.art)),t.flip&&e.push((0,d.default)(this.art)),t.subtitleOffset&&e.push((0,m.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r{t.default=t===e,t.default&&t.$item&&(0,i.inverseClass)(t.$item,"art-current")},e.$option),this.render(e.$parents))}format(e=this.option,t,r,a=[]){for(let o=0;ot}),(0,i.def)(n,"$parents",{get:()=>r}),(0,i.def)(n,"$option",{get:()=>e});let a=[];(0,i.def)(n,"$events",{get:()=>a}),(0,i.def)(n,"$formatted",{get:()=>!0})}this.format(n.selector||[],n,e,a)}this.option=e}find(e=""){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let n=this.active[0]?.$parent?.width||t,{left:s,width:l}=(0,i.getRect)(e.setting),{left:c,width:p}=(0,i.getRect)(a),d=s-c+l/2-n/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,i.setStyle)(o,"height",`${u}px`),(0,i.setStyle)(o,"width",`${n}px`),this.art.isRotate||i.isMobile)return;d+n>p?((0,i.setStyle)(o,"left",null),(0,i.setStyle)(o,"right",null)):((0,i.setStyle)(o,"left",`${d}px`),(0,i.setStyle)(o,"right","auto"))}}inactivate(e){for(let t=0;t
    '),l=(0,i.createElement)("div");(0,i.addClass)(l,"art-setting-item-left-icon"),(0,i.append)(l,a),(0,i.append)(s,l),(0,i.append)(s,e.$parent.html);let c=r(n,"click",()=>this.render(e.$parents));e.$parent.$events.push(c),(0,i.append)(t,n)}createItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o="selector";(0,i.has)(e,"switch")&&(o="switch"),(0,i.has)(e,"range")&&(o="range"),(0,i.has)(e,"onClick")&&(o="button");let{icons:n,proxy:s,constructor:l}=this.art,c=(0,i.createElement)("div");(0,i.addClass)(c,"art-setting-item"),(0,i.setStyle)(c,"height",`${l.SETTING_ITEM_HEIGHT}px`),c.dataset.name=e.name||"",c.dataset.value=e.value||"";let p=(0,i.append)(c,'
    '),d=(0,i.append)(c,'
    '),u=(0,i.createElement)("div");switch((0,i.addClass)(u,"art-setting-item-left-icon"),o){case"button":case"switch":case"range":(0,i.append)(u,e.icon||n.config);break;case"selector":e.selector?.length?(0,i.append)(u,e.icon||n.config):(0,i.append)(u,n.check)}(0,i.append)(p,u),(0,i.def)(e,"$icon",{configurable:!0,get:()=>u}),(0,i.def)(e,"icon",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML="",(0,i.append)(u,e)}});let f=(0,i.createElement)("div");(0,i.addClass)(f,"art-setting-item-left-text"),(0,i.append)(f,e.html||""),(0,i.append)(p,f),(0,i.def)(e,"$html",{configurable:!0,get:()=>f}),(0,i.def)(e,"html",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML="",(0,i.append)(f,e)}});let h=(0,i.createElement)("div");switch((0,i.addClass)(h,"art-setting-item-right-tooltip"),(0,i.append)(h,e.tooltip||""),(0,i.append)(d,h),(0,i.def)(e,"$tooltip",{configurable:!0,get:()=>h}),(0,i.def)(e,"tooltip",{configurable:!0,get:()=>h.innerHTML,set(e){h.innerHTML="",(0,i.append)(h,e)}}),o){case"switch":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,n.switchOn),a=(0,i.append)(t,n.switchOff);(0,i.setStyle)(e.switch?a:r,"display","none"),(0,i.append)(d,t),(0,i.def)(e,"$switch",{configurable:!0,get:()=>t});let o=e.switch;(0,i.def)(e,"switch",{configurable:!0,get:()=>o,set(e){o=e,e?((0,i.setStyle)(a,"display","none"),(0,i.setStyle)(r,"display",null)):((0,i.setStyle)(a,"display",null),(0,i.setStyle)(r,"display","none"))}});break}case"range":{let t=(0,i.createElement)("div");(0,i.addClass)(t,"art-setting-item-right-icon");let r=(0,i.append)(t,'');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,i.addClass)(r,"art-setting-range"),(0,i.append)(d,t),(0,i.def)(e,"$range",{configurable:!0,get:()=>r});let a=[...e.range];(0,i.def)(e,"range",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case"selector":if(e.selector?.length){let e=(0,i.createElement)("div");(0,i.addClass)(e,"art-setting-item-right-icon"),(0,i.append)(e,n.arrowRight),(0,i.append)(d,e)}}switch(o){case"switch":if(e.onSwitch){let t=s(c,"click",async t=>{e.switch=await e.onSwitch.call(this.art,e,c,t)});e.$events.push(t)}break;case"range":if(e.$range){if(e.onRange){let t=s(e.$range,"change",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,c,t)});e.$events.push(t)}if(e.onChange){let t=s(e.$range,"input",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,c,t)});e.$events.push(t)}}break;case"selector":{let t=s(c,"click",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,c,t)))});e.$events.push(t),e.default&&(0,i.addClass)(c,"art-current")}break;case"button":if(e.onClick){let t=s(c,"click",async t=>{e.tooltip=await e.onClick.call(this.art,e,c,t)});e.$events.push(t)}}(0,i.def)(e,"$item",{configurable:!0,get:()=>c}),t?(0,i.replaceElement)(c,a):(0,i.append)(r,c),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,i.inverseClass)(t,"art-current")}else{let t=(0,i.createElement)("div");this.cache.set(e,t),(0,i.addClass)(t,"art-setting-panel"),(0,i.append)(this.$parent,t),(0,i.inverseClass)(t,"art-current"),e[0]?.$parent&&this.createHeader(e[0]);for(let t=0;t({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on("aspectRatio",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ljJTO:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r),o.export(r,"default",()=>n);var i=e("../utils");function n(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=e;function n(e){return t.get((0,i.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:"flip",html:t.get("Video Flip"),tooltip:n(e.flip),icon:r.flip,selector:o.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on("flip",()=>s())}}}},{"../utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3QcSQ":[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on("video:ratechange",()=>n())}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],eB5hg:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");function i(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],`${t.range[0]}s`),mounted:(t,r)=>{e.on("subtitleOffset",e=>{r.$range.value=e,r.tooltip=`${e}s`})}}}o.defineInteropFlag(r),o.export(r,"default",()=>i)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kwqbK:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch{return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch{delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],k5613:[function(e,t,r,a){var o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(r);var i=e("option-validator"),n=o.interopDefault(i),s=e("./scheme"),l=o.interopDefault(s),c=e("./utils"),p=e("./utils/component"),d=o.interopDefault(p);class u extends d.default{constructor(e){super(e),this.name="subtitle",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return"object"==typeof e?(0,c.setStyles)(r,e):(0,c.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML="",this.activeCues.length&&(this.art.emit("subtitleBeforeUpdate",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\r?\n/).filter(e=>e.trim()).map(t=>`
    ${e.escape?(0,c.escape)(t):t}
    `).join("")).join(""),this.art.emit("subtitleAfterUpdate",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:o}=this.art,{$video:i,$track:n}=r,s=(0,c.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.label=o.subtitle.name||"Artplayer",s.track.mode="hidden",s.onload=()=>{this.art.emit("subtitleLoad",this.cues,this.option)},this.art.events.remove(this.destroyEvent),n.onload=null,(0,c.remove)(n),(0,c.append)(i,s),r.$track=s,this.destroyEvent=a(this.textTrack,"cuechange",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,n.default)(e,l.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,c.getExt)(e.url)){case"srt":{let t=(0,c.srtToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"ass":{let t=(0,c.assToVtt)(r),a=e.onVttLoad(t);return(0,c.vttToBlob)(a)}case"vtt":{let t=e.onVttLoad(r);return(0,c.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e)),e)).catch(e=>{throw r.innerHTML="",t.show=e,e})):void 0:null}}r.default=u},{"option-validator":"g7VGh","./scheme":"biLjm","./utils":"aBlEo","./utils/component":"idCEj","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fwOA1:[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var o=e("../package.json"),i=e("./utils");class n{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,i.query)(t.container),(0,i.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,i.errorHandle)((0,i.supportsFlex)(),"The current browser does not support flex layout");let a=this.$container.tagName.toLowerCase();(0,i.errorHandle)("div"===a,`Unsupported container element type, only support 'div' but got '${a}'`),(0,i.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`
    Player version:
    ${o.version}
    Video url:
    Video volume:
    Video time:
    Video duration:
    Video resolution:
    x
    [x]
    `}query(e){return(0,i.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=n.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,i.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'"),(0,i.replaceElement)(t,this.$video),t.className="art-video",this.$video=t}e.backdrop&&(0,i.addClass)(this.$player,"art-backdrop"),i.isMobile&&(0,i.addClass)(this.$player,"art-mobile")}destroy(e){e?this.$container.innerHTML="":(0,i.addClass)(this.$player,"art-destroy")}}r.default=n},{"../package.json":"lh3R5","./utils":"aBlEo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4NM7P":[function(e,t,r,a){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;e