From 8379ac7bbfa266d79362705b8604338d83c636a5 Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Tue, 15 Sep 2026 02:56:43 +0800 Subject: [PATCH] test(ci): [CI-01] centralize installed roster and cover ASR and Cast --- .github/workflows/nodejs.yml | 2 +- packages/artplayer-plugin-ads/ARCHITECTURE.md | 2 +- packages/artplayer-plugin-asr/ARCHITECTURE.md | 10 + .../ARCHITECTURE.md | 2 +- .../ARCHITECTURE.md | 2 +- .../ARCHITECTURE.md | 10 + .../ARCHITECTURE.md | 2 +- .../ARCHITECTURE.md | 2 +- .../ARCHITECTURE.md | 2 +- .../ARCHITECTURE.md | 2 +- .../ci-asr-cast-installed-validation.json | 2811 +++++++++++++++++ .../2026-09-15-CI-01-asr-cast-installed.md | 57 + refactor/ci-setup.md | 7 +- refactor/plan.md | 2 +- refactor/progress.md | 9 + refactor/scripts/ci-workflow.mjs | 4 +- refactor/scripts/ci-workflow.test.mjs | 15 +- refactor/tasks.json | 4 +- scripts/browser-validation/README.md | 18 +- scripts/browser-validation/scope.ts | 9 +- scripts/package-check.mjs | 18 +- test/browser/asr-audio-track.spec.js | 15 +- test/browser/asr-audio.spec.js | 9 +- test/browser/asr-capture-cors.spec.js | 10 +- test/browser/asr-cors.spec.js | 9 +- test/browser/asr-fallback.spec.js | 10 +- test/browser/asr-playback.spec.js | 9 +- test/browser/chromecast-lifecycle.spec.js | 12 +- test/package-check.test.js | 14 +- test/package/README.md | 8 +- 30 files changed, 3028 insertions(+), 58 deletions(-) create mode 100644 refactor/baselines/ci-asr-cast-installed-validation.json create mode 100644 refactor/changes/2026-09-15-CI-01-asr-cast-installed.md diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 80ca8ff05..a4b822ceb 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -140,7 +140,7 @@ jobs: # These extra installed packages are required by the browser helpers. # Other ecosystem installation/SDK gates remain tracked by CI-01. run: | - yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas,artplayer-plugin-document-pip,artplayer-plugin-ads,artplayer-plugin-audio-track,artplayer-plugin-vtt-thumbnail,artplayer-plugin-multiple-subtitles,artplayer-plugin-hls-control,artplayer-plugin-dash-control,artplayer-plugin-auto-thumbnail 2>&1 | tee refactor/.cache/ci/browser-packages.log + yarn test:package --browser 2>&1 | tee refactor/.cache/ci/browser-packages.log node --input-type=module -e 'import fs from "node:fs"; const { output } = JSON.parse(fs.readFileSync("refactor/.cache/packages/latest.json")); fs.appendFileSync(process.env.GITHUB_ENV, `ARTPLAYER_BROWSER_ARTIFACTS=${output}/browser-artifacts.json\n`);' - name: Run all source browser checks if: ${{ !cancelled() }} diff --git a/packages/artplayer-plugin-ads/ARCHITECTURE.md b/packages/artplayer-plugin-ads/ARCHITECTURE.md index 0d83b8ed3..ee23e97de 100644 --- a/packages/artplayer-plugin-ads/ARCHITECTURE.md +++ b/packages/artplayer-plugin-ads/ARCHITECTURE.md @@ -110,7 +110,7 @@ ARTPLAYER_BROWSER_ARTIFACTS is set; it rejects ARTPLAYER_ADS_ARTIFACT overrides and never falls back to source on an invalid installation. Each candidate case attaches its installed file/archive identity. Without a map, existing explicit artifact or source-build selection remains available. See the repository -scripts/browser-validation/README.md for the six-package preparation command. +scripts/browser-validation/README.md for the shared `yarn test:package --browser` command. This integration does not complete the separate Ads type, visibility or device gates. Tests distinguish actual media decoding from injected errors/controlled clocks. Baseline and diff --git a/packages/artplayer-plugin-asr/ARCHITECTURE.md b/packages/artplayer-plugin-asr/ARCHITECTURE.md index 91a055f39..3dfbb40e3 100644 --- a/packages/artplayer-plugin-asr/ARCHITECTURE.md +++ b/packages/artplayer-plugin-asr/ARCHITECTURE.md @@ -159,3 +159,13 @@ Safari and physical devices remain PKG-ASR-05 acceptance work. CORS restrictions and main-video-only capture are explicit integration boundaries, not a claim that every media source can be recognized. Do not use the demo's external recognizer service as a prerequisite for local audio verification. + +## Shared installed browser validation + +Six browser files select verified installed ASR bytes through browser-candidate.js. The Audio Track combination independently verifies both installed plugins. Published ASR controls retain their frozen archives; attachments distinguish selected published, installed and source inputs. Tests cover native local PCM, direct/capture routing, CORS, volume/mute and ownership. Deliberately forced Firefox binding rejection remains labeled; no recognition service or physical speaker output is claimed. + +Use `yarn test:package --browser`, then `yarn test:browser:installed`. The common +roster in scripts/browser-validation/scope.ts drives both preparation and required +inputs. Explicit artifact overrides are rejected when an installed map is present; +missing or stale inputs fail without source fallback. Source mode retains deliberate +artifact selection. See ../../refactor/changes/2026-09-15-CI-01-asr-cast-installed.md. diff --git a/packages/artplayer-plugin-audio-track/ARCHITECTURE.md b/packages/artplayer-plugin-audio-track/ARCHITECTURE.md index 9b2392af2..e83a83673 100644 --- a/packages/artplayer-plugin-audio-track/ARCHITECTURE.md +++ b/packages/artplayer-plugin-audio-track/ARCHITECTURE.md @@ -95,7 +95,7 @@ demo still belong to Audio-06. See refactor/baselines/audio-types-validation.jso audio-fixture.js records the selected published or candidate input. The older test label "source audio" means the candidate slot; consult audio-inputs.selected for its actual origin. Native WAV capability controls remain separate from decoded AAC acceptance. The shared `yarn test:browser:installed` roster includes this package after preparing -the nine-package tarballs with `yarn test:package --include=...`; use the exact command +the checked tarballs with `yarn test:package --browser`; see the scope rules in ../../scripts/browser-validation/README.md. Attachments identify candidate file, archive and source hashes. Missing or stale maps fail without source fallback. Without a map, source and deliberate artifact checks retain their existing behavior. diff --git a/packages/artplayer-plugin-auto-thumbnail/ARCHITECTURE.md b/packages/artplayer-plugin-auto-thumbnail/ARCHITECTURE.md index 20a65aab3..251acebd1 100644 --- a/packages/artplayer-plugin-auto-thumbnail/ARCHITECTURE.md +++ b/packages/artplayer-plugin-auto-thumbnail/ARCHITECTURE.md @@ -232,7 +232,7 @@ require the host's existing getter to have every generated-sheet field. autoThumbnailCandidate reads verified installed bytes through browser-candidate.js. Native video/JPEG lifecycle and pixel files retain their stub player host and exact presentation-callback/fallback limits. The historical file still loads its frozen old artifacts. Installed mode rejects frozen-workspace and explicit-artifact overrides. These are native extraction checks, not full core integration or first-frame acceptance on every engine. -Use the exact twelve-package preparation command and scope rules in +Use `yarn test:package --browser` and the shared scope rules in ../../scripts/browser-validation/README.md. Missing, stale or changed installation inputs fail without source fallback. Attachments distinguish selected installed, source and published inputs. Source mode retains existing explicit artifact use. diff --git a/packages/artplayer-plugin-chromecast/ARCHITECTURE.md b/packages/artplayer-plugin-chromecast/ARCHITECTURE.md index 49c50e050..857a844b5 100644 --- a/packages/artplayer-plugin-chromecast/ARCHITECTURE.md +++ b/packages/artplayer-plugin-chromecast/ARCHITECTURE.md @@ -156,3 +156,13 @@ The installed consumer verifier compares both actual historical tarballs and an isolated candidate package, validates individual negative statement diagnostics, and checks runtime entry identity. The editor declaration is generated semantically from the root declaration. Keep internal `tsconfig.json` and source out of npm packs. + +## Shared installed browser validation + +chromecast-lifecycle.spec.js selects the verified installed bundle. It uses a controlled Cast SDK with real core DOM, clicks and local video; receiver discovery, actual Cast SDK and remote playback remain PKG-CAST-05. The artifact map must not be interpreted as physical device acceptance. + +Use `yarn test:package --browser`, then `yarn test:browser:installed`. The common +roster in scripts/browser-validation/scope.ts drives both preparation and required +inputs. Explicit artifact overrides are rejected when an installed map is present; +missing or stale inputs fail without source fallback. Source mode retains deliberate +artifact selection. See ../../refactor/changes/2026-09-15-CI-01-asr-cast-installed.md. diff --git a/packages/artplayer-plugin-dash-control/ARCHITECTURE.md b/packages/artplayer-plugin-dash-control/ARCHITECTURE.md index b8fc406f4..44315348f 100644 --- a/packages/artplayer-plugin-dash-control/ARCHITECTURE.md +++ b/packages/artplayer-plugin-dash-control/ARCHITECTURE.md @@ -218,7 +218,7 @@ limitations, physical devices and full release acceptance remain separately trac dash-control.spec.js exercises native MP4 and real core DOM with controlled SDK methods. dash-sdk.spec.js loads the actual frozen dash.js 4.5.2/5.2.1 SDKs and MPD fixtures. Its SDK capability attachment does not claim a plugin was loaded; dash-plugin-inputs records the selected plugin only in integration cases. Installed mode rejects diagnostic SDK substitutions and synthetic recovery probes. -Use the exact twelve-package preparation command and scope rules in +Use `yarn test:package --browser` and the shared scope rules in ../../scripts/browser-validation/README.md. Missing, stale or changed installation inputs fail without source fallback. Attachments distinguish selected installed, source and published inputs. Source mode retains existing explicit artifact use. diff --git a/packages/artplayer-plugin-hls-control/ARCHITECTURE.md b/packages/artplayer-plugin-hls-control/ARCHITECTURE.md index 16d1a99a4..d4909506e 100644 --- a/packages/artplayer-plugin-hls-control/ARCHITECTURE.md +++ b/packages/artplayer-plugin-hls-control/ARCHITECTURE.md @@ -147,7 +147,7 @@ See ../../refactor/changes/2026-09-15-PKG-HLS-PACK-01-config.md. hls-control.spec.js uses a frozen SDK without workers; hls-sdk.spec.js uses the frozen SDK version matrix and real workers. Both select verified installed plugin bytes and retain published plugin controls. -Use the exact twelve-package preparation command and scope rules in +Use `yarn test:package --browser` and the shared scope rules in ../../scripts/browser-validation/README.md. Missing, stale or changed installation inputs fail without source fallback. Attachments distinguish selected installed, source and published inputs. Source mode retains existing explicit artifact use. diff --git a/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md b/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md index 730d1bd1e..3fc864a4e 100644 --- a/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md +++ b/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md @@ -189,7 +189,7 @@ See `../../refactor/baselines/multiple-subtitles-contract.md` for exact historic multipleSubtitlesCandidate uses browser-candidate.js for verified installed bytes. An installed map rejects ARTPLAYER_MULTIPLE_SUBTITLES_ARTIFACT overrides. Actual historical plugins and no-plugin controls retain their original inputs. The shared `yarn test:browser:installed` roster includes this package after preparing -the nine-package tarballs with `yarn test:package --include=...`; use the exact command +the checked tarballs with `yarn test:package --browser`; see the scope rules in ../../scripts/browser-validation/README.md. Attachments identify candidate file, archive and source hashes. Missing or stale maps fail without source fallback. Without a map, source and deliberate artifact checks retain their existing behavior. diff --git a/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md b/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md index d59a1f119..498a8e9d1 100644 --- a/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md +++ b/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md @@ -165,7 +165,7 @@ historical evidence and outstanding acceptance work. vttThumbnailCandidate uses browser-candidate.js for verified installed bytes. An installed map rejects ARTPLAYER_VTT_THUMBNAIL_BASELINE and ARTPLAYER_VTT_THUMBNAIL_ARTIFACT overrides. Frozen published control inputs and their cue-format differences remain explicit. The shared `yarn test:browser:installed` roster includes this package after preparing -the nine-package tarballs with `yarn test:package --include=...`; use the exact command +the checked tarballs with `yarn test:package --browser`; see the scope rules in ../../scripts/browser-validation/README.md. Attachments identify candidate file, archive and source hashes. Missing or stale maps fail without source fallback. Without a map, source and deliberate artifact checks retain their existing behavior. diff --git a/refactor/baselines/ci-asr-cast-installed-validation.json b/refactor/baselines/ci-asr-cast-installed-validation.json new file mode 100644 index 000000000..f9045c55b --- /dev/null +++ b/refactor/baselines/ci-asr-cast-installed-validation.json @@ -0,0 +1,2811 @@ +{ + "task": "CI-01", + "status": "doing", + "capturedAt": "2026-09-14T18:50:34.707Z", + "sourceHead": "b90de99bc2f957fa59df68ab7abc07d5bdf6f584", + "environment": { + "node": "24.21.0", + "yarn": "1.22.22", + "platform": "win32", + "engines": { + "chromium": "153.0.8010.12", + "firefox": "155.0", + "webkit": "26.6" + }, + "remoteCI": false, + "physicalDevices": false + }, + "collection": { + "tests": 1308, + "files": 39, + "executedAll": false + }, + "packageReport": { + "path": "refactor/.cache/packages/run-N2u2Kr/report.json", + "sha256": "936795de2a09636dae0f4ff0368a34711146e654fcb8e437ba32e630363bab08" + }, + "inputs": [ + { + "name": "artplayer", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer\\dist\\artplayer.js", + "member": "package/dist/artplayer.js", + "sha256": "9148a369636f814b03e6a1ed2a7db222a31b159f93e8a94d52c5a9dde2dfe6a6", + "archiveSha256": "ad4a2f9cac6131a88fb1a23f16e0ab3ac681d3ec7d75709aee27b6d57e72bedf", + "sourceHashes": { + "src/accessibility/button.ts": "e5afa7aade56116082f54678c44961157950fa550d66e21a4e1ff9bb5369a6f8", + "src/accessibility/focus.ts": "2fa16941ac3632cb1e4b466e9a7e29700ef97b7eb2facd4330c59ec0a9320594", + "src/accessibility/keyboard.ts": "2d82122732f84f39e59c6852ca081614caa6430a82b32c4749e297826c77eb12", + "src/accessibility/moved-focus.ts": "c3d2a7d496381b2a86819b82fbd26cc940a1204fdf19408ccc8db267741d96c9", + "src/accessibility/overlay-focus.ts": "93fa088daaa3afed88f645507828a10cb63292937c49b16f6c2a0ea895897878", + "src/accessibility/player-focus.ts": "e8fd5222cbfc38cd4938324c83d9f5cef3d01a439464e1570d63a5131c84f20a", + "src/accessibility/slider.ts": "cfc9237d8db8fe7db3c4a0201ae83f0c4027603e647636545ba7b7e891fef5dd", + "src/accessibility/suspend-focus.ts": "d95c6097236be66e252165287435cca01b50553d64259add6b011721e4bbc644", + "src/bootstrap/browser.ts": "8d401627e8ea1c87fb44204227b04177a70cc7a0f79f95fb5dc73fe828e46a8c", + "src/capture/frame.ts": "eb25d81ec2d40a239103c63cfd80333705251291f2c2da77c740b4d413ea9cd9", + "src/component/dom.ts": "740f63e6e5942c444b9f05605880f8d56a77b066dbe5c4791da74f78cb96c668", + "src/component/focus.ts": "f4aff802711f6146c80e8c6bd90bc2cb406ccbdb581aef41f436ff5c03871ad3", + "src/component/resources.ts": "ff158ef0db8ba13343ff6ba329713820cfe2f5c2c446a7873a6cfff782855edf", + "src/component/selection.ts": "1f0bd089415da28db862647ffd1a0b4af752576465fb616d4b97ae4f8dcae3a7", + "src/component/types.ts": "d7b0e7008b0f6c82e3e97ac43e0188598dca4f740a860e7a60b3b38a46f4565d", + "src/config/index.ts": "a56b4d3d6942cfa3e2b47f909fc5ad87e6e3202fd61b29c7afd7649049e31d05", + "src/contextmenu/aspectRatio.ts": "18ab60c9acee1e0cecd76c0b6cf750763eed7cfbede4220328b5200154c5c478", + "src/contextmenu/choices.ts": "6bb880b27afc9457442c3973992da6dc8da48fc61d6b66b3b5a3bb4fc4651dc8", + "src/contextmenu/close.ts": "84b7a96df910e6f38140df8b1e73519d209a7331e9be9f42d076ae791757024f", + "src/contextmenu/flip.ts": "a7a4ac375da45dc7b6c996d4534098838646a078abfc4438f688e91e14ef0b38", + "src/contextmenu/index.ts": "7532165d162fa463f1fe3c538d6bda0f579b5907b05137382efeb0018719b011", + "src/contextmenu/info.ts": "f37cf0104510c13a130d2f55114c8f7ff15cc1b51863f97e60825442bdb2bf01", + "src/contextmenu/keyboard.ts": "eaa1af6b1abf8947d957208a0535f1b34f6c88e95394efd56cae905ccdea564c", + "src/contextmenu/playbackRate.ts": "7e06bb6fab3acdd71fb3ed63f77083172af517b49c1ecaefa3ee6a9068bdfe54", + "src/contextmenu/position.ts": "851ed1a884a13fbe430be77e7f72ae46d8a719175647e058644834aabd27ac58", + "src/contextmenu/types.ts": "a93fc90f4e17b731e8f6b486a507117810b61c1f1b0d9e775eba27dabeaeee1d", + "src/contextmenu/version.ts": "0553a716be0ba49f614059c41eef6dc694a9641fca79e6448b1b30382c6b582b", + "src/control/airplay.ts": "539bcc3671c7fe428ab95f9fea8a4943444066bcb742c7cf71591ba347642547", + "src/control/builtins.ts": "2a0e12a9741713c92938e1d2009149bbbde498284aa85c63f270d02b27dc22b1", + "src/control/fullscreen.ts": "7f8a9e8915abf9cbb9dda05b5c68523a47cc0ccf9ef5e0d9b82bc5c362fe346d", + "src/control/fullscreenWeb.ts": "9cb30987a3d2cbb334a80d3f2c41f39fd339bf37a9524c7ed0145cf5c98f1859", + "src/control/index.ts": "0d8e5a281f2eeba06c4cc4ac5a042847df53db1a19fdf140efea17d6ab2c0b78", + "src/control/layout.ts": "72e0b95bc632561e97569d789b76d16f36edd94eac8c62ba9e1918c9a222d328", + "src/control/pip.ts": "b829a7c83c5efa6751c2e434345e077339c9f5bc5022af9973f181ca8ce7f7ce", + "src/control/playAndPause.ts": "20ed88bcc7ac7622e02a7c4e6be518582c05f0d7c571a97a54b851d79dcf13c5", + "src/control/progress/interactions.ts": "da03600375451ecf8c152be5afcc5f1a4f8b759e837bbd54b7faaf8f8b228497", + "src/control/progress/keyboard.ts": "03d1d47e6641ea08f765d731f10a6aad35f7c3edc16aa97df822c5f9a7f75eb0", + "src/control/progress/position.ts": "a3794ab5ac5dafa5fd61e56acb12c94998bd4b9065dbf0fa4739c6bba1094aa1", + "src/control/progress/view.ts": "60ee16d5170be81b8132bb56dd0bc0eaf23e50f5c268d0697c9187b38a14aba9", + "src/control/progress.ts": "629c622864619e2515b2eacb1bdfcf523ccce7ce680c8fdf51812e8e50a0cc7e", + "src/control/resources.ts": "16fd7c53ac8f47b333041c4f298313390dc102523d47767b8a16f39a2564ba74", + "src/control/screenshot.ts": "11a1e3da919e476e7882abc3f74aaa809c3e9fc1de4346ec808731f78b6f27e2", + "src/control/selector-keyboard.ts": "6a749f48b23cda62148298e648bb380a6067cc18c7be4258b9ec85c382a56165", + "src/control/selector.ts": "a6f0c564c674530da9a0e4ed8762c6dfb81fa89373d64313e1020550731441f6", + "src/control/setting.ts": "10ee1118858c41f2e97a6df70d6d5dc978757d0e5d79ec36c11e743e6df86726", + "src/control/time.ts": "fa572092e0848878689367fb536e9658d13888d0a0d476babc5acd165af0f8d3", + "src/control/types.ts": "454846310d4fc3a8576ba030c2e8428bb795cde7b89308d29943bb4d4bc2aaa4", + "src/control/volume.ts": "45474d8d7f43d59263aa42e774eaaafeb45530ec24b81a5f589f6c906954568b", + "src/display/fullscreen-abandoned.ts": "1715b30d336976921b4957b444418702b7d93dbf1debce47429269638d15810f", + "src/display/fullscreen-adapter.ts": "71da10ec21c7706a8264badedac9022c74b865887931e9e369168fe3233c3b2f", + "src/display/fullscreen-request.ts": "c6292ded96aab0f2dbc978af251f6cd9f5fd074819529ca498077db8d14e1bfe", + "src/display/mini-drag.ts": "73d2f48f868c0ba4d8d5e5df40cbbdb4698c26540f3973b178d9cd374008f1cb", + "src/display/mini-focus.ts": "1f717619e183b1cfab668bd2e41c8e9ba02210c94cdb58034ec97aa41e71aa34", + "src/display/mini-layout.ts": "3835fe3d314da2fc624cbeb0e79fcdfa5393f08d87dfde730d2eac4e827f405b", + "src/display/mini-view.ts": "bbe69e4419ffc0f6c744cb730a51778f23c311a0fac157223bcf8d8bf0f3edc7", + "src/display/mini.ts": "a6fed598428bbf8d52931f21bb68b7560a3643d2576f7e7bfbae98b2f7cdd1e5", + "src/display/native-fullscreen.ts": "323401f2b3ea5186da981a1215b1b9e7dcf4ef4261a8e885fe8ff0c090de6a7a", + "src/display/native-pip.ts": "647879ae027cc0ebe684daa31d75511dd882e123e4ca8da2942e659bae3719f2", + "src/display/orientation-native.ts": "909980ba837471d9b456545a18fb0ab19f0990e8788936f0580a4b332cd4baee", + "src/display/orientation-types.ts": "0d68d2bc99d04db1e2fdf16b74e406e31f8b7e03fd9b6ea271773ed263ffa890", + "src/display/orientation-web.ts": "aea55c3b9e8c708fe5559f07cf8f0afd7ad37ac5b1a43bf519245c3072ec4129", + "src/display/placement.ts": "dbe4491ebd0f46b4efe13ac567e476fcd9ca5b84da675f19025935b5e3f8d733", + "src/display/sizing-types.ts": "da9b3d957dafaca9331f7319257dd8156b3c3e7b6db11f33f11ded48512450ad", + "src/display/sizing.ts": "c19856976320f1f35ff5a1049d19a940768300e095270b336dd12861b200da2a", + "src/display/types.ts": "e88c868fd370fcc9dc612489992d446a8d0558bd87c26c5c05fdd73d8a3d1b02", + "src/display/video-fullscreen-state.ts": "5fcb5e6b80ac45577664ef67e0460e0ceefd4022cafacdd7434c376a86d619be", + "src/display/video-fullscreen.ts": "b425bf0df462524b5d3accc9e3df383c6635676c152bf4bef09c477a90662728", + "src/display/web-fullscreen.ts": "13f901d20a31a7b8e4ebfbcceac5d3e0737df6335b71f0dfed638785bc413a5a", + "src/display/webkit-pip.ts": "3617927b4bb8fa46f651d0e584141f804ae438e2b4531cc2e9cf9f7eeb027550", + "src/dom/event-path.ts": "e952ea847a2e844a79c5c1b83035e03917e0294b80b1eb8af3b3bec0d2f7d333", + "src/dom/measure.ts": "84a599351d26a790c5a8f6e7d271486a0a68d5b58457d8ce754d540b54902b96", + "src/dom/presentation.ts": "500bded394579dd8194778f73cc44d0724f0a59cb5400957491928534ed091c6", + "src/dom/styles.ts": "734e0a4e04d666417a18ac09ed6271ee7630c399d52d7f510a1c19fd6e7b3493", + "src/dom/tree.ts": "3bc517ab9fa5317a1445156d53afb27182685eb3b4c0ac2ff41bbde55c9eecb6", + "src/events/clickInit.ts": "bd1ba29fe0af4332ceb19297797c4c942a3a74bfd901998d6b93293f1b309300", + "src/events/core-types.ts": "a607a3b2eea1b031f23ec0f620f1f4cd68799c4a77138a1443ecb196b00d1662", + "src/events/gestureInit.ts": "9e9d1ac0da7f87e89dd0d86fa2820b980e9cb810782d6ab30017de8686fc910b", + "src/events/global-types.ts": "3f4672d7af959cfa34ba39aa84ce614f422901437686bba98b14f578df40021c", + "src/events/globalInit.ts": "6f6ea497a20a8fd0746b1f020caff76ad6817cd70a1a90fbaea12f992b6d03a7", + "src/events/hoverInit.ts": "d1250e0dd35a8ba8067275986acbe6320c22adf1a977ec1009c0c012ed1563fe", + "src/events/index.ts": "30d2286316dbd351e93f5a2234dcca84bf68ca28c05921169cca70c2e0b1ecf9", + "src/events/listener-registry.ts": "fb062df5151c4e8e970de469f1c7d9af948f72214d32c293c81a5feeb8406124", + "src/events/moveInit.ts": "da97591723f8b94a34702559b7ee67a35f172aa696d37dfbecd472581ad3de35", + "src/events/resizeInit.ts": "719e27d11d2f93fcbe8368393c9190e251fc86dd0c3c2919f60e9b3b1edd0192", + "src/events/scheduling-types.ts": "0fd98e94397064f32cae4c004d9932c006d2db69a7d6d9374ff174d74ff93cd4", + "src/events/subscriptions.ts": "98573ed6cce73a73467c0e7fdb8ddc45e66b6bdf684c38886749453b2002a1d8", + "src/events/types.ts": "df03625039605314a96ef15b5e3777cbb9d444fd317e1a2fbeaaa0f1e83f6b0f", + "src/events/updateInit.ts": "6f174db14d20319f03a76e6ea267a3d71973faac44a92483badfa4420791817a", + "src/events/viewInit.ts": "d77b83eab802ff0046a4966e28b810a25592bcada49f526adae37556c1e4c3e9", + "src/events/viewport.ts": "6196fccb8b08ae22bde732c4389d9aceb5d727a63efd87b6d3914e338aadc46f", + "src/hotkey.ts": "d8e477bf451143e566e1f743a5f253dcf00beb23544709794779f275e11498e8", + "src/i18n/ar.ts": "897d8935384da16c3c4e96480777fe7fc022f6e3c0d87f62f79ae5f3c98e228c", + "src/i18n/cs.ts": "cc154ee50d258495d04dd2d49e89e9c0166e8b368969c443ec80cb5e48cf357c", + "src/i18n/es.ts": "0ed0283cb78847d6d1674be8c8ffa45feab88beaa8dbd11954b793c7b1657c75", + "src/i18n/fa.ts": "a72e83717f2e3e8f19f1de82516aef4a54ea70563223637bcbb25d21e9eac084", + "src/i18n/fr.ts": "a7366c75530e87f069216e20a6f09da42f7e77fdce862c02b32acf311068124b", + "src/i18n/id.ts": "146bf4c4e5bb39d8e1eb1a6fe3c639eb3128c55789de20511201f8ec02c56c0e", + "src/i18n/index.ts": "09c6f5bce58e4118dde10e8b2a2d3808785b7fde913a54dd189e0b473e21266a", + "src/i18n/pl.ts": "420f3b620d5c7ccdeba7857872be6176239fdf5da30b9cc72341e85dc95c2c8d", + "src/i18n/publish.ts": "5b216bbe313b3cda56a5da41fba4fb9d095eeec0dc903fcf284ddd8f94926e99", + "src/i18n/ru.ts": "9a9f61e6a66b3cd884c609250bf765dcdbc850dae3270d8a1600a5c2542436d3", + "src/i18n/tr.ts": "631c262a5e6cd00fada5bf2e146007d845816e47edb7643ec792250a403e4ec6", + "src/i18n/vi.ts": "e6f3f8e53599e27755e162c76c3b049457aae7089eca73ee531986e67f517f6f", + "src/i18n/zh-cn.ts": "51eb75562ae1ae4e248e1db85c90bcbc69b388a177ada6cbf8c3196a2c343ac6", + "src/i18n/zh-tw.ts": "6b098739e27ad531172d0f13e53849be30e9936365ce9613a7d938d9f01cce53", + "src/icons/airplay.svg": "20802c6735f2489bb6ce4221b519437095c54a3d2c4adbbab3319bb30536f285", + "src/icons/arrow-left.svg": "f1570036b739b0a67fab9261284aa3a13afe277e4c11aba7ab142503e7cce9ba", + "src/icons/arrow-right.svg": "6ffd8eb809152fe54b863bb890b9384d6f8788d129d604d70897fc9bb4398280", + "src/icons/aspect-ratio.svg": "987752a87701523057d8dfa7c45a6a139c4542b96fdcfaf8665722bbeb41f3b2", + "src/icons/check.svg": "7d06c8797e3a71fa7439eda4ea5ae62378e1a974907733e1cdf413db4af99b0c", + "src/icons/close.svg": "bb9e23e5305d11ec3d8f75a50ecdf3150deab8614c7df2af588873f2d78f06c2", + "src/icons/config.svg": "e1884d5411296b5cd1bfec7803b558b0afa5ab64478393977b07a662e2e0f15c", + "src/icons/defaults.ts": "31df862d754922fe5d68b20911c477d7c22893a6a67b5dcb1a48d3b437a0b23a", + "src/icons/error.svg": "d85a72e27ceaa38221637405cb0a5be270a297da58f1b0428498f568fab7570a", + "src/icons/fast-forward.svg": "629cb09ab7e2966c1fc2c04d9b0ee427b71b71abbc437b1db6635992cbe36d83", + "src/icons/flip.svg": "78044b69504710080044315a017f4836d56edce517c210ced3969756818f5b6a", + "src/icons/fullscreen-off.svg": "185b49ff4b0383974cb15a8fda1ba413dc99a133d4a02a4b72c75381d52515f4", + "src/icons/fullscreen-on.svg": "2d71a366b612e29cb2d9cb23c05a75389f794d90646d28bb8a2ac740861a5daa", + "src/icons/fullscreen-web-off.svg": "b4c81bbaa2ea91858b138083df0515c87f4ab8aa70df95ab9eb79e627ab47c7c", + "src/icons/fullscreen-web-on.svg": "4f0a8f688c44aab286bd2d12ab240ab33207664498d3f9fd0a752b53a3c1651f", + "src/icons/index.ts": "7152126328f6e485ee92b6d924c34776518b4a3925b2887867b516f7523b15cc", + "src/icons/loading.svg": "c0f4fd4e243012f1ab67429c99b41e7f8828c66b4ca228e3c6b2d1b6ca629e90", + "src/icons/lock.svg": "571221f734ec224e03f5023d136bca2186f58d768a6ea262881a4c6b49dc283a", + "src/icons/pause.svg": "9efe05ebf5610befddebcac51b3c9a491001189ff86204cb47928eb1617f6c7a", + "src/icons/pip.svg": "36a01d01d140fea05bd7c4eced17c29bc59f73990ed70807d8184ff09f57f50b", + "src/icons/play.svg": "c35562d20028d52ce329f35f90496a06d4dc5b6dc39df7ebcfb027f6f2393958", + "src/icons/playback-rate.svg": "872deecac0365ab04aeb5ccb1cdd9a0c88589a1442709fdac7c0ed12a241ff2b", + "src/icons/screenshot.svg": "49f7d90198fb0bcbc29848f40b0a8c042b78c07ecef1cfc5184e2e84a61b4bd4", + "src/icons/setting.svg": "7f6454d1c7f037d5a7144a898abedc89ca339534166d620dfa45efcd4c74ee3c", + "src/icons/state.svg": "63b56ffbfbba6e9ffe8fd050b3894c033cf30b166bcce9e717b42a9dc42d6424", + "src/icons/switch-off.svg": "aa4b81a9684e02323c32eb58e9a3e409a8f5abac4b8928b176092bf55baec4c0", + "src/icons/switch-on.svg": "1d87b42af5e7141f9defdc790567534288d84858d5068dd15093d5ef12f37f9c", + "src/icons/unlock.svg": "6dc8d6062af2f38efe12ddf4772e97d3f3114a28b885ee90067a4527e1ad6007", + "src/icons/volume-close.svg": "b9dbeaf9043c8014cd29d0e4a21a82ce567bc6b85497c310cca5f68bceeb31b2", + "src/icons/volume.svg": "baebc4ede3013202a4b13202a8d961cb0e5e065ee03733816022b2541d13884f", + "src/image/load.ts": "b4f1517243249d5fb017b89f993660e8b148906bbf28d08fe5c9f6d3a41e1e88", + "src/index.ts": "20cfe3738b3ce7e11b69721a5f0bdad9db77807417d8e421397a40dfade4c047", + "src/info/keyboard.ts": "13a6f617514388b4d14e0bf752780937f2baf545edb216b8259f56a198112c83", + "src/info/poll.ts": "d26ff67d9eadf1e032445371dde6f15293a7fc0b2ae6b87c3815e4b4e1ed5dda", + "src/info.ts": "6594ff3ee5643d63fec874631865d0e35b4ebdcf8aeafdd9fd3d9c595cfa3713", + "src/input/gesture-controller.ts": "1ebbd18184771a623b02ec19c363f84dcc72fdb7cd82bcf2adc97f4a138cb2b4", + "src/input/gesture-direction.ts": "65737f60e177338ebb3337a13ca75aeae77d77e94bc21495ddb829cc30de33a7", + "src/input/gesture-types.ts": "5ed25db69e0d9579a2fc0ab6faadf00fa073ad73a1ea5aa48096b4430c71141a", + "src/input/hotkey-defaults.ts": "c28e14821e5c7f7ac92a302e92439ab68fe77d5ef7d90a36b147b7c979ab96c6", + "src/input/hotkey-types.ts": "c7232470d725f3700481ab98bf9203403a67f1ab82e72394baa9c3ad6f3c9a4b", + "src/input/keyboard-focus.ts": "270c9dba40c0eb6d9fb36118b53e7f1d42a301ba4514917849523b6a05ed9e11", + "src/input/long-press.ts": "110cf16cf9dae845597377ebbc43249e103cbc0ece56f89e44ec6ecc7f3819b0", + "src/input/pointer-focus.ts": "802087098c786135eefa6727f13177ffe4a98e2abf48fad0e356b91e26960077", + "src/input/pointer-types.ts": "63e679498f8f42f6842f63e910c38717ac3438d58df3a75ef5b77c009b7931d4", + "src/layer.ts": "4014268eed043d5dd7b925cdeef6245e357cda67192a1301c5612ef98cdbec12", + "src/libs/screenfull.js": "2332b50c0c6364d5c99080be0f5739255e4b9e465d2cca40f761adce9a1908f8", + "src/lifecycle/instance.ts": "3168f7db4271bae7a242e80798546b755ac15443e15dd9ebb7675f5a259299d8", + "src/lifecycle/resources.ts": "b743daeffb676bb0b31932c3198fa9cf842f5e9015344659594ffffe1a56ba23", + "src/lifecycle/scope.ts": "e2188e8544b27cf8c7ac149e7146af628a2d6166c82b719a247adef5d85be5db", + "src/lifecycle/template-rollback.ts": "7a83da6739bcec1587b02f8157934988910d7f9103fe489a0d6f4f65290c3d77", + "src/loading.ts": "216fa5e2af5be5fcbf95a1578c869553a02f625683a98333d4a404f9a70df9f5", + "src/mask.ts": "500b8c2fb5ded63d5acab3c984fc9757f28a8b6cbd4d5beeac8c5a6d73ca63e4", + "src/media/events/forward.ts": "6b1b7e80036bfb523b51843dc6ec6d83c2b949cefb9cef085b2d679a444e46d8", + "src/media/events/listen.ts": "4eb7e943c1ebca77da8025d83b7d408276187cd02860b7793284344378bd0fe0", + "src/media/events/playback.ts": "2c68e4f6274a0dc65e56d42c928e500fc1d63bf3e03bbdd8a83c3f3ed7ae8ee4", + "src/media/events/readiness.ts": "3ba74f26dd9ff0729967097c2cb6f329a9cea57745bfe8173f9173e0d134476a", + "src/media/events/reconnect.ts": "876027b5116d0d3628755705682b30630f4b713199ed8015541932d81d2944be", + "src/media/events/types.ts": "02bd29ad8b158fa04ce5c1524e397260ef24b94c2cf1f053e7bd02b23e5d29dd", + "src/media/hosts.ts": "498d1cde31bf9ee12af1f13523eb0a4553adb285264529378abba5b629829e9a", + "src/media/playback.ts": "b0364027e1ea26e44e435a938e93c022836885c2622cda6bc3a7ca791d3c2964", + "src/media/position-revision.ts": "ba074cce7e7c6bda84aa234de8eb315e5ca482aa9b06250896f9ac6251192851", + "src/media/types.ts": "96d4a7f066cbb6fb9138165dd736b4ca500cb19c827bd7702134d61c44cc0e87", + "src/notice.ts": "4faa700323a8fdfd91a59491a5f57da2dee9bd1f2de0d900ed16e9809a208c94", + "src/option/defaults.ts": "0bfdc329c48716ac5987c8979fee7e116f6894a70fefc908c99876dfbb4d9dc0", + "src/option/resolve.ts": "27bb1b81a9288062969abb561cec9c88c4b9acb715023e4f22f299f3d5f4bf65", + "src/option/runtime.ts": "4caa060f67c6a57db4a7cc93598e8768794f727b303a5cfa4aeb2ebc247e52d9", + "src/option/types.ts": "224e32ce13cfc9d41ad9f2f3427f97d10bcaaec7e88e30503d618a3d06ae381e", + "src/player/airplayMix.ts": "bfa30e1dcd7cbaef97e977344e8a35524fad6bd23089cd8e45945e3b32b4bf04", + "src/player/aspectRatioMix.ts": "9e5e7365d469aeaef65a6010cb92734702191f9086b2f21d98c9f0ad7f356898", + "src/player/attrMix.ts": "d82150611a69423ed46bf673f44c3e0f61e80425026effd486a6951b6c0dd90c", + "src/player/autoHeightMix.ts": "5848e34cd826f5d4cc81d076c83fb3bcea0aed1228cd93a1edb6b8ca402ad175", + "src/player/autoSizeMix.ts": "6373a8ea7fff4cd875d17c5d3df6dc37764055ab77850a6c6348526969071cbb", + "src/player/cssVarMix.ts": "0d023f28b7a8b4c1a5e2c4dd5672ef4294c86bce0013babd9d52efa32a443b2a", + "src/player/currentTimeMix.ts": "cc374abeb85b203b9f31c566a6b9e53a4a1723d609fccc7b0c9c210993b79e75", + "src/player/durationMix.ts": "60a9d665cf302dcb6b3e37e2f057e31720935e5e588fd7709231f691f6014191", + "src/player/eventInit.ts": "a915c5a618e70b1ab10536b1273ba0fea4ec11d3a2ca629b538e90b5ad2b55f9", + "src/player/flipMix.ts": "a1519c83f8c9437a9b7e99a59e38a3d931032c579f4085226fc0955c7c9eab67", + "src/player/fullscreenMix.ts": "b339bebb4c87f7b75232d7e0d637ebe25bd09a0a0428ba87339a16af5daa71aa", + "src/player/fullscreenWebMix.ts": "75b83a6093c7887ca8725f63c55503d0bf3aafdbbf2347b579120cb257503555", + "src/player/index.ts": "359943c88dc99863e510fc0d51f8e8ee2397217e68045f755d4e9538579bdaec", + "src/player/loadedMix.ts": "6a4c4a08ed74346dad3e138b1dda22c8c9c12f175fe6d00da41b89c78cbe2c18", + "src/player/miniMix.ts": "d68a0c4f6c6059d5831d2d1fd4823b8d3cbce95eefd6d36d38670d6d8720f44e", + "src/player/optionInit.ts": "7c1c47679ee6201d0e0d203fc7b449a09309e7b24a0a1099ad259a70fc1b1a35", + "src/player/pauseMix.ts": "f4fa2b1f05b84ebd27bec9cff5a151addf096dd9b32a38122fb2f1829def0043", + "src/player/pipMix.ts": "63dfb29ffd66ce7d081b24f8e8bf697c041675b49ab8919e206d2df5132de236", + "src/player/playbackRateMix.ts": "e185c6ff52cd567f7fd7c30553bbd6c65517324d1d16c4948c3623ef457ef536", + "src/player/playedMix.ts": "5b6b89bf8dec1efb19cd51e46af1505bae006bdb3fb798e9dec7e3fb5cf0acaa", + "src/player/playingMix.ts": "968c9f6e6d23c233c77d62a593db64adcc6d1a2411f5f1c61a35c6996d6a54d9", + "src/player/playMix.ts": "2d46a3f84da0b1dd18139b76e5e2e163f1d9d9c8f54e67807eeec672acd49917", + "src/player/posterMix.ts": "d569dc24e8e64efe398bd76942bfaf563ffbf64d2a7387ea2e1cb1cf511183d4", + "src/player/properties.ts": "76806d6273545ff556cf9c6d341b59b9041455a8ecbe1fd40510e841c0d5710b", + "src/player/qualityMix.ts": "980ff584c8a5793f5ec9f049f144df31d184d7c9acef49fbe9d504b7657a96bb", + "src/player/rectMix.ts": "a741ee09fa3271df84363c5d73eac1b2e5adb39491f95f8112af81f1219ffed4", + "src/player/screenshotMix.ts": "1754bbce09f713204c120cd4657b52c06eb09eb1fe3244f84474e5967cd68e50", + "src/player/seekMix.ts": "e6e1bf00e8441f1ce58d2a67a66f7e5e98c86d78620ff10a5e6268d54f13fadb", + "src/player/stateMix.ts": "e45b3209a93ab14665d19c5740d5c632187e9fe234b019a2a0263e26884ab3b2", + "src/player/subtitleOffsetMix.ts": "cf9834711842c8a31c3143ab3028f0cf9ba541fafe6f0a3076067daa9d4c750a", + "src/player/switchMix.ts": "b47e174ef0edb2b96ff29f2ddd3c9f2dd2a38713db2a81002b18c89ce71994e9", + "src/player/themeMix.ts": "5bf11bcf8b77cd5d5f2970bc3edcee315c693c1be3d567770d5107a5951cb48f", + "src/player/thumbnailsMix.ts": "6c097d7d00779a6d0d3d65cf9ffd126624a48c9bdb98396c84c39f4de4bdf712", + "src/player/toggleMix.ts": "a3050136248e7d0b942387484c61286ac2b33a90724b1dc3460f5061be76f247", + "src/player/typeMix.ts": "c2a234a9c09f0269a4bd0659087635995945075ac70a5cf2478c8a135fc1b2fe", + "src/player/urlMix.ts": "726a42899261879e03c8b1d4f716458bf3e6e614cecc3bb8d7a581afc2b7866d", + "src/player/volumeMix.ts": "d830bb27b984e0ab2f687943fb49abcbd0331d71fe96049fd81edbddaa64f07f", + "src/plugins/auto-playback/prompt.ts": "58c6dcaf540296ee6f6bdeeda38ee7302aca2b06ddb152b716c0c2bf9c6c96b4", + "src/plugins/auto-playback/records.ts": "133a4ba2fd2d3df724d96eb203d05cffb0b82ecb8de72403974f7979bd37ce01", + "src/plugins/autoOrientation.ts": "4a13b0c010ea7a5002e66c422260ed24bb0d18b3ed41ce10974ac7ca2804cc09", + "src/plugins/autoPlayback.ts": "e349010813bbcd53503383b707c5f6e6e60d8ade6442d020fe6ba07a128c3122", + "src/plugins/builtins.ts": "4631c9775732982dfdc87e16b1bd6b41a350be36fb27e0a9132c11a85b0c016d", + "src/plugins/fastForward.ts": "74c03e3fcfe2f87dcb0ef1a5da5410cb96322509fd07e32930128584c54f62b5", + "src/plugins/index.ts": "4c97f354769bbcb338263f321876a90745a87a9af2d267e216bd3d9d007f268a", + "src/plugins/lock-keyboard.ts": "d59ac2fc9d0daf48c7946e0b49698a74e01f5f55e903c1b090fbda5516cbd16f", + "src/plugins/lock.ts": "8f5fe4469787b7b2a0a302d0fbd925f8eb6d1b261cae6e17367e4d97666a096c", + "src/plugins/miniProgressBar.ts": "21b4850fcaf6b0e82d5e62ca7aca60c179c578f7ff6d5606e6025628ff4b1cc7", + "src/plugins/registration.ts": "9891686c32aeaa33c48ca500cf30ab24ffbb0835c6248769b4c645a5ff20129b", + "src/plugins/types.ts": "6823098d5ec1bf053f60ddfdd36bfcd3f06f3b528cc5dd30fd676a1318dac590", + "src/scheme/index.ts": "dc4a3b5e08478cf72b46b0b59c023359ad5f79b891ea8a6a119ce24a5251821a", + "src/setting/activity.ts": "699ceed4bdeddb6d48eacf79c8dbf737f5d2d8c4983be70205322b14807a91b7", + "src/setting/aspectRatio.ts": "a16eb58fadf77f0a9009cf162d957ffd59d9b8fde83cc193d510fd642e3456cb", + "src/setting/checkpoint.ts": "9d3bff311f9b15c067ca49661af4f48de939f266b8077e7c2f0d66edef22dde6", + "src/setting/events.ts": "f7a3347ca146232caf2a8c9a5a18731cf7bc91dca4cd36370e0265c6eb70df53", + "src/setting/flip.ts": "e72a4ae33300d9e48880897a4f85a04fa6d9a5fff7b06ecaf9081cfb1bb14404", + "src/setting/index.ts": "f6319af15ebe3600a466123dd9d343b86a8d6ed201693ac7ac86dc1d674d477f", + "src/setting/keyboard-focus.ts": "b9af20f66342e10564ef606d75550e9eb9c65274af615ff5719598a0620464a3", + "src/setting/keyboard-item.ts": "d94bfc0266486615ddb79b9eee3886f48891ebb2e5f465652ef98f142ada89d2", + "src/setting/keyboard.ts": "5a2c717d9ecd368efb1bab2562e8d8a06af7607e9fe6d96c1be4d8d58212d395", + "src/setting/layout.ts": "584604e8fffaeaf1d633d1ed45e64d94595c2a56976e3a3f7ede01839b83a37d", + "src/setting/model.ts": "c47348f0f9494c4ce8ea5561bcde6eb698fb11e9197ccdc1ca1359a6d5e370dd", + "src/setting/panels.ts": "64d48720971763985a2a652a18c2ed2f32300c3553d56b52049ae40c4dfceae1", + "src/setting/playbackRate.ts": "2e70e0d2a33cb0ec9fcdd6d22424979fed7b2e01f87015d6be4e520d5cf4e88a", + "src/setting/registration.ts": "c29db62b5d90e0efa4a926c753015e65e96a47add3f5b8840ee51017052edf7c", + "src/setting/render.ts": "ed73745f2c7e2d76bbe8ce7202336e5f4de217dc8f0806b769127cb25316faba", + "src/setting/resources.ts": "64c28cc2cb08cb87b0864ab957d7999bc94931be4788f282d6f190b8806a81fd", + "src/setting/selection.ts": "a642e630924eaf4ad91705fad1fa6e6dc946b32970d809a23da274399fce20ef", + "src/setting/subtitleOffset.ts": "86513835d4e542ac39e9d551507473e3e14c71fd0d5ea725267008ecbff6ab83", + "src/setting/types.ts": "21a07d75a28bbbe20b3e107b6f1a09cb6f8ef2773ea10a4bd7caa88956e9b99c", + "src/setting/update.ts": "79326cb55c52243a7aa8df347a3b081dcd84eb7932fc6162061cc0d9f7078add", + "src/source/listen.ts": "c0596b98258c1544c8e4b762509646428450e56588da36908cb8583b8b716c37", + "src/source/operation.ts": "a8d0b89fc706c4ef0ccdd6d94b220207e92b3d3bd3b42b55c90f9bd191f15cf6", + "src/source/restore-position.ts": "da98a47e8419b33069191e51fc94cc9652302ee4f3eff8ccc7a6dbd4c4c0e2bc", + "src/source/switch.ts": "c66a3db4ba52dcdb46e1f6ab1f350588a07f64d893423d3f135d9768bed74ab6", + "src/source/types.ts": "e5fa3a9cd6b84dffbbb02f61aad966d6046204d857de3e4564c795f02a0259ff", + "src/storage.ts": "9c0a0f3d8ac18261db6e49b2ea14322d1d53bfec3531c7337b85005e708fef30", + "src/style/accessibility.less": "eb9cfe282c64a059d2e102280750bcd33ac33726fa09042eb9875f534335efef", + "src/style/artplayer.less": "a0da37fc5beadee7181d20b0c4769caabce0416fe87b501cbf916d33d073a82b", + "src/style/aspectRatio.less": "2218f0db06da5287a8b7d99c3e72360d1c9af02d805d1b380f93d95df7542cd8", + "src/style/backdrop.less": "45d2518d29c294801dff1ab85e3a4bb2cec66496adccdf893854fb08d444869b", + "src/style/bottom.less": "324de61ac2a82748015168789fc48c861ba6d490a87f9a98dac931b53f0d5a95", + "src/style/contextmenu.less": "190d7e61fba903428847e4495f084306c9ddd1b45178abe04087f3ab883eda2d", + "src/style/controls.less": "eb6d4bf4e4ff903d724d45f3ff60f0cf10c02e622fba195555a8179100cdce87", + "src/style/danmuku.less": "e971e214fc4fcad36707d0a2739991e5345ed3b0d582fd9484e3e2065f4d4e45", + "src/style/flip.less": "f3169f63fbab0c8166b0f1fe58719bc980a295f160dd534855adb2670742b8b5", + "src/style/fullscreen.less": "ae20b0142cb4dab46f1062270608d47c6947a6e35d9c0915ae237f6d593287c2", + "src/style/fullscreenWeb.less": "d92057496349d44b903a4e62b4b4a6ebc2c7b93320fce81f26a5666abdf77330", + "src/style/hideCursor.less": "28c6c2150589607c2002fa7b6e7a09b525742630d0b247c3c36b414c2c693cb8", + "src/style/hint.less": "e2dc4940e6b212d8da75a404fd5ff1ad894008457677bc37554c6b64b735bc31", + "src/style/icon.less": "2751208954958b8437d10746111d192ca944f97d8cbfcbae6a2a2f5f0ceaf234", + "src/style/index.less": "ea6f4cd4ac769bbedf870e01a753c0cdc24493e9ac367c895ff3687d02f6a84c", + "src/style/index.ts": "856afc037ffcd4d18c4b54901ddbb30e310014553fe9d19560e34fb54b8378c1", + "src/style/info.less": "8cdb91746d0ad17dfd9c493f317bdbe0bac250c11ce6d907596a7f34c6f0d5d4", + "src/style/inject.ts": "9cddbe51b5de0da74f27c045ab982b509c3854cc6b81eeb02a6b974914760a4d", + "src/style/layers.less": "623d06fb1c5520e99401f6e5e3f2a6e60aec540e4d3226845582677e69fe220f", + "src/style/loading.less": "3defb61105e6229494501dfa3315cc82366eaffc9569a25dabdb54ba8ba57f9d", + "src/style/mask.less": "3bcd16bc8cb4fe573c3937ae7fa1a1435fc5479873841c21d99d83d1916cd1be", + "src/style/mini.less": "abf2b03a51d518867bdef5818ef5fd604f19c2f85dc8bc9784dbad480dd8b991", + "src/style/mixins.less": "4de7eb5642eb03388ff36b2fc37c5b2bbd9d8a68c74861aee2d9aba22cc0d171", + "src/style/mobile.less": "1c3f93a6eba38589a031478ba04d87007c02594613845c1325c22ba940629c32", + "src/style/notice.less": "4ef68e420702979d9bb6d9659fefdd52a22996edd9f528473ffc0e08bb9f70de", + "src/style/plugins.less": "7122d23a57a98f09b3d933ff15eddbadc909d3fd1cd096a8e8e25fef25cbc0b2", + "src/style/poster.less": "8bc21639753db5f5ee671b1155812ba4bb42365c218f9c53c95e42b68ec4498b", + "src/style/progress.less": "9578590a84cd446d9790ae97f89103cdd65cac0094846f0c36ea16e182275411", + "src/style/selector.less": "a33cba4ff9c8e9aad4af152547bf54fdc64fb74a1013ab99a9ac01eb55fe25c7", + "src/style/setting.less": "c7fec9fc8c3cc3e63085b405a0199e2148721050b41fca3ba33598dccb153958", + "src/style/subtitle.less": "9660cef4d9933f2e3b5f8299f1c820797df4942c18e8c9883930ad111a86b3b3", + "src/style/variables.less": "166418165eb862c669eaaf40bd068ae12beb9b784abf6ebdd83380b9aa72bedc", + "src/style/video.less": "1658e7941437268fc187c991d0fab1d2d74ec1fad5997df67b4b9cc6a1cb52d9", + "src/style/volume.less": "9c3a184f3921e026ba5e3164b6d0c52ea7d5f60214e2884959939b74360b21fd", + "src/subtitle/index.ts": "b4ead680dc82fa47c53d1ec7e5fb8bf94abbf55730d5d1130ad8d544cb42adc8", + "src/subtitle/parse.ts": "7db540c5edb1d2312eed82757fd15a7ce6a28996ba20d0087e56730f21dede74", + "src/subtitle/render.ts": "96493fc35680af635a8db225a8bf002208df79ed48b1d4ee6cc73587543add5c", + "src/subtitle/request.ts": "543c964571bd5ab984bc1adc9f64a8917dd134ed2892ad10b30ed9c859f34119", + "src/subtitle/state.ts": "9f79b982d66747170bc39bdaf99b65676310965f23da62a4dec15547c756a56b", + "src/subtitle/timing.ts": "f2c1dbb63697a51c200371127da4fb8ea6e90a5b4de888bb1c2d7eae4007a5f8", + "src/subtitle/track.ts": "707f4c43af4ebf4b87521f6f577168460e739274d0cec28b9efe5704d2540d18", + "src/subtitle/types.ts": "c7fd0568c71611fe44f0a7d2735a246250c8a63daefd15c63091e37d38bf1edb", + "src/template/html.ts": "351c472bfd01fa5ba1a4e347ed31bd5faaf823d9b4c5cab1ce8c651e3b175021", + "src/template/nodes.ts": "1572746a636647e4d313cc8752d3a110ff81fddb390ad7b0feb6a0db0d42b9d4", + "src/template/types.ts": "2bf906b4a209e17dae4d79225e758e2e53772e93f19f188d0131051ea2a0143a", + "src/template.ts": "0ea9155b9292d4c528a464d3c97996ee5a1c9c4aabc2959a744989085db2251b", + "src/thumbnails/layout.ts": "6630439242a880f53fcb374b7b15c7f486405aab8a0fad651b137f02971eeb59", + "src/utils/compatibility.ts": "1fd2a5b17ee3245712eda961d3c0a15caf3c428010112e48231890176ce1e5e2", + "src/utils/component.ts": "c3fa96467e8b315d974a42a19591aa4a4a7514853db796135b2acbcdcb160ea3", + "src/utils/dom.ts": "72f3539dabf296df37ab4cc7ade0c8ac9480f399987101589450c787e7d6719b", + "src/utils/emitter.ts": "26a93d3ff35b53e71a5f3bb22c252a854559d8151ede50a66a28d9eefae6c008", + "src/utils/error.ts": "ba303c7d4e4228919088f9d608fa364596f5853ee646eda2008deee354866f38", + "src/utils/file.ts": "ea71d7fc0e818d473bf5a596211ba9d571e4febdf1878014eadefa8d0a98d4cc", + "src/utils/format.ts": "891df5b7542b713aef46bf2b93924f42e68eee574afd802db3e6c62ff2655ede", + "src/utils/index.ts": "5211af833dddb2937d25dcc772740d62f9d5c5039ce5505bffff0796d4afd756", + "src/utils/property.ts": "c737d4582a4382f4038d12dafdf8b43418e508c9b8b859b2f0cc17c20f370343", + "src/utils/subtitle.ts": "f058851d11a418e321a8a498472b67fa535fec2c7b5d3df739b6b4f263d00337", + "src/utils/time.ts": "b8ce3d50865f6c343e8e3ce9f5c87de565a87b4e9fbcbccbe7030e30e80b93fe", + "public/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "public/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "public/artplayer.ts": "2c1f228e38eeda3aba0dceb9630c5db1380ef7033037b28a12423355c8a80983", + "public/component.ts": "ec0ba441e6f834118afcefd0621d9a76143ad4fcf50b699a374249ab14d2c314", + "public/config.ts": "97322dce493ac3d1160f426e4fd0ba89fa746f7d66bfbeabd9f45454198560ad", + "public/cssVar.ts": "2ff9827aa10bf326f60f6cda7556a94fdcabafba529185a1ceae46d865f33697", + "public/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "public/events.ts": "cb23eb57b07a0b4725a2cbea62add2fe691f818cc4bbcb862bc62caf5b297f3d", + "public/i18n.ts": "38094c46bed0ecd5bad02a3a5fbf0d61521df45aa2e1154256cec4ad5491958f", + "public/icons.ts": "61ce1b0cb9bc7488263b644419b5fd5a13e72de1493c8113eee81d5174f1234b", + "public/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "public/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "public/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "public/option.ts": "88dab402e6f55c51ef7b70c0ecde3e4437116f7dfced303047e410835088a3a5", + "public/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "public/player.ts": "fe75e08e8bc3912bd1f42bba92998418b9718a688b60068c2b9843e6218b0519", + "public/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "public/quality.ts": "dcca8c0f5b5c25373f85825a274fc3ee8beeffd7c8b2a978468e039ff4946a9e", + "public/runtime/component.ts": "840213299c942fe058eb5436977ceec066b9dccda24c55ae9f464b399c979e39", + "public/runtime/construction.ts": "24cc5cda1f614314db382271a9b0d5583b781894cfdf6c548700b1b5270467ee", + "public/runtime/events.ts": "52848f57d35eb1037cf74c8877521edf99a015bcd77f30ef6bbcba1807a99bfe", + "public/runtime/media.ts": "8828f80953aec3e95328cefe691661e8897cb27cb309483cf806ec45a8549ae3", + "public/runtime/option.ts": "bb672e49ffe74a6fc78543217f6de80d7d738890146df0857c709d4dc283e4ce", + "public/runtime/player.ts": "a4a24794e26cfb9e4310bf0f459a7a407e85bf81b4f3a4feb6294331af8036fb", + "public/runtime/plugin.ts": "9ad482f2a77914a91450419680b8af6b314b926f0831c2f7f6d7c466690f95c9", + "public/runtime/services.ts": "8e4648d8c61bff47343f9e1c2b995af69fc00947264b826109ceadcbaf553254", + "public/runtime/setting.ts": "c48d20957b57f79f985ef76a2950cc8a5cfa25dafa8ec5939e562661778e6218", + "public/runtime/subtitle.ts": "13241c4f9a87517aa2cf7b3e0bb8cedaa12fa0b4d3f8934285797583b752557e", + "public/runtime/template.ts": "da9975513a1938e7f386f4f65f718f0fc595164bfeac8f0cd99a3e97a54919a1", + "public/runtime/utils.ts": "cab9916f5224a3b047812b9f759cc9cc62105662599744067a6955020ab36916", + "public/runtime.cts": "52cfff1daeb6841a90212c8fa8d46ca46d6650bb7ed1b59b62115d854b8ad652", + "public/runtime.mts": "1b09bc0ee0f0ee2f788689eaff441bdeda1fab0ce783e71b61b9792d81072b03", + "public/runtime.ts": "ec4b1d56993eb482a77eb0f94b701047549d009e6ba6433f27e7d464fef30c2b", + "public/setting.ts": "a60ed81da780439a55ee22ebe2611d936bd45da0d98e6bf44c92e9a5d9047492", + "public/subtitle.ts": "92f711ad0f7924e609ad4425cd26d19c73eb027cccddc6d89fcf9b8e334db065", + "public/template.ts": "b5f9bff43b4816bd2e3531a3a1750b8014fcf63d421fbc786341cedb1429035c", + "public/utils.ts": "63757d81dd9cf5b95c67ff758da71c87bf535f15aeea7dfda322637d26fd33d0", + "package.json": "82e92699e7c29847f32ac6767ece0401290e7d7a12854722bdbcfd09b90b7954", + "THIRD_PARTY_NOTICES": "b77b5b46b79fa0cda850b0781f78c3b1112c4ed9672fa291956fe8eff53098e7", + "tsconfig.json": "c074f0621b18e6f209e217a702745e4118ee7724955e8104c7e3df3a223a9921" + } + }, + { + "name": "artplayer-plugin-chapter", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.js", + "member": "package/dist/artplayer-plugin-chapter.js", + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "archiveSha256": "ca512d45febd5212c4a6ef8ccb38c331db9823dd4a905cbacadd28a1becbf12d", + "sourceHashes": { + "src/chapters.ts": "92206f524624ac3a7304677b6a69fda88e62caeca52e1e530d746e51579d3a4d", + "src/index.ts": "83dc022253c0539587590f7a551e090684d1944dcb2010a76e8498a683e7ef36", + "src/progress.ts": "4a18d19ed703772d73622ea3fa9d433dbc2c6092ba244c9bb1ec727368996951", + "src/style.less": "6c0b688efd9606a55c1cf7bf902e3030717a65210506a33ab1b31156a72ee85f", + "src/stylesheet.ts": "6ccd88b6d17127acf6f6c1f02a7fbb3a55d59f427d2d92c007bf658122abd51c", + "src/types.ts": "07c528f9753cc54c12211276f28ff01a5f6e8f1ef1451b2b534f2d6cfaa17ee9", + "package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "tsconfig.json": "732a6076acef4c8437d305af19a9da8a0e04b8740a1df32921fd30011c162492" + } + }, + { + "name": "artplayer-plugin-ambilight", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-ambilight\\dist\\artplayer-plugin-ambilight.js", + "member": "package/dist/artplayer-plugin-ambilight.js", + "sha256": "21ee5227f26cfff6e82ee6932f6eafc9741fa3be0ec2f5252a47b53ceea14599", + "archiveSha256": "8add140bebd2cffaf4ccef1484b1b10efc11867cc80315ca6ee9976c1eb68a7f", + "sourceHashes": { + "src/index.ts": "9db25144798ee667bc420b3e1f0b00ef6855185d26cefca45e05271354bf8591", + "src/sampler.ts": "e6f4ea2795b500aa2ac8ffe4b65da4269e8b3457a9912808537bdacfbe9f5328", + "src/scheduler.ts": "2c87328cfa8d916c64e8eed26802116867f9d731991a6cddf871d53808261268", + "src/view.ts": "e30ec83e0a8f1b471c4f04cc436d550b3fed3f75d8042ddfd73be98705103e8b", + "package.json": "307e07ca6259f67cd8fab2e6f4a1bc6020da434b20efecba0c2b9013d8abf37b", + "tsconfig.json": "712a3fa32ed57692d16bf854a0e77ffaecd04236efa0f557905aab7291e0aef6" + } + }, + { + "name": "artplayer-proxy-canvas", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-proxy-canvas\\dist\\artplayer-proxy-canvas.js", + "member": "package/dist/artplayer-proxy-canvas.js", + "sha256": "f572ea536107b7823452c5a99447b69e9226a3582c79dda95a4248cca819ec18", + "archiveSha256": "6806be8a2cd2bcf8bf0ccf611ac5f6b53d0f1f8daa9f74bcc5a25f1e398e3136", + "sourceHashes": { + "src/adapter.ts": "68acf8f0a594f31df981d776099ddd97e013ba2ced6eb61c18a1a967870d5597", + "src/geometry.ts": "067feae2cd568f153e44346d40c1e01fdcd9b4ed021ee29e3918c218e7bf19ac", + "src/index.ts": "b954a933fe8e5d63ef905b30d2592d620e0a49aad2f8ac57a17ce43518b5cbec", + "src/media.ts": "f828c55f5fb5aad02dfd3a7bd35392ae03bb10725fa0c845932264783ddbc838", + "src/renderer.ts": "ba5f2f546b296cc6f688e7ac1129e89d0f64035ad1aa203cf479ff023d520a01", + "src/scheduler.ts": "2e32a634c655bd408250f0500d7895aab3311835b89d578aad07121e727d5fc9", + "src/subtitles.ts": "b83b3e685c1b2829cc96a8729645134fbad200545862920859708226078a7e6b", + "package.json": "729430fbeed0f59b2aa2a25cf5aa6196eaaf32e89028168b45203821681b2cd5", + "tsconfig.json": "712a3fa32ed57692d16bf854a0e77ffaecd04236efa0f557905aab7291e0aef6" + } + }, + { + "name": "artplayer-plugin-document-pip", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-document-pip\\dist\\artplayer-plugin-document-pip.js", + "member": "package/dist/artplayer-plugin-document-pip.js", + "sha256": "56440aad3ed06be55ec3a57d781f7de239e9aecf40a067e88f2cffcd01a86d6a", + "archiveSha256": "afc3617af1b11948cc5ba2358e5c9f562693381688ee30438202f0cc4701649e", + "sourceHashes": { + "src/control.ts": "9fe66b2fd59b50c05355d47a89af828b59eb9ad4e224237c72017170da7f7d65", + "src/index.ts": "28ba9b809589f4c58acc7d36bc2bb11b75832e8e6e009487c741c5b47dc4a590", + "src/projection.ts": "9a86780b54793427db448d7814d7e4a728d9f65ab3282bb6b476bb6ecedc731f", + "src/resources.ts": "6aa31086fd18104b176d6245ec297255c71993fe935db5b44ed649bedd33b8be", + "src/style.less": "a75ae94a569c8fd6ce925dcc7ab6b22cfa39a4d81decb30cc447dd7108a84a22", + "src/styles.ts": "7fed3354c81ccfd70cd70aba5afe8d1d78fa3f7022a3298c65446b5a0a0e6b96", + "src/window-session.ts": "cf6bc403caf22ecfea14da7bfa91ddb88a60ed0507d5485035abe48861e1ad17", + "package.json": "5f3671f759364be52faf3810e1534a7711270f975f06d3489d95982fbae0eafb", + "tsconfig.json": "583e4ac1afa99e3a29c7f899df9fdeefcbd14d3847d69143e3fa6a8facac6d99" + } + }, + { + "name": "artplayer-plugin-ads", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-ads\\dist\\artplayer-plugin-ads.js", + "member": "package/dist/artplayer-plugin-ads.js", + "sha256": "1429541242f49c4d558eda242a63b6e57a876c2dba06ce9f631d71d315028023", + "archiveSha256": "cc69e87d60d9f9f9e7eb76e869e6cdc30b2c570ab87c998b8018dcd72bb80b1f", + "sourceHashes": { + "src/countdown.ts": "7dab796a3d8fb757da7f87e4396403f0687af52d0876cf74ebb2b8db7c2e752a", + "src/index.ts": "7b0e155a6371c71a5c3f5ba0e9e95737648a2b73b0cf124536de8b6f79a92371", + "src/options.ts": "3ce2ad78b9f0288314fa75adf14776adf10f2205789268e9599a6d551b3b8b4f", + "src/resources.ts": "ba0d5b5f25d79929a39a9cda6b80b9e60a2b746e20312aa658d84fbb9be6562f", + "src/session.ts": "c45b0c63870975cf8fbd6f93340427de387d9dc15c56dfb3ad2ddacad8380e63", + "src/style.less": "0eeed3f29ccafc6836f5bc4338f58f784edd114d2b100fda7fc395329031a406", + "src/types.ts": "219d5b06bdbece09b88640fe6f2bc27c44dd34eff5909cec9f7405a9dced759a", + "src/view.ts": "7d2cba7a3e20ce02288627723ebc9256d61cee313c3a7d00a31373b7f250eb91", + "package.json": "9a7d0a2e917902bb64282566e96123244a81aa4859a82c6b1c711d639660a9bf", + "tsconfig.json": "583e4ac1afa99e3a29c7f899df9fdeefcbd14d3847d69143e3fa6a8facac6d99" + } + }, + { + "name": "artplayer-plugin-audio-track", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-audio-track\\dist\\artplayer-plugin-audio-track.js", + "member": "package/dist/artplayer-plugin-audio-track.js", + "sha256": "23b10856628c5568f1aa7ad88e926c7da8d96edfadf6df872777062a78a4b4be", + "archiveSha256": "02ea93d3fc3b84a5ccf4d2c73e26229c05ec1970a453da1954c264baf4015999", + "sourceHashes": { + "src/index.ts": "769b3d04261456bfb2c10849486244c9c15529229b658e39e48f8f71403abe49", + "src/track.ts": "9c6d587dc881e30a4d55746088d0122da5e0051258303d50d14a8fe5f69be2df", + "package.json": "49cddf50186ed3607a949ffe9277071b742995fbcd68ceb40174209645b3a45c", + "tsconfig.json": "c0f7dd993cf8f0fe5ce6ab390180c56cb8e3722e571c922c2ff15cb148a283ff" + } + }, + { + "name": "artplayer-plugin-vtt-thumbnail", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-vtt-thumbnail\\dist\\artplayer-plugin-vtt-thumbnail.js", + "member": "package/dist/artplayer-plugin-vtt-thumbnail.js", + "sha256": "df70ccb5261fd988ba8c2c2d689ca58653bb5426242ffd1076569a1d225997a7", + "archiveSha256": "f14a5f5a78a0a74c0f01876efac54f269edb3638f0b1e8fc44fbfb51cbad097c", + "sourceHashes": { + "src/getVttArray.ts": "b7576efb3bae92f973acdf82d0fd4e3a6bfe63c2354deb02567ba1adda25415a", + "src/index.ts": "8b01a6a0e0fade1792f480b0e1a75318a7184cfb2d32be503be40dd6c33590dd", + "src/lifetime.ts": "073d8f38ec7b37c58cf4a3e4b853068645c67d8a834510f5dc68601ace3f9176", + "src/parseVtt.ts": "66e1d8fc58029366cb78a541e75f8c0c29fa346a6de4f34bf7d262b969a84190", + "src/preview.ts": "841a16dd9d9b7ea482226cb400f48bf5998705b4a3321807e6c38ff6f7a3046e", + "src/request.ts": "afae0e57e9c61c034a1494f09d0b9ee4ab43755c61607a94f1d21292a2fee8ef", + "src/types.ts": "1c50de5f12008b6a61d16bd3a865b84433a77bdb4dc4a1d1697a9d326f497b11", + "package.json": "6f85243198e03490a29162ade8f31d5db1ab0d392a2033d1e662179598fc9013", + "tsconfig.json": "3e794cab50e16a567d3134da06fdd1b24579922dfd2098b6dd128c4476c62f95" + } + }, + { + "name": "artplayer-plugin-multiple-subtitles", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-multiple-subtitles\\dist\\artplayer-plugin-multiple-subtitles.js", + "member": "package/dist/artplayer-plugin-multiple-subtitles.js", + "sha256": "103e5f75e6ce4b8b9f14b2b8caa983c97eb24da4536048135f90517b959dcf6b", + "archiveSha256": "fec5def0bfa28306584dc82f3eda897c129ab09a9c9058a2f1ca85504c424c39", + "sourceHashes": { + "src/ass-conversion.ts": "a8468971f6776925ad9d8897d07246a4c1a98ed30506c9558e5799d2ee8d0be4", + "src/caption.ts": "95e87b446ca42836162180e0feba8fbf40a452ed8d556c08af9869cd630e2a35", + "src/index.ts": "7231cbeca6404cc7c021b768089e3f11d59522f3479012ceec3234e25851ffb2", + "src/legacy-caption.ts": "78a503e86ed69ed14b2ae64107e244eb2cb62bcf99840d311fbdb0ade95f38ec", + "src/lifetime.ts": "469cec6a9f87311aa433ad2d74925e39d56324b8136975e818388315200f1e58", + "src/merge.ts": "d7e222c0a6fbe4bccd4f8b982edc9f5205315d4cbd969c72755752dd95c6b79c", + "src/parser.d.ts": "22a596dfb02aaa00e333e9bf3285ececfa94eda3a699726cba190ae858f7c120", + "src/parser.js": "ba582074d57fa2d72880e6e4253fe14646787916b2b68e2a1e748e685cf96ab1", + "src/render.ts": "fc8df5637e7904fb4b21512ac22d80b580eca93f576e9f01a799418b3d9afc84", + "src/request.ts": "31d8af86664b7f58c31d478e36fb5598fa1afa3970a816d1a8f4d40a7a03b2d7", + "src/text.ts": "15660d74726e36831939799d72e8126ede3e3becd22ba9cc2127db4277171d0f", + "src/types.ts": "63dbdef79f87d3dd14a31e02928e819747d52ef66d82d60b6d7810884979fedb", + "package.json": "ff9b24e039161bb2c0e2e35d81683fdec08ad44db1f3678db6fe2c8d89bb7da1", + "THIRD_PARTY_NOTICES": "50755f38458d41151c7f0b1675c744aa365f0510dc11f53832691ef5c14ce6b6", + "tsconfig.json": "db47e6a8e48caa5b3b48830243b2cdee9ab584fd6dff182dde5d198b96c86887" + } + }, + { + "name": "artplayer-plugin-hls-control", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-hls-control\\dist\\artplayer-plugin-hls-control.js", + "member": "package/dist/artplayer-plugin-hls-control.js", + "sha256": "8e163d4ab6734cbc45e7f539de7db644c7faf36d0318469a86d300bf6365cca6", + "archiveSha256": "ebcc9fc9dee5764bc2cb13e105c9b0d197459016ee6e6a7304146a2403473435", + "sourceHashes": { + "src/audio.svg": "dbee5ce7487c9f8ec927e5286188cf9439345bbe947b6c06c32c07193e01e0be", + "src/index.ts": "c7ab89b964c481870f5b59fba0be4cd17b7a8ddf59b5bc8c03504f4983d64015", + "src/mapping.ts": "f517854a7825ab7783375438040602bcfeab16df0218998208dd9a3b8fe443e3", + "src/menu.ts": "774c43ebdc86555a3518b3f74d226ac03cdf41035d8cf5dd0ab519b7b144d78b", + "src/quality.svg": "4666a4c01764422f9008e442f5a889ff9691bb0386083d673943a0718f4d680c", + "src/sdk-events.ts": "4d9ee92d0720601a2c55b597bf99e7ecaf851d5fd2292adff153c539f33e460a", + "src/types.ts": "2b9c8927e4c16ab4ce486d63d2ee3fb781a01be8a5423643cabd1ec76b17f98c", + "package.json": "084bb4aea8dfce9880b062f2cf5e89b1fc94a9b403e835505631aea0e1816014", + "tsconfig.json": "583e4ac1afa99e3a29c7f899df9fdeefcbd14d3847d69143e3fa6a8facac6d99" + } + }, + { + "name": "artplayer-plugin-dash-control", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-dash-control\\dist\\artplayer-plugin-dash-control.js", + "member": "package/dist/artplayer-plugin-dash-control.js", + "sha256": "2d639a5c6a7044ada2b1d74e5b039d4cc787996b997c5a186a67724848f36c2a", + "archiveSha256": "6c70ce4de2cc0c74c55928efc7f7f6bfa588e523c47213749d77e4c4784e5781", + "sourceHashes": { + "src/audio.svg": "dbee5ce7487c9f8ec927e5286188cf9439345bbe947b6c06c32c07193e01e0be", + "src/index.ts": "e22cfd0a3a2129913278cb2fbb50e2a7b2333cc9bd53647ec764d3f8f4f30ccc", + "src/mapping.ts": "d3a3c65f3879cb1322fac55d78e5e9527d1994f7b4052ba9743412cb08c1757e", + "src/menu.ts": "f5049045ead1d47c6275b0d13fc862b53a90e2accfe99935f641d07757e06428", + "src/quality.svg": "4666a4c01764422f9008e442f5a889ff9691bb0386083d673943a0718f4d680c", + "src/sdk-events.ts": "97fdabfc6f1484ae0e95e2970ee88a6be1d71d52512db36ddf6407f3a7737570", + "src/sdk.ts": "9afd4dbc949648d7f9bb00d57dba04c71505cdd23312813f60c83a5f5506dc69", + "src/seek-buffer.ts": "ed86e48fabeac02a13cb4e7b6bd41b04bc55e432ae1d995cc432917cfaf1c33f", + "src/types.ts": "d812577c7bd877f6998b55747916117da1f400067977292907e3a910e04c239c", + "package.json": "0757055e9d84e95a3fe2278b86aefad75ddf6e3a902a2e010645f82d9936a158", + "tsconfig.json": "583e4ac1afa99e3a29c7f899df9fdeefcbd14d3847d69143e3fa6a8facac6d99" + } + }, + { + "name": "artplayer-plugin-auto-thumbnail", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-auto-thumbnail\\dist\\artplayer-plugin-auto-thumbnail.js", + "member": "package/dist/artplayer-plugin-auto-thumbnail.js", + "sha256": "4c8bdd75f49ad0514167e1b67c6941236c27837d09dd1d5d69d0345d69fa0357", + "archiveSha256": "cb803c0336f4b0d6aef598b5896cf222d0d1fddc5483819b65646e6fcfb2d911", + "sourceHashes": { + "src/encoding.ts": "5fc75397162c86f5906c19c94c9aba873c45ec8a370bc4489570ca653ff73300", + "src/extraction.ts": "9d6867fda068f60f3dde51db67cc86486da1fc0cfc0d17cb166dd417c7b55567", + "src/frames.ts": "b3e6a286cee6b365bf0a70abd2ce48f766d6e591f82fba24573ee3fcefe68021", + "src/index.ts": "cd8ef105f52230fb31d28612309a183b577596a91dea4f8a9fd3e428e7c4156f", + "src/options.ts": "8481d30b912fca90dee72224fc87e1c6c295b03f1f01fd675643d4364ae0e4ae", + "src/session.ts": "c831c720f99d42374905e443526a336e065b041f3421e17875b42cddf1fd1659", + "src/types.ts": "96cf553974c75dc2c0f506c2666af3a026190682b5c31aa6ebee84c10a20bd4d", + "src/video.ts": "d675a45d3baddfca8d7d469050b373e3b7a66ea3f9746768469d61b408b59426", + "package.json": "dbf644376d50d0ada48e27a1c09c62b036c28cbd5df62db9cc0e47f5e3a074a9", + "tsconfig.json": "ad1b793eded53e351dbd45fd1ce537bf95c0473de717ca0e13adbfcc884eb2c9" + } + }, + { + "name": "artplayer-plugin-asr", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-asr\\dist\\artplayer-plugin-asr.js", + "member": "package/dist/artplayer-plugin-asr.js", + "sha256": "06b386f6a4744801f4153944ed6e2bd37822a85e177aa2a0d800c30002ef87bf", + "archiveSha256": "d5921de820f0585fb30038458a5b48281e26981cfb70a4718ae5a99f3c3c0a06", + "sourceHashes": { + "src/audio-graph.ts": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4", + "src/capture.ts": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a", + "src/encoding.ts": "a1dbc731d5d47a6ae313728cf45e96250e7bf8c6e00a9e071781acc366235944", + "src/index.ts": "283513b118d9f7395d9f8e2423b2192e8fd95e003cb22f27b838a05a22473d0e", + "src/sample-queue.ts": "8b634ac5536bfed7938f0c63a0325371e6f9754489d43305e93240d304cca9d3", + "src/style.less": "ed40939c1db527bddf98c3e08b8c2e0b1d5a3581804fe2084d1070c9d50af0d6", + "src/subtitles.ts": "204e6899c80fe07ec67a2b010a62cd1fbc861f60df77638537006de9f96fe566", + "src/types.ts": "101e1177faf96c4445c7c93712babbc4a1697df3f69c83b6e5c1055bfcf9669b", + "src/worklet.ts": "d957bed81652862a46bd7ad21d4c5600a465e51f85d03c4e6c511910a7e556c6", + "package.json": "781b1eebefdff5fdc234b793ff9d6d8263275115ccff4c4d90c55eca942f2444", + "tsconfig.json": "583e4ac1afa99e3a29c7f899df9fdeefcbd14d3847d69143e3fa6a8facac6d99" + } + }, + { + "name": "artplayer-plugin-chromecast", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-N2u2Kr\\artifacts\\artplayer-plugin-chromecast\\dist\\artplayer-plugin-chromecast.js", + "member": "package/dist/artplayer-plugin-chromecast.js", + "sha256": "80b12b3081086488c9d80f03979c336d4a6fdb44dca298e218dfeaaadb295d00", + "archiveSha256": "39d5e7cb1d7997d2f6a1d1a5fa060d7976699680e887366beb52b8c3e4cf9790", + "sourceHashes": { + "src/cast.svg": "48470d66b5874569c54d66889b0ec62c33bf809670d4baf2eded2bfa83d6d726", + "src/controller.ts": "1bf55c5a6a4a83290ee591d4286452acd7ba0b27d01e4b6293e16d61772655c2", + "src/index.ts": "951d8bbaf273c56722d3767a514a3f8a65050122d934612e5c53c8349d1400e7", + "src/media.ts": "6c16b3cc7b5c570dbb6ae7a4ff9c1492f8e6a07d07662db2b417ff825b7f0dd1", + "src/sdk.ts": "eee5ff443406c400bd54822b71b20e1bb8a9191e15c625eb329cb3207a01902f", + "src/types.ts": "184088b4a641ac3c40a7ea9904b9033617ceba99b6046d959ea3604007cd5e20", + "package.json": "7397dece5892b46b8a30dcb03f847320312330b4f6ebd78900d66aed4d50b6a9", + "tsconfig.json": "4e4d4e725a1f49736504f408a1b56abb6a1f1aec9213be890b5db6c7c7a28002" + } + } + ], + "installed": { + "directory": "refactor/.cache/ci01-asr-cast-installed-report", + "report": { + "path": "refactor/.cache/ci01-asr-cast-installed-report/report.json", + "sha256": "8b7afe640cb1d161057625df03cee81166eb62a18d9d4653b29d9608a7f6d709" + }, + "invocation": { + "path": "refactor/.cache/ci01-asr-cast-installed-report/invocation.json", + "sha256": "a5cd2afc628b5fefebc4465b3c67faa83e084c84f4640e0a8986ee94de2181a7" + }, + "result": { + "scope": "installed", + "exitCode": 0, + "signal": null, + "args": [ + "test", + "--config=playwright.installed.config.js", + "asr-.*\\.spec|chromecast-lifecycle\\.spec", + "--workers=2" + ] + }, + "stats": { + "startTime": "2026-09-14T18:44:31.412Z", + "duration": 173947.277, + "expected": 129, + "skipped": 42, + "unexpected": 0, + "flaky": 0 + }, + "files": { + "chromium/asr-audio-track.spec.js": { + "total": 4, + "passed": 4, + "skipped": 0, + "failed": 0, + "installedSelections": 8 + }, + "firefox/asr-audio-track.spec.js": { + "total": 4, + "passed": 4, + "skipped": 0, + "failed": 0, + "installedSelections": 8 + }, + "webkit/asr-audio-track.spec.js": { + "total": 4, + "passed": 0, + "skipped": 4, + "failed": 0, + "installedSelections": 8 + }, + "chromium/asr-audio.spec.js": { + "total": 9, + "passed": 9, + "skipped": 0, + "failed": 0, + "installedSelections": 3 + }, + "firefox/asr-audio.spec.js": { + "total": 9, + "passed": 9, + "skipped": 0, + "failed": 0, + "installedSelections": 3 + }, + "webkit/asr-audio.spec.js": { + "total": 9, + "passed": 0, + "skipped": 9, + "failed": 0, + "installedSelections": 3 + }, + "chromium/asr-capture-cors.spec.js": { + "total": 2, + "passed": 2, + "skipped": 0, + "failed": 0, + "installedSelections": 2 + }, + "firefox/asr-capture-cors.spec.js": { + "total": 2, + "passed": 2, + "skipped": 0, + "failed": 0, + "installedSelections": 2 + }, + "webkit/asr-capture-cors.spec.js": { + "total": 2, + "passed": 0, + "skipped": 2, + "failed": 0, + "installedSelections": 2 + }, + "chromium/asr-cors.spec.js": { + "total": 12, + "passed": 12, + "skipped": 0, + "failed": 0, + "installedSelections": 6 + }, + "firefox/asr-cors.spec.js": { + "total": 12, + "passed": 12, + "skipped": 0, + "failed": 0, + "installedSelections": 6 + }, + "webkit/asr-cors.spec.js": { + "total": 12, + "passed": 0, + "skipped": 12, + "failed": 0, + "installedSelections": 0 + }, + "chromium/asr-fallback.spec.js": { + "total": 9, + "passed": 9, + "skipped": 0, + "failed": 0, + "installedSelections": 6 + }, + "firefox/asr-fallback.spec.js": { + "total": 9, + "passed": 9, + "skipped": 0, + "failed": 0, + "installedSelections": 6 + }, + "webkit/asr-fallback.spec.js": { + "total": 9, + "passed": 0, + "skipped": 9, + "failed": 0, + "installedSelections": 6 + }, + "chromium/asr-playback.spec.js": { + "total": 6, + "passed": 6, + "skipped": 0, + "failed": 0, + "installedSelections": 3 + }, + "firefox/asr-playback.spec.js": { + "total": 6, + "passed": 6, + "skipped": 0, + "failed": 0, + "installedSelections": 3 + }, + "webkit/asr-playback.spec.js": { + "total": 6, + "passed": 0, + "skipped": 6, + "failed": 0, + "installedSelections": 0 + }, + "chromium/chromecast-lifecycle.spec.js": { + "total": 15, + "passed": 15, + "skipped": 0, + "failed": 0, + "installedSelections": 15 + }, + "firefox/chromecast-lifecycle.spec.js": { + "total": 15, + "passed": 15, + "skipped": 0, + "failed": 0, + "installedSelections": 15 + }, + "webkit/chromecast-lifecycle.spec.js": { + "total": 15, + "passed": 15, + "skipped": 0, + "failed": 0, + "installedSelections": 15 + } + }, + "attempts": 171, + "identities": [ + { + "kind": "installed", + "name": "artplayer-plugin-asr", + "sha256": "06b386f6a4744801f4153944ed6e2bd37822a85e177aa2a0d800c30002ef87bf", + "archiveSha256": "d5921de820f0585fb30038458a5b48281e26981cfb70a4718ae5a99f3c3c0a06", + "total": 63, + "passed": 48, + "skipped": 15 + }, + { + "kind": "installed", + "name": "artplayer-plugin-audio-track", + "sha256": "23b10856628c5568f1aa7ad88e926c7da8d96edfadf6df872777062a78a4b4be", + "archiveSha256": "02ea93d3fc3b84a5ccf4d2c73e26229c05ec1970a453da1954c264baf4015999", + "total": 12, + "passed": 8, + "skipped": 4 + }, + { + "kind": "published", + "sha256": "30c7b1fc92a262cda8c3aba63afea9c6c038f52c057039d1c6aa957baed155b6", + "total": 9, + "passed": 6, + "skipped": 3 + }, + { + "kind": "published", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "total": 36, + "passed": 30, + "skipped": 6 + }, + { + "kind": "installed", + "name": "artplayer-plugin-chromecast", + "sha256": "80b12b3081086488c9d80f03979c336d4a6fdb44dca298e218dfeaaadb295d00", + "archiveSha256": "39d5e7cb1d7997d2f6a1d1a5fa060d7976699680e887366beb52b8c3e4cf9790", + "total": 45, + "passed": 45, + "skipped": 0 + } + ], + "capabilities": [ + { + "engine": "chromium", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "undefined", + "audioWorklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "undefined", + "audioWorklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "undefined", + "audioWorklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: capture follows main media, not the independent audible track", + "data": { + "audioContext": "undefined", + "audioWorklet": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR candidate + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "firefox", + "file": "asr-audio.spec.js", + "title": "ASR candidate + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "undefined", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "firefox", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "webkit", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "firefox", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "function", + "prefixed": "undefined", + "worklet": "function" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: anonymous-cors native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque-redirect native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: anonymous-cors native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque-redirect native audio access and source recovery", + "data": { + "context": "undefined", + "prefixed": "undefined", + "worklet": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "chromium", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "firefox", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published-5.3.0: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + candidate: native capture fallback does not create a second audible route", + "data": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + } + } + ], + "failures": [], + "skipped": [ + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorklet; Safari and physical-device composition remain unverified", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio-track.spec.js", + "line": 36, + "column": 10 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "published core + ASR/audio-track: capture follows main media, not the independent audible track", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorklet; Safari and physical-device composition remain unverified", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio-track.spec.js", + "line": 36, + "column": 10 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorklet; Safari and physical-device composition remain unverified", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio-track.spec.js", + "line": 36, + "column": 10 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: capture follows main media, not the independent audible track", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorklet; Safari and physical-device composition remain unverified", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio-track.spec.js", + "line": 36, + "column": 10 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.0.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + published: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR 2.1.0 + candidate: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published-5.3.0: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + published: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-audio.spec.js", + "title": "ASR candidate + candidate: native Worklet supplies local PCM with owned stop and destroy", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit 26.6 has no AudioContext/AudioWorkletNode; native ASR acceptance remains open", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-audio.spec.js", + "line": 33, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks AudioContext/AudioWorklet; this is not Safari/device CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-capture-cors.spec.js", + "line": 43, + "column": 12 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-capture-cors.spec.js", + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks AudioContext/AudioWorklet; this is not Safari/device CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-capture-cors.spec.js", + "line": 43, + "column": 12 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: anonymous-cors native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + published: opaque-redirect native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: anonymous-cors native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR 2.1.0 + candidate: opaque-redirect native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: anonymous-cors native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + published: opaque-redirect native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: anonymous-cors native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-cors.spec.js", + "title": "ASR candidate + candidate: opaque-redirect native audio access and source recovery", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-cors.spec.js", + "line": 29, + "column": 16 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + published: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR 2.1.0 + candidate: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published-5.3.0: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + published: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate + candidate: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published-5.3.0: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + published: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-fallback.spec.js", + "title": "ASR candidate capture + candidate: native capture fallback does not create a second audible route", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no native WebAudio", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-fallback.spec.js", + "line": 28, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR 2.1.0 + published: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR candidate + published: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + }, + { + "engine": "webkit", + "file": "asr-playback.spec.js", + "title": "ASR candidate + candidate: native playback volume and mute", + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native AudioContext/AudioWorkletNode", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-playback.spec.js", + "line": 27, + "column": 14 + } + } + ] + } + ] + }, + "source": { + "directory": "refactor/.cache/ci01-asr-cast-source-report", + "report": { + "path": "refactor/.cache/ci01-asr-cast-source-report/report.json", + "sha256": "786e740fe7cce1d8377c8830375f729c043b6b785de9e2776fb36418c99f9347" + }, + "invocation": { + "path": "refactor/.cache/ci01-asr-cast-source-report/invocation.json", + "sha256": "9f43f3ca1c7055399833117cdecb1f001b65bc80d1ed8d733d10aab3c89c942d" + }, + "result": { + "scope": "source", + "exitCode": 0, + "signal": null, + "args": [ + "test", + "--config=playwright.source.config.js", + "--project=chromium", + "--workers=2", + "--grep", + "ASR candidate \\+ candidate: native Worklet|candidate core \\+ ASR/audio-track: pause, update|candidate: Cast async registration" + ] + }, + "stats": { + "startTime": "2026-09-14T18:48:19.414Z", + "duration": 36432.617000000006, + "expected": 3, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "files": { + "chromium/asr-audio-track.spec.js": { + "total": 1, + "passed": 1, + "skipped": 0, + "failed": 0, + "installedSelections": 0 + }, + "chromium/asr-audio.spec.js": { + "total": 1, + "passed": 1, + "skipped": 0, + "failed": 0, + "installedSelections": 0 + }, + "chromium/chromecast-lifecycle.spec.js": { + "total": 1, + "passed": 1, + "skipped": 0, + "failed": 0, + "installedSelections": 0 + } + }, + "attempts": 3, + "identities": [ + { + "kind": "source-build", + "sha256": "f5fcf901c7e8c197f72d44ed6d7e4445cbad0c6ce2258d9127a765712d75b010", + "total": 2, + "passed": 2, + "skipped": 0 + }, + { + "kind": "source-build", + "sha256": "c4b37388ecf38c4c33dc172895d2d76d1ffca2587628c01b11b38cfe1852c713", + "total": 1, + "passed": 1, + "skipped": 0 + }, + { + "kind": "source-build", + "sha256": "d973945154aa56dafa4ef0de5425661606cef25f1d363c05120f7764b9e53a94", + "total": 1, + "passed": 1, + "skipped": 0 + } + ], + "capabilities": [ + { + "engine": "chromium", + "file": "asr-audio-track.spec.js", + "title": "candidate core + ASR/audio-track: pause, update, ASR stop and destroy preserve separate ownership", + "data": { + "audioContext": "function", + "audioWorklet": "function" + } + }, + { + "engine": "chromium", + "file": "asr-audio.spec.js", + "title": "ASR candidate + candidate: native Worklet supplies local PCM with owned stop and destroy", + "data": { + "AudioContext": "function", + "webkitAudioContext": "undefined", + "AudioWorkletNode": "function" + } + } + ], + "failures": [], + "skipped": [] + }, + "checks": [ + { + "path": "refactor/.cache/ci01-asr-cast-packages.log", + "sha256": "8c2b987dd22f7c75b386b6295ba6e930b8c57bea0d1fd3bd41892951cd13fb37" + }, + { + "path": "refactor/.cache/ci01-asr-cast-node.log", + "sha256": "db4b04c6ee5ad45a2169414bd585a80bd33760db510ea4b88667f262a03c943e" + }, + { + "path": "refactor/.cache/ci01-asr-cast-node-final.log", + "sha256": "c2c0ee3d57164d7b234a5e24cd1d22c4035f9fb12b64cd77ce6361f6069b2597" + }, + { + "path": "refactor/.cache/ci01-asr-cast-node-verified.log", + "sha256": "110782941550483a9a458bc1075573ec198949d328a9aaf78e38bdeb7271dbdb" + }, + { + "path": "refactor/.cache/ci01-asr-cast-unit.log", + "sha256": "7d11c689777cc7aff82f46a00236128191ceca2de745970fcd74ca0c0450c3fe" + }, + { + "path": "refactor/.cache/ci01-asr-cast-lint-initial.log", + "sha256": "899785537f1db1eaa298970103347b9d323194e87f867e5954ff2b2a0837982c" + }, + { + "path": "refactor/.cache/ci01-asr-cast-lint-workflow.log", + "sha256": "ff01d6d6ec1ef655edc14958eef445ea2d2cf278b2ee7a21c02b2d394eca77b9" + }, + { + "path": "refactor/.cache/ci01-asr-cast-lint-fix.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "refactor/.cache/ci01-asr-cast-lint.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "refactor/.cache/ci01-asr-cast-types.log", + "sha256": "21968c3c2b61b3e4ce289d1a14609a27a571e087b31729852803646b760d74bb" + }, + { + "path": "refactor/.cache/ci01-asr-cast-toolchain.log", + "sha256": "05c826e96ba04a9f2b519b414506130f5ffe44250dee21dd371351e7ad62a2cd" + }, + { + "path": "refactor/.cache/ci01-asr-cast-ci.log", + "sha256": "2564460e127e128134558fd94751052e853ba36918758384a65394c561081af2" + }, + { + "path": "refactor/.cache/ci01-asr-cast-actionlint.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "refactor/.cache/ci01-asr-cast-collection.log", + "sha256": "0190e95d2ef997dbf95fd394606cf016f338d67ed5953ac5f405e1998345c201" + }, + { + "path": "refactor/.cache/ci01-asr-cast-installed.log", + "sha256": "fc4e0d1d75dbb4c82fed1e6735a27c405d615de6ead1a76249f8f0283196f9a8" + }, + { + "path": "refactor/.cache/ci01-asr-cast-source.log", + "sha256": "dce414e03539614875acc0eba513d828c686322dc757bb8c9afda7fc26cdc3d8" + } + ], + "executableInputs": { + "refactor/scripts/ci-workflow.mjs": "93a82e76c6c8bdfa5a7555641657c7c3573a6368819bf8e61c34ee355fdbb6ef", + "refactor/scripts/ci-workflow.test.mjs": "5d317a6316f9e70e1f27af88da86f16d63f34f5a0e98e6c2e4387620bf72eb78", + "scripts/browser-validation/scope.ts": "a698d28df935f11fed579934e87e208291ef4d3e2900f3fdbf3b8ce9afc4d6c5", + "scripts/package-check.mjs": "893701959a8505f3ea9f8da3a33d7919c5571cca6391fb82f6a8fcfad4ed7262", + "test/browser/asr-audio-track.spec.js": "908739d4201870199b6b2f137962ff7890935dd7ca6530e746513268eabbd1ef", + "test/browser/asr-audio.spec.js": "519bf476cfd75ab28f7f80ac70d1295697f8b23f0c2c3c24f783103a765e8a86", + "test/browser/asr-capture-cors.spec.js": "d614a45771c4dae123f29bcf52eb1fb231ce257901e0337ccf358d3f8ad0e99b", + "test/browser/asr-cors.spec.js": "363f32236657614895a8a2d9b1a30f374ccbd4423a28b8c771323d47b524bdb7", + "test/browser/asr-fallback.spec.js": "27c21d7653a4bf94ee4c2fc4eab218a42bf067a6148f0693b2ac0ddee8a02937", + "test/browser/asr-playback.spec.js": "d2f3a370525e2f1e3a674cbb7ea1ca79ad8f2b823b7a1c2fb5bb0a1d19cdf3be", + "test/browser/chromecast-lifecycle.spec.js": "a9255df202e47f932b612dfd907d5c0a0ab33349998fed58e054c276147b9f63", + "test/package-check.test.js": "73c2570708e92e6ae913a55c4bf9c719598f7da0261d9a944baaaae7589ac916" + }, + "limitations": [ + "Only seven newly added files executed; prior Chapter/Audio/DASH failures remain open outside this run.", + "ASR capability skips and pre-skip selected identities do not establish native processing. Multi-plugin cases count separate identities; identity totals are not unique test totals.", + "ASR has no speech recognition service or physical speaker verification; forced fallback branches remain explicit.", + "Chromecast SDK is controlled. No receiver, discovery, real Cast SDK or remote playback acceptance.", + "VAST controlled source tests replace a dependency and remain outside installed coverage; real IMA gate remains separate.", + "Generic runtime/type consumer covers core/chapter only. Some existing package architecture wording was updated after preparation; publication still requires a fresh final pack." + ] +} diff --git a/refactor/changes/2026-09-15-CI-01-asr-cast-installed.md b/refactor/changes/2026-09-15-CI-01-asr-cast-installed.md new file mode 100644 index 000000000..0e9385165 --- /dev/null +++ b/refactor/changes/2026-09-15-CI-01-asr-cast-installed.md @@ -0,0 +1,57 @@ +# CI-01 统一包清单并接入 ASR、Chromecast 安装验证 + +## 工程与加载边界 + +新增 yarn test:package --browser,从 browser-validation/scope.ts 的 installedPackages +生成额外包清单,与安装浏览器预检使用同一数据来源。默认 core/chapter 与显式 +--include 保留;未知/重复/空选项及 --browser 与 --include/--release 混用被拒绝。 +工作流、契约负例和维护文档同步,不能在 CI 偷换为手写部分包列表。 +此 CLI 属于固定 Node 24 工程工具,不改变消费者运行环境或公开播放器接口。 + +新增 ASR 六文件与 Chromecast 一文件。ASR 使用实际 WebAudio/Worklet、本地媒体、 +原生或明确强制的 capture fallback、音量/CORS/Audio Track 组合;组合分别核验 +ASR 和 Audio Track 安装身份。Chromecast 使用真实核心 DOM/点击/本地视频及受控 +SDK,不验证接收设备、发现或远端媒体。其余未知真实环境保持各自任务门槛。 +候选加载器拒绝安装 map 与显式 artifact 同时使用;已发布输入仍按冻结归档加载。 + +VAST 主测试 externalize 后替换 wrapper 依赖,不能直接换为完整 bundle 并冒充 +真实安装验收,因此未纳入这个范围;实际 IMA 路径继续独立验证。没有修改生产 +源码、公开 API、超时、业务断言、依赖或锁文件。历史包内说明中的硬编码清单 +改为指向 --browser 与共同清单,防止未来列表和文档漂移。 + +## 已验证的工程范围 + +Windows x64,Node 24.21.0、Yarn 1.22.22。--browser 实际创建十四包 run-N2u2Kr, +正常构建/pack/独立安装/冻结复装与完整文件核验通过。通用消费者依然仅验证 +core/chapter 的 36 运行时、5 旧类型模式和 8 精确类型模式。 + +相关单元 357/357、工程 48/48、scoped lint、library 类型、严格工具链、工作流 +契约和 actionlint 1.7.12 通过(未调用 shellcheck/pyflakes)。初始未使用 import/ +顺序及既有测试行格式错误已改正;旧工作流负例依赖手写包名,修改为禁止手写 +部分名单后通过。中间失败日志保留,最终结果明确区分。 + +完整 installed collection 为 39 文件/1308 项;本轮实际执行新增七文件的 171 项, +三引擎、workers=2、retries=0。结果、实际输入指纹与能力限制见机器证据。 +这不代表完整十四包矩阵或远端 CI 全绿;之前 Chapter/Audio/DASH 失败继续保留。 +部分既有包的文档措辞在准备快照后更新,发布前仍需重新打包绑定最终内容。 + +CI-01 仍 doing,ASR/CAST 真机门槛未关闭,没有推送或发布。回退此检查点恢复 +十二包名单和手写准备命令,不涉及生产代码回退。 + +## 实测结果 + +Chromium 153.0.8010.12 与 Firefox 155.0 各 57/57 通过;WebKit 26.6 为 15 通过、 +42 WebAudio 能力跳过。合计 129 通过、42 跳过、0 失败,耗时 173.947 秒, +实际退出 0、无重试;这是新增范围的结果,不覆盖完整 1308 项安装清单。 +Chromecast 45 项均为受控 SDK 生命周期;ASR 84 项通过中 48 项选择候选, +其余保留旧包控制。候选 ASR/Audio Track 的八项组合分别记录两个安装身份, +不能把身份条数重复算作测试条数;在 skip 前记录的候选身份不计处理能力通过。 + +故意继承安装 map 后,source 入口清除它,三个 Chromium 定向用例 3/3 通过: +ASR 原生 Worklet、ASR/Audio Track 组合、Cast 注册点击。四个实际选包身份均为 +source-build(组合包含两个包)。源码回归仍是定向范围,不代表全量源码矩阵。 +所有输入、命令、统计和 skip 注解见 +[机器证据](../baselines/ci-asr-cast-installed-validation.json)。归档目录为 +ci01-asr-cast-installed-report 与 ci01-asr-cast-source-report;原始日志和实际退出 +状态均保留。无新增运行失败,但 ASR 真机/物理输出、Cast 接收设备和整体发布 +门槛继续开放。 diff --git a/refactor/ci-setup.md b/refactor/ci-setup.md index 990caa9b9..2d8abf207 100644 --- a/refactor/ci-setup.md +++ b/refactor/ci-setup.md @@ -2,7 +2,8 @@ 浏览器CI现在分别执行 `yarn test:browser:source` 和 `yarn test:browser:installed`。前者清除继承的安装map并保留全部spec;后者要求已 -核验的core/chapter/Ambilight/Canvas/Document PiP/Ads/Audio Track/VTT Thumbnail/Multiple Subtitles/HLS Control/DASH Control/Auto Thumbnail安装,执行明确列出的installed子集。两步不 +核验的统一包清单,执行明确列出的 installed 子集;清单维护在 +`scripts/browser-validation/scope.ts`。两步不 吞失败,普通失败后仍保存另一范围的证据,分别上传browser-source/browser-installed。 入口与报告规则见[维护说明](../scripts/browser-validation/README.md)。source全量 耗时/60分钟预算、其余插件安装矩阵与远端运行仍待CI-01/CI-04,不计为已通过。 @@ -165,3 +166,7 @@ common.js/bootstrap.js 由 browser 下的 TS 生成,源代码进入 typecheck: 和根 lint,产物由 check:site-assets 比较;不再对生成 common.js 应用源码 lint。 build:ts 生成声明 URL 清单后重建站点浏览器产物,check:editor-types 保持只读。 新增 test:site-editor 并接入 test:node,新增真实 Monaco 交互测试走现有三引擎矩阵。 + +安装准备使用 `yarn test:package --browser`,从 browser-validation/scope.ts 的同一 +包清单生成,不再在工作流复制列表。默认 core/chapter 消费者及显式 --include 保留; +此选项不表示全生态类型、SDK 或发布准入。 diff --git a/refactor/plan.md b/refactor/plan.md index 5b9e02768..f99f8aee3 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -509,7 +509,7 @@ - ENG-09: [记录](changes/2026-09-12-ENG-09-integration.md) [记录](baselines/engineering-integration.json) - ENG-10: [记录](changes/2026-09-10-ENG-10-test-reliability.md) [记录](test-reliability.md) - ENG-11: [记录](build-analysis.md) [记录](baselines/bundle-attribution.json) [记录](changes/2026-09-11-ENG-11-build-analysis.md) -- CI-01: [记录](ci-setup.md) [记录](changes/2026-09-13-CI-01-matrix-summary.md) [记录](baselines/ci-matrix-validation.json) [记录](changes/2026-09-13-CI-01-node-consumers.md) [记录](baselines/node-consumer-validation.json) [记录](changes/2026-09-14-CI-01-installed-full.md) [记录](baselines/ci-installed-full-validation.json) [记录](changes/2026-09-14-CI-01-source-chromium.md) [记录](baselines/ci-source-chromium-validation.json) [记录](changes/2026-09-15-CI-01-ads-installed.md) [记录](baselines/ci-ads-installed-validation.json) [记录](changes/2026-09-15-CI-01-subtitles-installed.md) [记录](baselines/ci-subtitles-installed-validation.json) [记录](changes/2026-09-15-CI-01-adaptive-installed.md) [记录](baselines/ci-adaptive-installed-validation.json) +- CI-01: [记录](ci-setup.md) [记录](changes/2026-09-13-CI-01-matrix-summary.md) [记录](baselines/ci-matrix-validation.json) [记录](changes/2026-09-13-CI-01-node-consumers.md) [记录](baselines/node-consumer-validation.json) [记录](changes/2026-09-14-CI-01-installed-full.md) [记录](baselines/ci-installed-full-validation.json) [记录](changes/2026-09-14-CI-01-source-chromium.md) [记录](baselines/ci-source-chromium-validation.json) [记录](changes/2026-09-15-CI-01-ads-installed.md) [记录](baselines/ci-ads-installed-validation.json) [记录](changes/2026-09-15-CI-01-subtitles-installed.md) [记录](baselines/ci-subtitles-installed-validation.json) [记录](changes/2026-09-15-CI-01-adaptive-installed.md) [记录](baselines/ci-adaptive-installed-validation.json) [记录](changes/2026-09-15-CI-01-asr-cast-installed.md) [记录](baselines/ci-asr-cast-installed-validation.json) - CI-02: [记录](changes/2026-09-14-CI-02-pages-artifact.md) [记录](baselines/pages-artifact-validation.json) [记录](pages-deployment.md) - PILOT-01: [记录](changes/2026-09-10-PILOT-01-chapter.md) [记录](baselines/pilot-validation.json) - CORE-01: [记录](changes/2026-09-10-CORE-01-typed-utils.md) [记录](baselines/core-utils-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 92b5d9629..6bad40f33 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,14 @@ # 进度与证据 +## CI-01 统一安装包清单并接入 ASR / Chromecast + +新增 --browser 从同一清单准备十四包,实际安装核验通过;消除 CI 手写列表并 +保留默认/显式子集方式。新增七文件三引擎 171 项:129 通过、42 WebAudio 能力 +跳过;Cast 仅受控 SDK,设备门槛不变。源码定向 3/3、单元 357/357、工程 48/48 +通过,见[记录](changes/2026-09-15-CI-01-asr-cast-installed.md)。完整清单为 +39 文件/1308 项,本轮未全跑。197/263 完成,CI-01 继续 doing;下一步处理其余 +包的完整产物/资源映射,VAST 的依赖替换测试不能冒充已安装完整 bundle。 + ## CI-01 自适应控制和自动缩略图接入安装矩阵 十二包实际安装通过,清单扩展到 32 文件/1137 项。新增七文件三引擎实跑 diff --git a/refactor/scripts/ci-workflow.mjs b/refactor/scripts/ci-workflow.mjs index 969353291..45df61d73 100644 --- a/refactor/scripts/ci-workflow.mjs +++ b/refactor/scripts/ci-workflow.mjs @@ -90,10 +90,10 @@ export function validateCIWorkflow(source) { const vueIndex = browser.steps.findIndex(step => step.run === 'yarn test:vue-consumer 2>&1 | tee refactor/.cache/ci/vue-consumer.log') assert(vueIndex > consumerIndex && !Object.hasOwn(browser.steps[vueIndex], 'if'), 'Run Vue installed consumers after restoring canonical Node') assert(browser.steps.some(step => step.uses?.startsWith('actions/upload-artifact@') && step.if === 'always()' && step.with.path.split('\n').includes('refactor/.cache/vue-consumer-*/')), 'Retain Vue consumer failure evidence') - const extraIndex = browser.steps.findIndex(step => step.run?.startsWith('yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas,artplayer-plugin-document-pip,artplayer-plugin-ads,artplayer-plugin-audio-track,artplayer-plugin-vtt-thumbnail,artplayer-plugin-multiple-subtitles,artplayer-plugin-hls-control,artplayer-plugin-dash-control,artplayer-plugin-auto-thumbnail ')) + const extraIndex = browser.steps.findIndex(step => step.run?.startsWith('yarn test:package --browser ')) const sourceEngineIndex = browser.steps.findIndex(step => step.run === 'yarn test:browser:source 2>&1 | tee refactor/.cache/ci/browser-source.log') const engineIndex = browser.steps.findIndex(step => step.run === 'yarn test:browser:installed 2>&1 | tee refactor/.cache/ci/browser-installed.log') - assert(extraIndex > Math.max(consumerIndex, reactIndex, vueIndex) && extraIndex < engineIndex, 'Prepare installed Ambilight/Canvas/Document PiP/Ads after consumer probes and before browser checks') + assert(extraIndex > Math.max(consumerIndex, reactIndex, vueIndex) && extraIndex < engineIndex, 'Prepare the shared installed browser roster after consumer probes and before browser checks') assert(!Object.hasOwn(browser.steps[extraIndex], 'if') && browser.steps[extraIndex].run.includes('GITHUB_ENV') && browser.steps[extraIndex].run.includes('ARTPLAYER_BROWSER_ARTIFACTS='), 'Always select the additional installed browser artifact map') assert(sourceEngineIndex > extraIndex && sourceEngineIndex < engineIndex, 'Retain complete source checks before the additional installed suite') for (const index of [sourceEngineIndex, engineIndex]) { diff --git a/refactor/scripts/ci-workflow.test.mjs b/refactor/scripts/ci-workflow.test.mjs index c7be6233f..1a14069fd 100644 --- a/refactor/scripts/ci-workflow.test.mjs +++ b/refactor/scripts/ci-workflow.test.mjs @@ -33,17 +33,20 @@ for (const [name, mutate] of [ ['conditional Node setup', w => w.jobs.checks.steps.find(s => s.uses?.startsWith('actions/setup-node@')).if = 'false'], ['wrong consumer Node version', w => w.jobs['browser-smoke'].steps.find(s => s.id === 'consumer-node-20').with['node-version'] = '24'], ['skipped installed consumer', w => w.jobs['browser-smoke'].steps.find(s => s.run?.includes('--expected-node 22.12.0')).if = 'false'], - ['missing browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include=')).run = 'echo omitted'], - ['missing Document PiP browser installation', (w) => { - const step = w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include=')) - step.run = step.run.replace(',artplayer-plugin-document-pip', '') + ['missing browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --browser')).run = 'echo omitted'], + ['manual partial browser package roster', (w) => { + const step = w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --browser')) + step.run = step.run.replace('--browser', '--include=artplayer-plugin-ambilight') }], - ['skipped browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include=')).if = 'false'], + ['skipped browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --browser')).if = 'false'], ['missing source browser checks', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:source ')).run = 'echo omitted'], ['filtered source browser checks', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:source ')).run += ' --grep subset'], ['source failure prevents installed evidence', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:installed ')).if = 'success()'], ['ignored installed failure', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:installed '))['continue-on-error'] = true], - ['missing separate source evidence', w => { const upload = w.jobs['browser-smoke'].steps.find(s => s.uses?.startsWith('actions/upload-artifact@')); upload.with.path = upload.with.path.replace('refactor/.cache/browser-source/\n', '') }], + ['missing separate source evidence', (w) => { + const upload = w.jobs['browser-smoke'].steps.find(s => s.uses?.startsWith('actions/upload-artifact@')) + upload.with.path = upload.with.path.replace('refactor/.cache/browser-source/\n', '') + }], ['browser runtime not restored', w => w.jobs['browser-smoke'].steps.find(s => s.id === 'restore-canonical-node').with = { 'node-version': '22.12.0', 'package-manager-cache': false }], ['skipped React consumer', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:react-consumer')).if = 'false'], ['removed React consumer', w => w.jobs['browser-smoke'].steps = w.jobs['browser-smoke'].steps.filter(s => !s.run?.startsWith('yarn test:react-consumer'))], diff --git a/refactor/tasks.json b/refactor/tasks.json index 34a1f62fa..4b1e5f819 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -768,7 +768,9 @@ "changes/2026-09-15-CI-01-subtitles-installed.md", "baselines/ci-subtitles-installed-validation.json", "changes/2026-09-15-CI-01-adaptive-installed.md", - "baselines/ci-adaptive-installed-validation.json" + "baselines/ci-adaptive-installed-validation.json", + "changes/2026-09-15-CI-01-asr-cast-installed.md", + "baselines/ci-asr-cast-installed-validation.json" ] }, { diff --git a/scripts/browser-validation/README.md b/scripts/browser-validation/README.md index 9dbdde6f6..13bd60d60 100644 --- a/scripts/browser-validation/README.md +++ b/scripts/browser-validation/README.md @@ -14,8 +14,8 @@ also retains explicit historical and committed-artifact cases; its name does not promise that every dependency is rebuilt from current source in every test. `yarn test:browser:installed` requires ARTPLAYER_BROWSER_ARTIFACTS from -`yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas,artplayer-plugin-document-pip,artplayer-plugin-ads,artplayer-plugin-audio-track,artplayer-plugin-vtt-thumbnail,artplayer-plugin-multiple-subtitles,artplayer-plugin-hls-control,artplayer-plugin-dash-control,artplayer-plugin-auto-thumbnail`. -Both launcher and config validate the selected twelve packages' installed hashes +`yarn test:package --browser`. +Both launcher and config validate the selected packages' installed hashes and source/build freshness. `scope.ts` lists the currently supported installed test files. This is a growing installed subset, not full ecosystem acceptance. Source checks remain complete when the installed list grows. @@ -83,3 +83,17 @@ rejects diagnostic SDK patches/debug replacements and synthetic recovery probes, while source diagnostics remain explicit. Auto Thumbnail uses native media/JPEG with a stub host and retains its presentation/fallback pixel limitations. See ../../refactor/changes/2026-09-15-CI-01-adaptive-installed.md for executed results. + +`yarn test:package --browser` derives additional packages from installedPackages +in scope.ts, so CI preparation and browser preflight share one roster. The default +command still prepares core/chapter; --include retains explicit subsets. Unknown, +duplicate, empty or conflicting --browser/--release/--include options fail before +building. --browser is preparation, never full release acceptance. + +ASR adds six native audio/routing/CORS files, including a composition that checks +ASR and Audio Track identities separately. Historical inputs, unsupported WebAudio +and deliberately forced fallback branches remain labeled. Chromecast adds its +controlled SDK lifecycle file with actual core DOM/local media; it does not run +a Cast receiver. VAST controlled tests externalize and replace a dependency, so +they are not advertised as installed bundle coverage. Its real IMA suite retains +its independent gate. See ../../refactor/changes/2026-09-15-CI-01-asr-cast-installed.md. diff --git a/scripts/browser-validation/scope.ts b/scripts/browser-validation/scope.ts index 389f687cb..429318d90 100644 --- a/scripts/browser-validation/scope.ts +++ b/scripts/browser-validation/scope.ts @@ -2,7 +2,7 @@ import type { PlaywrightTestConfig } from '@playwright/test' import assert from 'node:assert/strict' export type BrowserScope = 'source' | 'installed' -export const installedPackages = ['artplayer', 'artplayer-plugin-chapter', 'artplayer-plugin-ambilight', 'artplayer-proxy-canvas', 'artplayer-plugin-document-pip', 'artplayer-plugin-ads', 'artplayer-plugin-audio-track', 'artplayer-plugin-vtt-thumbnail', 'artplayer-plugin-multiple-subtitles', 'artplayer-plugin-hls-control', 'artplayer-plugin-dash-control', 'artplayer-plugin-auto-thumbnail'] +export const installedPackages = ['artplayer', 'artplayer-plugin-chapter', 'artplayer-plugin-ambilight', 'artplayer-proxy-canvas', 'artplayer-plugin-document-pip', 'artplayer-plugin-ads', 'artplayer-plugin-audio-track', 'artplayer-plugin-vtt-thumbnail', 'artplayer-plugin-multiple-subtitles', 'artplayer-plugin-hls-control', 'artplayer-plugin-dash-control', 'artplayer-plugin-auto-thumbnail', 'artplayer-plugin-asr', 'artplayer-plugin-chromecast'] export const installedTests = [ 'playback.spec.js', 'lifecycle.spec.js', @@ -36,6 +36,13 @@ export const installedTests = [ 'auto-thumbnail.spec.js', 'auto-thumbnail-lifecycle.spec.js', 'auto-thumbnail-pixels.spec.js', + 'asr-audio.spec.js', + 'asr-playback.spec.js', + 'asr-fallback.spec.js', + 'asr-cors.spec.js', + 'asr-capture-cors.spec.js', + 'asr-audio-track.spec.js', + 'chromecast-lifecycle.spec.js', ] export function browserInvocation(scope: string, args: string[], environment: NodeJS.ProcessEnv) { diff --git a/scripts/package-check.mjs b/scripts/package-check.mjs index bd079d4db..5f58a5a28 100644 --- a/scripts/package-check.mjs +++ b/scripts/package-check.mjs @@ -5,8 +5,21 @@ import path from 'node:path' import process from 'node:process' import { fileURLToPath } from 'node:url' import { ensureArchive, hash, readMember } from '../refactor/scripts/releases.mjs' +import { installedPackages } from './browser-validation/scope.ts' import { consumerDirectory, names as defaultNames, readJson, removeConsumer, run, runtimeConsumer, typeConsumers, workspace, writeJson } from './package-consumer.mjs' +export function packageOptions(args) { + assert(args.every(arg => ['--release', '--browser'].includes(arg) || arg.startsWith('--include=')), 'Unknown package-check option') + const includes = args.filter(arg => arg.startsWith('--include=')) + assert(includes.length <= 1 && new Set(args).size === args.length, 'Duplicate package-check option') + const browser = args.includes('--browser') + const release = args.includes('--release') + assert(!browser || (!release && includes.length === 0), 'Browser preparation cannot be combined with release or explicit includes') + const include = browser ? installedPackages.filter(name => !defaultNames.includes(name)) : includes[0]?.slice('--include='.length).split(',') || [] + assert(include.every(Boolean) && new Set(include).size === include.length, 'Empty or duplicate additional package') + return { release, include } +} + export function checkFiles(manifest, files, historical = []) { for (const field of ['main', 'module', 'types', 'legacy']) { assert(typeof manifest[field] === 'string', `Missing ${field}: ${manifest.name}`) @@ -80,6 +93,8 @@ export async function checkPackages({ release = false, include = [] } = {}) { 'artplayer-plugin-hls-control': async () => (await import('../refactor/scripts/hls-contract.mjs')).verifyHlsContract(), 'artplayer-plugin-dash-control': async () => (await import('../refactor/scripts/dash-contract.mjs')).verifyDashContract(), 'artplayer-plugin-auto-thumbnail': async () => (await import('../refactor/scripts/auto-thumbnail-contract.mjs')).verifyAutoThumbnailContract(), + 'artplayer-plugin-asr': async () => (await import('../refactor/scripts/asr-contract.mjs')).verifyAsrContract(), + 'artplayer-plugin-chromecast': async () => (await import('../refactor/scripts/chromecast-contract.mjs')).verifyChromecastContract(), 'artplayer-plugin-audio-track': async () => (await import('../refactor/scripts/audio-contract.mjs')).verifyAudioContract(), 'artplayer-plugin-vtt-thumbnail': async () => (await import('../refactor/scripts/vtt-thumbnail-contract.mjs')).verifyVttThumbnailContract(), 'artplayer-plugin-multiple-subtitles': async () => (await import('../refactor/scripts/multiple-subtitles-contract.mjs')).verifyMultipleSubtitlesContract(), @@ -164,8 +179,7 @@ export async function checkPackages({ release = false, include = [] } = {}) { } if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - const include = process.argv.find(arg => arg.startsWith('--include='))?.slice('--include='.length).split(',') || [] - checkPackages({ release: process.argv.includes('--release'), include }).catch((error) => { + checkPackages(packageOptions(process.argv.slice(2))).catch((error) => { console.error(error) process.exitCode = 1 }) diff --git a/test/browser/asr-audio-track.spec.js b/test/browser/asr-audio-track.spec.js index b6c4a2610..1149b900d 100644 --- a/test/browser/asr-audio-track.spec.js +++ b/test/browser/asr-audio-track.spec.js @@ -1,25 +1,26 @@ import fs from 'node:fs' import process from 'node:process' import { hash } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' let asrCode let audioCode let inputs test.beforeAll(async () => { - expect(process.env.ARTPLAYER_BROWSER_ARTIFACTS, 'These source/explicit artifact checks do not represent isolated installed packages').toBeFalsy() - asrCode = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT, 'utf8') : await compilePackage('artplayer-plugin-asr', 'umd') - audioCode = process.env.ARTPLAYER_AUDIO_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_AUDIO_ARTIFACT, 'utf8') : await compilePackage('artplayer-plugin-audio-track', 'umd') + const asr = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + asrCode = asr.code + const audio = await browserCandidate('artplayer-plugin-audio-track', process.env.ARTPLAYER_AUDIO_ARTIFACT) + audioCode = audio.code const media = fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url)) const manifest = JSON.parse(fs.readFileSync(new URL('./media/audio-tone.json', import.meta.url))) expect(hash(media)).toBe(manifest.sha256) inputs = { - asr: { input: process.env.ARTPLAYER_ASR_ARTIFACT || 'workspace source', sha256: hash(asrCode) }, - audioTrack: { input: process.env.ARTPLAYER_AUDIO_ARTIFACT || 'workspace source', sha256: hash(audioCode) }, + asr: { provenance: asr.provenance, sha256: hash(asrCode) }, + audioTrack: { provenance: audio.provenance, sha256: hash(audioCode) }, media: { file: 'test/browser/media/audio-tone.m4a', sha256: hash(media), bytes: media.length }, recognitionService: false, - scope: 'Native media/WebAudio composition; not physical speaker, device, or isolated package acceptance', + scope: 'Native media/WebAudio composition; not physical speaker or device acceptance', } }) diff --git a/test/browser/asr-audio.spec.js b/test/browser/asr-audio.spec.js index 407675da4..515ce158d 100644 --- a/test/browser/asr-audio.spec.js +++ b/test/browser/asr-audio.spec.js @@ -2,14 +2,17 @@ import fs from 'node:fs' import process from 'node:process' import { verifyAsrContract } from '../../refactor/scripts/asr-contract.mjs' import { hash, readMember } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' let contract +let candidateProvenance let candidateCode test.beforeAll(async () => { contract = await verifyAsrContract() - candidateCode = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT) : await compilePackage('artplayer-plugin-asr', 'umd') + const candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + candidateCode = candidate.code + candidateProvenance = candidate.provenance }) for (const version of ['2.0.0', '2.1.0', 'candidate']) { @@ -18,7 +21,7 @@ for (const version of ['2.0.0', '2.1.0', 'candidate']) { const release = [contract.baseline.release, ...contract.baseline.previous].find(release => release.version === version) const code = version === 'candidate' ? candidateCode : readMember(contract.archives.get(version), 'package/dist/artplayer-plugin-asr.js') const media = fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url)) - await testInfo.attach('asr-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, pluginSha256: hash(code), integrity: release?.integrity || null, candidate: process.env.ARTPLAYER_ASR_ARTIFACT || 'workspace source', mediaSha256: hash(media), media: 'local mono AAC 440 Hz tone', networkService: false }) }) + await testInfo.attach('asr-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, pluginSha256: hash(code), selected: version === 'candidate' ? candidateProvenance : { kind: 'published', version, sha256: hash(code) }, integrity: release?.integrity || null, mediaSha256: hash(media), media: 'local mono AAC 440 Hz tone', networkService: false }) }) await page.goto(`/test/player.html?core=${core}`) const capabilities = await page.evaluate(() => ({ AudioContext: typeof window.AudioContext, webkitAudioContext: typeof window.webkitAudioContext, AudioWorkletNode: typeof window.AudioWorkletNode })) await testInfo.attach('asr-audio-capabilities', { contentType: 'application/json', body: JSON.stringify(capabilities) }) diff --git a/test/browser/asr-capture-cors.spec.js b/test/browser/asr-capture-cors.spec.js index 7f39634a4..bfc3d6331 100644 --- a/test/browser/asr-capture-cors.spec.js +++ b/test/browser/asr-capture-cors.spec.js @@ -1,13 +1,15 @@ import fs from 'node:fs' import process from 'node:process' import { hash } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' +let provenance let code test.beforeAll(async () => { - expect(process.env.ARTPLAYER_BROWSER_ARTIFACTS, 'Explicit source/artifact tests do not represent installed packages').toBeFalsy() - code = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT, 'utf8') : await compilePackage('artplayer-plugin-asr', 'umd') + const candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + code = candidate.code + provenance = candidate.provenance }) test.afterEach(async ({ page }, testInfo) => { @@ -33,7 +35,7 @@ for (const core of ['published', 'candidate']) { }) await page.goto(`/test/player.html?core=${core}`) const capabilities = await page.evaluate(() => ({ context: typeof (window.AudioContext || window.webkitAudioContext), worklet: typeof window.AudioWorkletNode, capture: typeof HTMLMediaElement.prototype.captureStream, mozCapture: typeof HTMLMediaElement.prototype.mozCaptureStream })) - await testInfo.attach('capture-cors-inputs', { contentType: 'application/json', body: JSON.stringify({ core, capabilities, plugin: process.env.ARTPLAYER_ASR_ARTIFACT || 'workspace source', pluginSha256: hash(code), mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), nativeCapture: true, forcedException: false, analyserBinding: false, physicalAudioOutput: false, scope: 'Zero direct bindings and native media clock progression preserve routing; no claim about physical speaker output' }) }) + await testInfo.attach('capture-cors-inputs', { contentType: 'application/json', body: JSON.stringify({ core, capabilities, provenance, pluginSha256: hash(code), mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), nativeCapture: true, forcedException: false, analyserBinding: false, physicalAudioOutput: false, scope: 'Zero direct bindings and native media clock progression preserve routing; no claim about physical speaker output' }) }) if (capabilities.context === 'undefined') { expect(process.platform).toBe('win32') expect(testInfo.project.name).toBe('webkit') diff --git a/test/browser/asr-cors.spec.js b/test/browser/asr-cors.spec.js index 171da4f3d..59acb7b4e 100644 --- a/test/browser/asr-cors.spec.js +++ b/test/browser/asr-cors.spec.js @@ -2,14 +2,17 @@ import fs from 'node:fs' import process from 'node:process' import { verifyAsrContract } from '../../refactor/scripts/asr-contract.mjs' import { hash, readMember } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' let contract +let candidateProvenance let candidateCode test.beforeAll(async () => { contract = await verifyAsrContract() - candidateCode = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT) : await compilePackage('artplayer-plugin-asr', 'umd') + const candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + candidateCode = candidate.code + candidateProvenance = candidate.provenance }) for (const version of ['2.1.0', 'candidate']) { @@ -26,7 +29,7 @@ for (const version of ['2.1.0', 'candidate']) { test.skip(true, 'Windows WebKit lacks native WebAudio; this is not Safari CORS acceptance') } const code = version === 'candidate' ? candidateCode : readMember(contract.archives.get(version), 'package/dist/artplayer-plugin-asr.js') - await testInfo.attach('asr-cors-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, scenario, pluginSha256: hash(code), mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), physicalAudioOutput: false, securityBypass: false }) }) + await testInfo.attach('asr-cors-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, scenario, pluginSha256: hash(code), selected: version === 'candidate' ? candidateProvenance : { kind: 'published', version, sha256: hash(code) }, mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), physicalAudioOutput: false, securityBypass: false }) }) const responses = [] page.on('response', (response) => { if (/\/test\/(?:asr-cors\.m4a|audio-tone\.m4a|asr-opaque-redirect)(?:\?|$)/u.test(response.url())) diff --git a/test/browser/asr-fallback.spec.js b/test/browser/asr-fallback.spec.js index b73215a8b..37a5bfc1a 100644 --- a/test/browser/asr-fallback.spec.js +++ b/test/browser/asr-fallback.spec.js @@ -1,15 +1,17 @@ -import fs from 'node:fs' import process from 'node:process' import { verifyAsrContract } from '../../refactor/scripts/asr-contract.mjs' import { hash, readMember } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' let contract +let candidateProvenance let candidateCode test.beforeAll(async () => { contract = await verifyAsrContract() - candidateCode = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT) : await compilePackage('artplayer-plugin-asr', 'umd') + const candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + candidateCode = candidate.code + candidateProvenance = candidate.provenance }) for (const { version, captureOnly } of [{ version: '2.1.0', captureOnly: false }, { version: 'candidate', captureOnly: false }, { version: 'candidate', captureOnly: true }]) { @@ -19,7 +21,7 @@ for (const { version, captureOnly } of [{ version: '2.1.0', captureOnly: false } await page.goto(`/test/player.html?core=${core}`) const capabilities = await page.evaluate(() => ({ context: typeof AudioContext, worklet: typeof AudioWorkletNode, capture: typeof HTMLMediaElement.prototype.captureStream, mozCapture: typeof HTMLMediaElement.prototype.mozCaptureStream })) const forceRejection = testInfo.project.name === 'firefox' && !captureOnly - await testInfo.attach('asr-fallback-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, captureOnly, pluginSha256: hash(code), capabilities, forcedException: forceRejection, reason: captureOnly ? 'Explicit capture mode never binds the element; no forced exceptions' : forceRejection ? 'Firefox permits a second native media source; force only binding rejection to reach real captureStream/Worklet' : 'Native duplicate binding rejection', externalContext: 'Native media-element source remains owned and running', physicalOutput: false }) }) + await testInfo.attach('asr-fallback-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, captureOnly, pluginSha256: hash(code), selected: version === 'candidate' ? candidateProvenance : { kind: 'published', version, sha256: hash(code) }, capabilities, forcedException: forceRejection, reason: captureOnly ? 'Explicit capture mode never binds the element; no forced exceptions' : forceRejection ? 'Firefox permits a second native media source; force only binding rejection to reach real captureStream/Worklet' : 'Native duplicate binding rejection', externalContext: 'Native media-element source remains owned and running', physicalOutput: false }) }) if (capabilities.context !== 'function') { expect(process.platform).toBe('win32') expect(testInfo.project.name).toBe('webkit') diff --git a/test/browser/asr-playback.spec.js b/test/browser/asr-playback.spec.js index 93be9e59f..dd70cf2ac 100644 --- a/test/browser/asr-playback.spec.js +++ b/test/browser/asr-playback.spec.js @@ -2,14 +2,17 @@ import fs from 'node:fs' import process from 'node:process' import { verifyAsrContract } from '../../refactor/scripts/asr-contract.mjs' import { hash, readMember } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' let contract +let candidateProvenance let candidateCode test.beforeAll(async () => { contract = await verifyAsrContract() - candidateCode = process.env.ARTPLAYER_ASR_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_ASR_ARTIFACT) : await compilePackage('artplayer-plugin-asr', 'umd') + const candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) + candidateCode = candidate.code + candidateProvenance = candidate.provenance }) for (const version of ['2.1.0', 'candidate']) { @@ -23,7 +26,7 @@ for (const version of ['2.1.0', 'candidate']) { expect(testInfo.project.name).toBe('webkit') test.skip(true, 'Windows WebKit lacks native AudioContext/AudioWorkletNode') } - await testInfo.attach('asr-playback-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, pluginSha256: hash(code), mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), meter: 'Native unity analyser inserted between plugin gain and destination', physicalAudioOutput: false }) }) + await testInfo.attach('asr-playback-inputs', { contentType: 'application/json', body: JSON.stringify({ version, core, pluginSha256: hash(code), selected: version === 'candidate' ? candidateProvenance : { kind: 'published', version, sha256: hash(code) }, mediaSha256: hash(fs.readFileSync(new URL('./media/audio-tone.m4a', import.meta.url))), meter: 'Native unity analyser inserted between plugin gain and destination', physicalAudioOutput: false }) }) await page.addScriptTag({ content: code.toString() }) await page.evaluate(() => { const NativeContext = window.AudioContext diff --git a/test/browser/chromecast-lifecycle.spec.js b/test/browser/chromecast-lifecycle.spec.js index 462d5e941..d1b9b26c7 100644 --- a/test/browser/chromecast-lifecycle.spec.js +++ b/test/browser/chromecast-lifecycle.spec.js @@ -1,14 +1,14 @@ -import fs from 'node:fs' import process from 'node:process' import { hash } from '../../refactor/scripts/releases.mjs' -import { compilePackage } from '../helpers/load.js' +import { browserCandidate } from '../helpers/browser-candidate.js' import { expect, test } from './fixtures.js' +let provenance let candidate test.beforeAll(async () => { - candidate = process.env.ARTPLAYER_CHROMECAST_ARTIFACT - ? fs.readFileSync(process.env.ARTPLAYER_CHROMECAST_ARTIFACT, 'utf8') - : await compilePackage('artplayer-plugin-chromecast', 'umd') + const input = await browserCandidate('artplayer-plugin-chromecast', process.env.ARTPLAYER_CHROMECAST_ARTIFACT) + candidate = input.code + provenance = input.provenance }) async function setup(page, core, testInfo, loaded = true) { @@ -112,7 +112,7 @@ async function setup(page, core, testInfo, loaded = true) { } }, loaded) await expect.poll(() => page.evaluate(() => window.castPlayers.every(art => art.isReady))).toBe(true) - await testInfo.attach('chromecast-controlled-browser-inputs', { contentType: 'application/json', body: JSON.stringify({ core, artifact: process.env.ARTPLAYER_CHROMECAST_ARTIFACT || 'candidate source', sha256: hash(candidate), sdk: 'controlled stub; no receiver, discovery, real SDK or Cast media playback acceptance', native: 'ArtPlayer core, DOM controls, browser click dispatch and local video' }) }) + await testInfo.attach('chromecast-controlled-browser-inputs', { contentType: 'application/json', body: JSON.stringify({ core, provenance, sha256: hash(candidate), sdk: 'controlled stub; no receiver, discovery, real SDK or Cast media playback acceptance', native: 'ArtPlayer core, DOM controls, browser click dispatch and local video' }) }) return external } diff --git a/test/package-check.test.js b/test/package-check.test.js index 5b6ce574d..c343819c3 100644 --- a/test/package-check.test.js +++ b/test/package-check.test.js @@ -4,7 +4,8 @@ import path from 'node:path' import process from 'node:process' // eslint-disable-next-line test/no-import-node-test -- This fixture exercises the repository's Node test runner. import { test } from 'node:test' -import { checkFiles, checkPackages, publishedConsumer } from '../scripts/package-check.mjs' +import { installedPackages } from '../scripts/browser-validation/scope.ts' +import { checkFiles, checkPackages, packageOptions, publishedConsumer } from '../scripts/package-check.mjs' import { removeConsumer, runtimeConsumer } from '../scripts/package-consumer.mjs' import { emitterContracts } from './contracts/emitter.js' import { ambilightCandidate } from './helpers/ambilight.js' @@ -15,6 +16,15 @@ import { dpipCandidate } from './helpers/dpip.js' import { multipleSubtitlesCandidate } from './helpers/multiple-subtitles.js' import { vttThumbnailCandidate } from './helpers/vtt-thumbnail.js' +test('Package CLI keeps legacy defaults and prepares the same roster the browser requires', () => { + assert.deepEqual(packageOptions([]), { release: false, include: [] }) + assert.deepEqual(packageOptions(['--release']), { release: true, include: [] }) + assert.deepEqual(packageOptions(['--include=artplayer-plugin-asr']), { release: false, include: ['artplayer-plugin-asr'] }) + assert.deepEqual(['artplayer', 'artplayer-plugin-chapter', ...packageOptions(['--browser']).include], installedPackages) + for (const args of [['--browser', '--release'], ['--browser', '--include=artplayer-plugin-asr'], ['--broser'], ['--include='], ['--include=x,x'], ['--include=x', '--include=y'], ['--browser', '--browser']]) + assert.throws(() => packageOptions(args)) +}) + test('Additional browser packages cannot be mistaken for full release consumer acceptance', async () => { await assert.rejects(checkPackages({ release: true, include: ['artplayer-plugin-ambilight'] }), /not full release acceptance/) }) @@ -41,7 +51,7 @@ test('Explicit installed plugin maps never fall back to source or frozen workspa delete process.env.ARTPLAYER_AUTO_THUMBNAIL_BASELINE process.env.ARTPLAYER_AUTO_THUMBNAIL_ARTIFACT = 'override.js' await assert.rejects(autoThumbnailCandidate(), /cannot override artplayer-plugin-auto-thumbnail artifact/) - for (const name of ['artplayer-plugin-hls-control', 'artplayer-plugin-dash-control']) { + for (const name of ['artplayer-plugin-hls-control', 'artplayer-plugin-dash-control', 'artplayer-plugin-asr', 'artplayer-plugin-chromecast']) { await assert.rejects(browserCandidate(name), { code: 'ENOENT' }) await assert.rejects(browserCandidate(name, 'override.js'), new RegExp(`cannot override ${name} artifact`)) } diff --git a/test/package/README.md b/test/package/README.md index bb12b01a4..9e571636d 100644 --- a/test/package/README.md +++ b/test/package/README.md @@ -9,8 +9,8 @@ step through `ARTPLAYER_BROWSER_ARTIFACTS`. See browser scope and the remaining package-specific release gates. Run `yarn test:package` with the pinned Node and Yarn after a frozen install. The -default consumer scope is core and chapter. For Ambilight/Canvas/Document PiP/Ads/Audio Track/VTT Thumbnail/Multiple Subtitles/HLS Control/DASH Control/Auto Thumbnail browser work, -run `yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas,artplayer-plugin-document-pip,artplayer-plugin-ads,artplayer-plugin-audio-track,artplayer-plugin-vtt-thumbnail,artplayer-plugin-multiple-subtitles,artplayer-plugin-hls-control,artplayer-plugin-dash-control,artplayer-plugin-auto-thumbnail`. +default consumer scope is core and chapter. For the shared installed browser scope, +run `yarn test:package --browser`. These four additional packages have reviewed published contracts and use the same source snapshot/build/pack/offline-install/frozen-reinstall pipeline. Installed files are copied only after archive hash checks. The report explicitly separates @@ -97,3 +97,7 @@ bundles or contradictory frozen-workspace flags fail instead of rebuilding sourc removed historical files, then deliberately removes an actual published default export and required entry in an isolated consumer to prove runtime failures are detected. It is part of `yarn test:node`. + +The --browser option follows the shared installed browser roster automatically; +do not copy a manual package list into CI. Explicit --include remains supported +for a deliberate subset. --browser cannot combine with --include or --release.