test(mediabunny): [PKG-MB-01] freeze published proxy and dependency contracts

This commit is contained in:
Harvey Zhao committed 2026-09-12 17:05:55 +08:00
1 parent 1f93bb9ba1
commit 1cfd2e17f3
18 files changed
+1357 -7

No files matched your search

@@ -0,0 +1,65 @@
{
"task": "PKG-MB-01",
"status": "done",
"scope": "Historical source/package/interface and dependency provenance, not real media or release acceptance",
"checks": [
{
"command": "node --test refactor/scripts/mb-contract.test.mjs",
"result": "pass",
"tests": 19,
"historicalArchiveMembers": 12,
"frozenGitInputs": 17,
"declaredOptionPaths": 25,
"scope": "Historical package/interface, actual exports, type consumers and controlled media-method forwarding; not native media playback"
},
{
"command": "focused eslint --no-fix",
"result": "pass",
"files": [
"refactor/scripts/mb-contract.mjs",
"refactor/scripts/mb-contract.test.mjs",
"refactor/scripts/contracts.test.mjs",
"test/helpers/mediabunny.js"
]
},
{
"command": "yarn ci:check",
"result": "pass",
"tests": {
"unit": 1006,
"engineering": 14,
"baseline": 141,
"mainTotal": 1161,
"repeatedContractExecutions": 44
},
"strictProductionTypeScriptFiles": 290,
"log": "refactor/.cache/mb01-ci-verified.log"
},
{
"command": "production/demo/artifact hashes compared with frozen source",
"result": "unchanged",
"files": 17
}
],
"limitations": [
"Native MP4/WebM/HLS/Blob/Stream and AV synchronization remain MB-02/09.",
"Historical bundled SDK exact version unknown; current installed SDK is recorded separately.",
"License/source-notice packaging remains MB-10; no legal compliance claim.",
"Canvas/Ambilight factory decision remains pending and is not decided by this task."
],
"parentCommit": "1f93bb9ba1f7329a348c1b0538473615e5278d7c",
"failedAttempts": [
{
"log": "refactor/.cache/mb01-tests-first.log",
"resolution": "Exact historical readonly-write behavior and TypeScript-version diagnostic codes retained; VM exception checked by name."
},
{
"log": "refactor/.cache/mb01-ci.log",
"resolution": "Generated contract-index.md was stale after adding two published versions; regenerated using contracts.mjs --write before the passing full CI."
},
{
"log": "refactor/.cache/mb01-ci-final.log",
"resolution": "Contract model assertion still expected fifteen published versions; updated to seventeen and explicitly asserted the two MediaBunny release identities before the final passing CI."
}
]
}
+113
View File
@@ -0,0 +1,113 @@
# MediaBunny proxy 历史契约
来源:[发布与 Git 哈希](mb-release.json)、[实际产物表面及全部配置声明](mb-surface.json)。
PKG-MB-01 只冻结可观察接口、来源和依赖/资源范围;真实媒体时序、音画同步及长期释放由
PKG-MB-02/09 验证。以下标为源码观察的顺序,不等于浏览器已经通过。
## 发布范围与入口
| 来源 | 运行时主入口 | 类型 | 扩展能力 |
| --- | --- | --- | --- |
| npm 1.0.0 | CommonJS namespace.default;原生 ESM default | 可选 Option → 同步 initializer → HTMLCanvasElement | 不创建 art.mediabunny,没有三个 HLS 方法 |
| npm 1.2.0 | CommonJS 直接工厂;原生 ESM default | 保持可选参数、Canvas 返回;增加 m3u8 | 创建 art.mediabunny,提供 HLS 状态与选轨 |
| 冻结工作区 | 与 1.2.0 同代,单独冻结字节 | 当前声明单独冻结 | 不是对历史 tarball 的替代 |
两份实际 tarball 各6个文件:README、package.json、types 声明、main/legacy/ESM。
没有独立 worker、WASM、source map 或许可证/通知成员;不据此推断 SDK 永远不会使用
浏览器 worker 等能力。main/module/types/legacy、root/legacy exports 的原始值见 manifest。
所有入口存在。1.0.0 关联 Git 核心5.3.1-beta.1,1.2.0关联5.4.1;这是提交关联,
不是已测支持范围,也不是已验证的 npm 核心组合。
## 配置
完整25条顶层/嵌套配置路径与回调结构已记录在 mb-surface.json.options。
| 配置 | 默认或语义 | 边界 |
| --- | --- | --- |
| loadTimeout | 0;只接受有限数字作为超时 | 非正值不启动超时;成功后 timeout timer 的所有权待02/03验证 |
| timeupdateInterval | 250 ms,使用 ?? | VideoEngine 发 timeupdate 的间隔 |
| avSyncTolerance | 0.12 s,使用 ?? | 视频相对音频时钟容差 |
| dropLateFrames | false,使用 ?? | 不因优化静默改变默认丢帧策略 |
| poster | 空字符串 | 异步 Image 绘制;后续 poster setter 改 option,不代表已同步重设 VideoEngine |
| source | 无 | 真值时优先,否则取 art.option.url;公开类型 string / Blob / ReadableStream<Uint8Array> |
| preflightRange | false | 字符串非HLS源 HEAD;无 accept-ranges 或 none 发 RangeNotSupported error 后返回false;网络异常警告后继续 |
| volume | 0.7,使用 ?? | 初始值不钳制;setter转数值并钳制0..1,同时取消muted |
| muted | false,布尔转换 | setter布尔转换,发volumechange |
| autoplay / loop | false | getter读option;setter为空实现,不能声称真正实现自动播放或循环 |
| crossOrigin | 空字符串 | setter为空实现,不据此推断 fetch 的 CORS/凭据策略 |
| m3u8 | 无,1.2.0新增 | 真值才安装loadedmetadata/restart监听 |
| m3u8.quality / audio | 各含control、setting、title、auto、getName | control/setting默认不显示,title默认Quality/Audio,auto默认Auto |
工厂保留传入 option 对象的引用,没有克隆;同工厂初始化多个实例可共享该引用。
quality.getName接收id/index/name/height/bitrate;audio.getName接收id/index/name/lang/language/bitrate。
运行时状态还保留实际SDK track对象,当前公开配置回调声明未暴露track。
## Canvas 与 art.mediabunny
公开Result严格为HTMLCanvasElement;不能直接重标成HTMLVideoElement。1.2.0的
art.mediabunny指向VideoShim实例,destroy回调删除该字段并调用shim.destroy。
入口枚举 shim 实例自身和直接原型的全部属性,为 Canvas 中不存在的属性添加可配置、
可枚举的getter/setter;方法每次读取重新bind(shim),因此`canvas.play !== canvas.play`。
已有Canvas属性/方法优先保留;枚举到的原生方法再绑定原Canvas,不将原生事件接口替换成shim。
其结果是`canvas.setAttribute('src', url)`不等于`canvas.src = url`,Canvas监听器也不会
自动收到shim发给ArtPlayer的媒体事件。浏览器中的完整属性集合仍要在02验证。
| 分组 | 成员与行为 |
| --- | --- |
| 来源/时间 | src读写保存输入,真值触发engine.load;currentSrc同源;currentTime写入Number(t)或0并调用异步seek;duration只读 |
| 状态 | paused、playing、ended、seeking、readyState、networkState、error映射engine;playing由paused/ended计算 |
| 媒体范围 | buffered、played、seekable是合成范围;无有效duration或end<=0为空;非空start/end不校验下标,buffered不是实际下载进度 |
| 速度/音量 | playbackRate默认1,只拒绝NaN及<=0;volume setter钳制并取消静音;muted布尔转换;均转发engine并发对应事件 |
| 播放 | play返回engine的Promise;pause/load返回undefined;currentTime/src属性赋值不返回底层Promise |
| HLS(1.2.0) | getM3u8State返回Promise;switchM3u8Quality(id或'auto')、switchM3u8Audio(id或'auto')返回Promise |
| 尺寸 | videoWidth、videoHeight读取engine;Canvas width/height仍是原生成员 |
| 属性兼容 | poster可写修改option;autoplay/loop/crossOrigin只读option但setter不执行动作;controls=false、playsInline=true、preload='auto'、defaultMuted=false、defaultPlaybackRate=1,相应setter均无动作 |
| 能力/帧 | canPlayType无条件'maybe',不是codec支持检测;requestVideoFrameCallback只是单次RAF,presentedFrames=0;cancelVideoFrameCallback调用cancelAnimationFrame |
| 辅助方法 | setupEventForwarding、createTimeRanges、getBoundingClientRect、setAttribute、destroy;后两种DOM同名方法在Canvas侧仍原生优先 |
| 意外可观察字段 | art、canvas、option、events、engine、_src、_volume、_muted、_playbackRate同样被转发;完整own/prototype清单见JSON。重构不得仅因以下划线开头就默认可以删除 |
readonly属性的Canvas转发setter存在,但底层shim无setter:实际1.0.0主产物静默忽略duration
写入,1.2.0/冻结工作区主产物抛TypeError。这是已发布代际差异,不能简单标为统一旧行为。
## 输入与 HLS(当前冻结源码观察)
input.js集中检测`.m3u8`后缀,支持查询/片段且大小写不敏感;不嗅探无后缀URL内容。
字符串/Blob/ReadableStream分别封装对应SDK Source,其余值原样传递,空值转null。
Input选择HLS_FORMATS或ALL_FORMATS。先取主视频,再取其可配对主音频;无视频才取主音频。
直播duration为Infinity;非直播优先metadata,null才computeDuration。SDK拒绝和无轨道路径待02测试。
HLS状态包含levels、audios、currentLevel、currentAudio、videoMode、audioMode;只有与当前视频
可配对的音频进入状态列表。手动质量/音频通过SDK id选择,'auto'重新选主轨道;若旧搭档不能配对,
补选可配对轨道并将搭档mode置auto。不能把mode名称当作已证明持续ABR自适应。
控件/设置名为mediabunny-quality、mediabunny-audio;按实际current id标记default,名称去重,
质量按高度降序;音轨少于2隐藏。缺HLS状态或配置不启用时通过controls.remove/setting.remove清理。
选中后await切轨,写notice,再await更新。并发更新/销毁后的晚回写留给07验证。
## 事件与异步边界(当前冻结源码观察)
| 触发 | 可观察事件和状态 |
| --- | --- |
| shim事件 | 自有EventTarget构造Event,写detail;按Artplayer.constructor.config.events逐项桥接video:名称;非DOM dispatchEvent |
| load开始 | pause旧播放、dispose旧Input;networkState=2、readyState=0;两个零延迟timer分别发waiting、loadstart,不能假设始终早于异步metadata |
| 元数据齐备 | readyState=1;loadedmetadata → durationchange → progress;无轨道/异步callback的次数待02复现 |
| 加载完成 | readyState=4、networkState=1;loadeddata → canplay → canplaythrough → progress |
| load失败/超时 | error={code:4,message}、networkState=3,发error;外层和performLoad内层都有捕获,不据此推断所有Input已释放 |
| play/pause | play await audio后启动video,发play → playing;pause同步audio.pause/video.stop后发pause;ended重播先seek(0) |
| seek | seeking=true;seeking → waiting,暂停并等待audio/video.seek;seeking=false后seeked,必要时恢复play |
| 选轨 | 保留currentTime及是否播放,pause,seeking → waiting;重新load/seek后发metadata/duration/progress/data/canplay/canplaythrough/seeked,再恢复play |
| 帧/音频调度 | VideoEngine还可发timeupdate、ended、pause、canplay、playing、waiting;AudioEngine也可发canplay、playing。一次性/重复事件不能只从主Engine判断 |
| destroy | pause、disposeInput、audio.destroy、video.destroy;loadSeq未在destroy递增,未统一收回全部timer/RAF;准确竞态与释放证据待02 |
## 依赖与许可范围
1.0.0声明mediabunny ^1.27.3,1.2.0/当前声明^1.43.1。当前Yarn锁和安装版本1.56.1,
其package.json为MPL-2.0,LICENSE为完整Mozilla Public License 2.0;冻结相应文件哈希。
SDK清单另含两个@types依赖,不能把类型依赖自动计为播放产物中的JS。
实际历史ESM内含AudioBufferSink/CanvasSink实现,三个历史格式均未发现MPL/Source Code Form
通知标记;两份归档均无LICENSE/NOTICE成员,README和包清单仅标MIT。这个事实不构成
完整法律判断,但候选发布必须补齐实际内嵌依赖的来源、许可/通知和可获得的对应源码说明。
历史归档没有构建依赖版本证明,关联Git无锁文件,因此内嵌SDK精确版本记为unknown;
不能拿当前安装1.56.1冒充历史构建版本。由MB-LICENSE-01和PKG-MB-10继续关闭。
+186
View File
@@ -0,0 +1,186 @@
{
"schemaVersion": 1,
"task": "PKG-MB-01",
"capturedAt": "2026-09-12T08:48:19.282Z",
"registry": {
"url": "https://registry.npmjs.org/artplayer-proxy-mediabunny",
"versions": [
"1.0.0",
"1.2.0"
],
"distTags": {
"latest": "1.2.0"
}
},
"release": {
"name": "artplayer-proxy-mediabunny",
"version": "1.2.0",
"tarball": "https://registry.npmjs.org/artplayer-proxy-mediabunny/-/artplayer-proxy-mediabunny-1.2.0.tgz",
"integrity": "sha512-uSKkJFvd5Y2XxPPhwtPM5k9qq3xScbWnO/9fOfC8S+Liz8f8nT/iyA2eynU3maVcHZbJgA3PHZm0r6RRmSkefg==",
"sha256": "acb016166059183917a6de2e03a65ad77b09997fc9fb62513d751a24467ca76c",
"manifest": {
"name": "artplayer-proxy-mediabunny",
"version": "1.2.0",
"description": "mediabunny proxy for ArtPlayer",
"author": "Harvey Zhao <laozhaochaguan@gmail.com>",
"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.43.1"
}
},
"files": {
"package/README.md": "32377da36a37d7ddc2b85031645b3b2ee49fea7185c3cef1d0b674b52367d58f",
"package/dist/artplayer-proxy-mediabunny.js": "7d088c0abe2f3c1e2857cb0547405ce1e5588630f28e484a64211fc675322bbd",
"package/dist/artplayer-proxy-mediabunny.legacy.js": "327da5f1be221af6887efb4175c1b92e4e0c28838cae8107acca652a76bddccb",
"package/dist/artplayer-proxy-mediabunny.mjs": "42f85d84456d1710a8b71640b1cb4f51203052692b84da9f401077f331dc057b",
"package/package.json": "96b09ce19ea7914485aa9780329a0cfc43b18e38232ea1dd92d2e6dc27310055",
"package/types/artplayer-proxy-mediabunny.d.ts": "af2083224d0760752d83eb2ac86b1dea5586455b81d47e4ba70f9f6a874a75d8"
},
"gitHead": "fc90d4a0df8fe4efaf2172ca7b04dd059eed8144",
"publishedAt": "2026-05-04T05:27:32.743Z",
"historicalCore": {
"commit": "fc90d4a0df8fe4efaf2172ca7b04dd059eed8144",
"file": "packages/artplayer/package.json",
"version": "5.4.1",
"sha256LF": "06cbc0de3f944dfc215ea1c4e7c3376e6352ee5d6f1f459828f45025c62f57f0",
"scope": "Git association only, not a published core support range or proof of proxy capability"
},
"bundledDependencyVersion": null,
"bundledDependencyVersionEvidence": "Published tarball does not provide dependency build provenance; Git tree contains no lockfile. The manifest range does not identify the embedded SDK version."
},
"previous": [
{
"name": "artplayer-proxy-mediabunny",
"version": "1.0.0",
"tarball": "https://registry.npmjs.org/artplayer-proxy-mediabunny/-/artplayer-proxy-mediabunny-1.0.0.tgz",
"integrity": "sha512-i9ot2ZbGqviO+BdcJJS0BqgfBmXBOCt2EuRJJBrp0QArCbXkjzOxRutSn4kIUfTWnLcazgego4on1HPkt5ZE9w==",
"sha256": "d62f3ad75d07abbc8ca597846e213f34abd15b3742f7e87f294800fdef2e8962",
"manifest": {
"name": "artplayer-proxy-mediabunny",
"version": "1.0.0",
"description": "mediabunny proxy for ArtPlayer",
"author": "Harvey Zack <laozhaochaguan@gmail.com>",
"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.27.3"
}
},
"files": {
"package/README.md": "5cab1501e0a724fa43bd54ce4aa61eb6c43b01411484c370a6a2054accdd5145",
"package/dist/artplayer-proxy-mediabunny.js": "7331465d8c7a6575505b9d3fd45986c5d3d9cb3839b2620ad5a52c581199562b",
"package/dist/artplayer-proxy-mediabunny.legacy.js": "370b3340c2bc14912ea1f64de9e9d34aa917e6620f027733dd23e7dc0b6d4d05",
"package/dist/artplayer-proxy-mediabunny.mjs": "548adec34185ec1619bbc602c06cc8a8e0ed3c4752494f1f623aa0ec1cf2c2d7",
"package/package.json": "7a05c5110ee7468406ca2bdcff676f8c8c9837629310e008a746ab29523745b3",
"package/types/artplayer-proxy-mediabunny.d.ts": "d88bb80cd47603e35ca12bbf3311a7cd678b906d9cd977b73e89d7cb5a7d3075"
},
"gitHead": "4a0fbda3c4cd2a1b223f3172697ac98a14ddb7b6",
"publishedAt": "2026-01-01T11:49:03.448Z",
"historicalCore": {
"commit": "4a0fbda3c4cd2a1b223f3172697ac98a14ddb7b6",
"file": "packages/artplayer/package.json",
"version": "5.3.1-beta.1",
"sha256LF": "e1a0a390ec10cd8c1c12006ac6515414ae98a964300dd3e9c288377def948497",
"scope": "Git association only, not a published core support range or proof of proxy capability"
},
"bundledDependencyVersion": null,
"bundledDependencyVersionEvidence": "Published tarball does not provide dependency build provenance; Git tree contains no lockfile. The manifest range does not identify the embedded SDK version."
}
],
"sourceCommit": "1f93bb9ba1f7329a348c1b0538473615e5278d7c",
"source": {
"packages/artplayer-proxy-mediabunny/src/AudioEngine.js": "910d6831372e4895d55dec78010f281a199bc88f99735630a5a3b621f192ac35",
"packages/artplayer-proxy-mediabunny/src/EventTarget.js": "c1854510af5a37301b4bd3b1fbcc28f7e0f105f50cb67324c5c05a76f2d054fb",
"packages/artplayer-proxy-mediabunny/src/index.js": "4e1be8937908ff6e6ef8a4e863e22b4468312cf31d66ac299322e475757773bb",
"packages/artplayer-proxy-mediabunny/src/input.js": "4341c27a8d8ebc77334ac96fc8cec11fc28e369e115eb690c6aeb0a352863d81",
"packages/artplayer-proxy-mediabunny/src/m3u8.js": "4639f09e0c743dc2b24078f48ca1e58eaaedaa3f5e6b863583cbd4bc4a7d3142",
"packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js": "3f847bd1e8dfe5334e55def87862af7412af0204691c275293758cff95950189",
"packages/artplayer-proxy-mediabunny/src/VideoEngine.js": "6b73dd5867a5640b68f801b397ace36bb6289e50cca176bfc9288d71f67e6e0b",
"packages/artplayer-proxy-mediabunny/src/VideoShim.js": "f01c954e8a98fb70138dded78b99eb2765f5cd1e8a98dafbb35ffbf8f7741dbb",
"packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts": "af2083224d0760752d83eb2ac86b1dea5586455b81d47e4ba70f9f6a874a75d8",
"packages/artplayer-proxy-mediabunny/package.json": "96b09ce19ea7914485aa9780329a0cfc43b18e38232ea1dd92d2e6dc27310055",
"packages/artplayer-proxy-mediabunny/README.md": "32377da36a37d7ddc2b85031645b3b2ee49fea7185c3cef1d0b674b52367d58f",
"packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js": "7d088c0abe2f3c1e2857cb0547405ce1e5588630f28e484a64211fc675322bbd",
"packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js": "327da5f1be221af6887efb4175c1b92e4e0c28838cae8107acca652a76bddccb",
"packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs": "42f85d84456d1710a8b71640b1cb4f51203052692b84da9f401077f331dc057b",
"docs/assets/example/mediabunny.js": "dad4cecb76b2e5ce9164a4da715793911123e8fd2bc4b93f4bcc86a7053bad7d",
"packages/artplayer-plugin-hls-control/src/audio.svg": "dbee5ce7487c9f8ec927e5286188cf9439345bbe947b6c06c32c07193e01e0be",
"packages/artplayer-plugin-hls-control/src/quality.svg": "4666a4c01764422f9008e442f5a889ff9691bb0386083d673943a0718f4d680c"
},
"dependency": {
"name": "mediabunny",
"version": "1.56.1",
"declaredRange": "^1.43.1",
"manifestLicense": "MPL-2.0",
"dependencies": {
"@types/dom-mediacapture-transform": "^0.1.11",
"@types/dom-webcodecs": "0.1.13"
},
"files": {
"package.json": "809d14362055f6db3c17dd6dd43d7b913fc4daf4ac4f4179f29128eec866d868",
"LICENSE": "3f3d9e0024b1921b067d6f7f88deb4a60cbe7a78e76c64e3f1d7fc3b779b9d04",
"src/index.ts": "ba7672de9670183cd7c9965b844cbc4e134b9daa7aded6e0cf1efa0a5d736d78",
"dist/modules/src/index.js": "9236aa229772332a4f5ed04e453d8794a84311468012a9dd0de78e35301d39c0"
},
"scope": "Installed and Yarn-locked dependency provenance for the upcoming candidate build only, never claimed as the SDK version embedded in historical bundles"
}
}
+494
View File
@@ -0,0 +1,494 @@
{
"task": "PKG-MB-01",
"scope": "Actual historical main bundles instantiated without a media source against a controlled canvas and ArtPlayer event host. Canvas native members win; full browser descriptor variations and native media events are MB-02/09, not this snapshot.",
"records": [
{
"name": "published-1.2.0",
"exported": "function",
"artMediabunny": true,
"canvasKeys": [
"width",
"height",
"style",
"getContext",
"addEventListener",
"removeEventListener",
"getBoundingClientRect",
"setAttribute",
"art",
"canvas",
"option",
"events",
"engine",
"_src",
"_volume",
"_muted",
"_playbackRate",
"setupEventForwarding",
"src",
"currentSrc",
"currentTime",
"duration",
"buffered",
"played",
"seekable",
"createTimeRanges",
"paused",
"playing",
"ended",
"seeking",
"readyState",
"networkState",
"error",
"playbackRate",
"volume",
"muted",
"play",
"pause",
"load",
"getM3u8State",
"switchM3u8Quality",
"switchM3u8Audio",
"videoWidth",
"videoHeight",
"poster",
"autoplay",
"loop",
"controls",
"playsInline",
"crossOrigin",
"preload",
"defaultMuted",
"defaultPlaybackRate",
"canPlayType",
"requestVideoFrameCallback",
"cancelVideoFrameCallback",
"destroy"
],
"shimOwn": [
"art",
"canvas",
"option",
"events",
"engine",
"_src",
"_volume",
"_muted",
"_playbackRate"
],
"shimPrototype": [
"constructor",
"setupEventForwarding",
"addEventListener",
"removeEventListener",
"src",
"currentSrc",
"currentTime",
"duration",
"buffered",
"played",
"seekable",
"createTimeRanges",
"paused",
"playing",
"ended",
"seeking",
"readyState",
"networkState",
"error",
"playbackRate",
"volume",
"muted",
"play",
"pause",
"load",
"getM3u8State",
"switchM3u8Quality",
"switchM3u8Audio",
"videoWidth",
"videoHeight",
"poster",
"autoplay",
"loop",
"controls",
"playsInline",
"crossOrigin",
"preload",
"defaultMuted",
"defaultPlaybackRate",
"canPlayType",
"getBoundingClientRect",
"requestVideoFrameCallback",
"cancelVideoFrameCallback",
"setAttribute",
"destroy"
],
"defaults": {
"volume": 0.7,
"muted": false,
"playbackRate": 1,
"autoplay": false,
"loop": false,
"poster": "",
"crossOrigin": "",
"src": null,
"paused": true,
"readyState": 0,
"networkState": 0,
"preload": "auto",
"playsInline": true,
"controls": false,
"defaultMuted": false,
"defaultPlaybackRate": 1
}
},
{
"name": "published-1.0.0",
"exported": "object",
"artMediabunny": false,
"canvasKeys": [
"width",
"height",
"style",
"getContext",
"addEventListener",
"removeEventListener",
"getBoundingClientRect",
"setAttribute",
"art",
"canvas",
"option",
"events",
"engine",
"_src",
"_volume",
"_muted",
"_playbackRate",
"setupEventForwarding",
"src",
"currentSrc",
"currentTime",
"duration",
"buffered",
"played",
"seekable",
"createTimeRanges",
"paused",
"playing",
"ended",
"seeking",
"readyState",
"networkState",
"error",
"playbackRate",
"volume",
"muted",
"play",
"pause",
"load",
"videoWidth",
"videoHeight",
"poster",
"autoplay",
"loop",
"controls",
"playsInline",
"crossOrigin",
"preload",
"defaultMuted",
"defaultPlaybackRate",
"canPlayType",
"requestVideoFrameCallback",
"cancelVideoFrameCallback",
"destroy"
],
"shimOwn": null,
"shimPrototype": null,
"defaults": {
"volume": 0.7,
"muted": false,
"playbackRate": 1,
"autoplay": false,
"loop": false,
"poster": "",
"crossOrigin": "",
"src": null,
"paused": true,
"readyState": 0,
"networkState": 0,
"preload": "auto",
"playsInline": true,
"controls": false,
"defaultMuted": false,
"defaultPlaybackRate": 1
}
},
{
"name": "frozen-workspace",
"exported": "function",
"artMediabunny": true,
"canvasKeys": [
"width",
"height",
"style",
"getContext",
"addEventListener",
"removeEventListener",
"getBoundingClientRect",
"setAttribute",
"art",
"canvas",
"option",
"events",
"engine",
"_src",
"_volume",
"_muted",
"_playbackRate",
"setupEventForwarding",
"src",
"currentSrc",
"currentTime",
"duration",
"buffered",
"played",
"seekable",
"createTimeRanges",
"paused",
"playing",
"ended",
"seeking",
"readyState",
"networkState",
"error",
"playbackRate",
"volume",
"muted",
"play",
"pause",
"load",
"getM3u8State",
"switchM3u8Quality",
"switchM3u8Audio",
"videoWidth",
"videoHeight",
"poster",
"autoplay",
"loop",
"controls",
"playsInline",
"crossOrigin",
"preload",
"defaultMuted",
"defaultPlaybackRate",
"canPlayType",
"requestVideoFrameCallback",
"cancelVideoFrameCallback",
"destroy"
],
"shimOwn": [
"art",
"canvas",
"option",
"events",
"engine",
"_src",
"_volume",
"_muted",
"_playbackRate"
],
"shimPrototype": [
"constructor",
"setupEventForwarding",
"addEventListener",
"removeEventListener",
"src",
"currentSrc",
"currentTime",
"duration",
"buffered",
"played",
"seekable",
"createTimeRanges",
"paused",
"playing",
"ended",
"seeking",
"readyState",
"networkState",
"error",
"playbackRate",
"volume",
"muted",
"play",
"pause",
"load",
"getM3u8State",
"switchM3u8Quality",
"switchM3u8Audio",
"videoWidth",
"videoHeight",
"poster",
"autoplay",
"loop",
"controls",
"playsInline",
"crossOrigin",
"preload",
"defaultMuted",
"defaultPlaybackRate",
"canPlayType",
"getBoundingClientRect",
"requestVideoFrameCallback",
"cancelVideoFrameCallback",
"setAttribute",
"destroy"
],
"defaults": {
"volume": 0.7,
"muted": false,
"playbackRate": 1,
"autoplay": false,
"loop": false,
"poster": "",
"crossOrigin": "",
"src": null,
"paused": true,
"readyState": 0,
"networkState": 0,
"preload": "auto",
"playsInline": true,
"controls": false,
"defaultMuted": false,
"defaultPlaybackRate": 1
}
}
],
"options": [
{
"name": "m3u8",
"optional": true,
"type": "{\n quality?: {\n control?: boolean\n setting?: boolean\n title?: string\n auto?: string\n getName?: (level: {\n id: number\n index: number\n name: null | string\n height: number\n bitrate: number\n }) => string\n }\n audio?: {\n control?: boolean\n setting?: boolean\n title?: string\n auto?: string\n getName?: (track: {\n id: number\n index: number\n name: null | string\n lang: string\n language: string\n bitrate: number\n }) => string\n }\n }"
},
{
"name": "m3u8.quality",
"optional": true,
"type": "{\n control?: boolean\n setting?: boolean\n title?: string\n auto?: string\n getName?: (level: {\n id: number\n index: number\n name: null | string\n height: number\n bitrate: number\n }) => string\n }"
},
{
"name": "m3u8.quality.control",
"optional": true,
"type": "boolean"
},
{
"name": "m3u8.quality.setting",
"optional": true,
"type": "boolean"
},
{
"name": "m3u8.quality.title",
"optional": true,
"type": "string"
},
{
"name": "m3u8.quality.auto",
"optional": true,
"type": "string"
},
{
"name": "m3u8.quality.getName",
"optional": true,
"type": "(level: {\n id: number\n index: number\n name: null | string\n height: number\n bitrate: number\n }) => string"
},
{
"name": "m3u8.audio",
"optional": true,
"type": "{\n control?: boolean\n setting?: boolean\n title?: string\n auto?: string\n getName?: (track: {\n id: number\n index: number\n name: null | string\n lang: string\n language: string\n bitrate: number\n }) => string\n }"
},
{
"name": "m3u8.audio.control",
"optional": true,
"type": "boolean"
},
{
"name": "m3u8.audio.setting",
"optional": true,
"type": "boolean"
},
{
"name": "m3u8.audio.title",
"optional": true,
"type": "string"
},
{
"name": "m3u8.audio.auto",
"optional": true,
"type": "string"
},
{
"name": "m3u8.audio.getName",
"optional": true,
"type": "(track: {\n id: number\n index: number\n name: null | string\n lang: string\n language: string\n bitrate: number\n }) => string"
},
{
"name": "loadTimeout",
"optional": true,
"type": "number"
},
{
"name": "timeupdateInterval",
"optional": true,
"type": "number"
},
{
"name": "avSyncTolerance",
"optional": true,
"type": "number"
},
{
"name": "dropLateFrames",
"optional": true,
"type": "boolean"
},
{
"name": "poster",
"optional": true,
"type": "string"
},
{
"name": "source",
"optional": true,
"type": "string | Blob | ReadableStream<Uint8Array>"
},
{
"name": "preflightRange",
"optional": true,
"type": "boolean"
},
{
"name": "volume",
"optional": true,
"type": "number"
},
{
"name": "muted",
"optional": true,
"type": "boolean"
},
{
"name": "autoplay",
"optional": true,
"type": "boolean"
},
{
"name": "loop",
"optional": true,
"type": "boolean"
},
{
"name": "crossOrigin",
"optional": true,
"type": "string"
}
]
}