diff --git a/docs/compiled/artplayer-plugin-asr.js b/docs/compiled/artplayer-plugin-asr.js index d3b1b4ace..fa9e94228 100644 --- a/docs/compiled/artplayer-plugin-asr.js +++ b/docs/compiled/artplayer-plugin-asr.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";class t{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}async initialize(){this.assertOpen();const t=window,e=window.AudioContext||t.webkitAudioContext;if(!e)throw new Error("AudioContext is not supported");const i=this.context??(this.context=new e({sampleRate:this.sampleRate}));if("suspended"===i.state&&await i.resume(),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{await i.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=i.createMediaElementSource(this.video),this.direct=!0}catch(s){console.warn("[artplayerPluginAsr] Direct connection failed:",s)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=i.createMediaStreamSource(this.stream)}}}prepare(){return this.preparation??(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const r=this.gain=s||e.createGain();s||(r.gain.value=this.direct?1:0);const n=this.recorder=new AudioWorkletNode(e,"recorder-processor");n.port.onmessage=e=>{this.closed||this.recorder!==n||t(e.data)},i.connect(n),this.direct?i.connect(r):n.connect(r),r.connect(e.destination)}disconnect(){this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),this.gain?.disconnect(),this.gain=void 0,this.source?.disconnect()}async close(){if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),this.stream?.getTracks().forEach(t=>t.stop()),this.stream=void 0;const t=this.context;this.context=void 0,this.source=void 0,t&&"closed"!==t.state&&await t.close()}}class e{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const e=this.epoch,i=()=>!this.terminal&&this.epoch===e,s=(async()=>{if(await this.closing,!i())return;const{sampleRate:e,interval:s}=this.options,r=Math.floor(e*s/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(s)||s<=0)throw new Error("Audio chunk length must be positive and finite");const n=this.graph??(this.graph=new t(this.video,e,this.options.captureOnly));await n.prepare(),i()?(n.connect(t=>{if(this.running&&this.graph===n)return this.queue.length+t.length>Math.max(60*e,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),s)):this.running||this.graph!==n||n.idle()})().catch(async t=>{i()&&(console.error("[artplayerPluginAsr] Initialization failed:",t),await this.stop())}).finally(()=>{this.starting===s&&(this.starting=void 0)});return this.starting=s,s}async tick(t){if(!this.running||this.pending)return;const e=this.queue.take(t);if(!e)return;const i=this.epoch,s=this.pending={};try{const t=await this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function s(t={}){const{length:e=3,interval:s=100,sampleRate:r=16e3,autoHideTimeout:n=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===a?.type;return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const c=function(t,e,i){let s,r=!1;function n(){clearTimeout(s),s=void 0}function o(){r||(t.style.display="none")}return{append:function(a){r||"string"!==typeof a||(n(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(/(?<=[\u3001\u3002\uff01\uff1f!?.])\s*/u).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){r=!0,n()}}}(a,e,n),l=new i(t.video,{interval:s,sampleRate:r,onAudioChunk:o,captureOnly:h},c.append),d=()=>l.start(),p=()=>l.pause(),u=()=>l.restart(),f=()=>(c.destroy(),t.off("play",d),t.off("pause",p),t.off("restart",u),t.off("destroy",f),l.stop(!0));return t.on("play",d),t.on("pause",p),t.on("restart",u),t.on("destroy",f),{name:"artplayerPluginAsr",stop:()=>l.stop(),hide:c.hide,append:c.append}}}if(Object.defineProperty(s,"default",{value:s}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return s}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";class t{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}async initialize(){this.assertOpen();const t=window,e=window.AudioContext||t.webkitAudioContext;if(!e)throw new Error("AudioContext is not supported");const i=this.context??(this.context=new e({sampleRate:this.sampleRate}));if("suspended"===i.state&&await i.resume(),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{await i.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=i.createMediaElementSource(this.video),this.direct=!0}catch(s){console.warn("[artplayerPluginAsr] Direct connection failed:",s)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=i.createMediaStreamSource(this.stream)}}}prepare(){return this.preparation??(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const r=this.gain=s||e.createGain();s||(r.gain.value=this.direct?1:0);const n=this.recorder=new AudioWorkletNode(e,"recorder-processor");n.port.onmessage=e=>{this.closed||this.recorder!==n||t(e.data)},i.connect(n),this.direct?i.connect(r):n.connect(r),r.connect(e.destination)}disconnect(){this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),this.gain?.disconnect(),this.gain=void 0,this.source?.disconnect()}async close(){if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),this.stream?.getTracks().forEach(t=>t.stop()),this.stream=void 0;const t=this.context;this.context=void 0,this.source=void 0,t&&"closed"!==t.state&&await t.close()}}class e{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const e=this.epoch,i=()=>!this.terminal&&this.epoch===e,s=(async()=>{if(await this.closing,!i())return;const{sampleRate:e,interval:s}=this.options,r=Math.floor(e*s/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(s)||s<=0)throw new Error("Audio chunk length must be positive and finite");const n=this.graph??(this.graph=new t(this.video,e,this.options.captureOnly));await n.prepare(),i()?(n.connect(t=>{if(this.running&&this.graph===n)return this.queue.length+t.length>Math.max(60*e,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),s)):this.running||this.graph!==n||n.idle()})().catch(async t=>{i()&&(console.error("[artplayerPluginAsr] Initialization failed:",t),await this.stop())}).finally(()=>{this.starting===s&&(this.starting=void 0)});return this.starting=s,s}async tick(t){if(!this.running||this.pending)return;const e=this.queue.take(t);if(!e)return;const i=this.epoch,s=this.pending={};try{const t=await this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function s(t={}){const{length:e=3,interval:s=100,sampleRate:r=16e3,autoHideTimeout:n=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===a?.type;return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const c=function(t,e,i){let s,r=!1;function n(){clearTimeout(s),s=void 0}function o(){r||(t.style.display="none")}return{append:function(a){r||"string"!==typeof a||(n(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(/(?<=[\u3001\u3002\uff01\uff1f!?.])\s*/u).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){r=!0,n()}}}(a,e,n),l=new i(t.video,{interval:s,sampleRate:r,onAudioChunk:o,captureOnly:h},c.append),d=()=>l.start(),p=()=>l.pause(),u=()=>l.restart(),f=()=>l.stop(),g=()=>(c.destroy(),t.off("play",d),t.off("pause",p),t.off("restart",u),t.off("video:error",f),t.off("destroy",g),l.stop(!0));return t.on("play",d),t.on("pause",p),t.on("restart",u),t.on("video:error",f),t.on("destroy",g),{name:"artplayerPluginAsr",stop:f,hide:c.hide,append:c.append}}}if(Object.defineProperty(s,"default",{value:s}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return s}); diff --git a/docs/compiled/artplayer-plugin-asr.legacy.js b/docs/compiled/artplayer-plugin-asr.legacy.js index 53ad308e2..a0f44ac8e 100644 --- a/docs/compiled/artplayer-plugin-asr.legacy.js +++ b/docs/compiled/artplayer-plugin-asr.legacy.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";var t=(t,e,i)=>new Promise((s,n)=>{var r=t=>{try{a(i.next(t))}catch(e){n(e)}},o=t=>{try{a(i.throw(t))}catch(e){n(e)}},a=t=>t.done?s(t.value):Promise.resolve(t.value).then(r,o);a((i=i.apply(t,e)).next())});class e{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}initialize(){return t(this,null,function*(){var t;this.assertOpen();const e=window,i=window.AudioContext||e.webkitAudioContext;if(!i)throw new Error("AudioContext is not supported");const s=null!=(t=this.context)?t:this.context=new i({sampleRate:this.sampleRate});if("suspended"===s.state&&(yield s.resume()),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{yield s.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=s.createMediaElementSource(this.video),this.direct=!0}catch(n){console.warn("[artplayerPluginAsr] Direct connection failed:",n)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=s.createMediaStreamSource(this.stream)}}})}prepare(){return null!=this.preparation||(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const n=this.gain=s||e.createGain();s||(n.gain.value=this.direct?1:0);const r=this.recorder=new AudioWorkletNode(e,"recorder-processor");r.port.onmessage=e=>{this.closed||this.recorder!==r||t(e.data)},i.connect(r),this.direct?i.connect(n):r.connect(n),n.connect(e.destination)}disconnect(){var t,e;this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),null==(t=this.gain)||t.disconnect(),this.gain=void 0,null==(e=this.source)||e.disconnect()}close(){return t(this,null,function*(){var t;if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),null==(t=this.stream)||t.getTracks().forEach(t=>t.stop()),this.stream=void 0;const e=this.context;this.context=void 0,this.source=void 0,e&&"closed"!==e.state&&(yield e.close())})}}class i{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const i=this.epoch,s=()=>!this.terminal&&this.epoch===i,n=(()=>t(this,null,function*(){var t;if(yield this.closing,!s())return;const{sampleRate:i,interval:n}=this.options,r=Math.floor(i*n/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(n)||n<=0)throw new Error("Audio chunk length must be positive and finite");const o=null!=(t=this.graph)?t:this.graph=new e(this.video,i,this.options.captureOnly);yield o.prepare(),s()?(o.connect(t=>{if(this.running&&this.graph===o)return this.queue.length+t.length>Math.max(60*i,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),n)):this.running||this.graph!==o||o.idle()}))().catch(e=>t(this,null,function*(){s()&&(console.error("[artplayerPluginAsr] Initialization failed:",e),yield this.stop())})).finally(()=>{this.starting===n&&(this.starting=void 0)});return this.starting=n,n}tick(e){return t(this,null,function*(){if(!this.running||this.pending)return;const t=this.queue.take(e);if(!t)return;const i=this.epoch,s=this.pending={};try{const e=yield this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function n(t={}){const{length:e=3,interval:i=100,sampleRate:n=16e3,autoHideTimeout:r=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===(null==a?void 0:a.type);return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const l=function(t,e,i){let s,n=!1;function r(){clearTimeout(s),s=void 0}function o(){n||(t.style.display="none")}return{append:function(a){n||"string"!==typeof a||(r(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(new RegExp("(?<=[\u3001\u3002\uff01\uff1f!?.])\\s*","u")).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){n=!0,r()}}}(a,e,r),c=new s(t.video,{interval:i,sampleRate:n,onAudioChunk:o,captureOnly:h},l.append),d=()=>c.start(),u=()=>c.pause(),p=()=>c.restart(),f=()=>(l.destroy(),t.off("play",d),t.off("pause",u),t.off("restart",p),t.off("destroy",f),c.stop(!0));return t.on("play",d),t.on("pause",u),t.on("restart",p),t.on("destroy",f),{name:"artplayerPluginAsr",stop:()=>c.stop(),hide:l.hide,append:l.append}}}if(Object.defineProperty(n,"default",{value:n}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return n}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";var t=(t,e,i)=>new Promise((s,n)=>{var r=t=>{try{a(i.next(t))}catch(e){n(e)}},o=t=>{try{a(i.throw(t))}catch(e){n(e)}},a=t=>t.done?s(t.value):Promise.resolve(t.value).then(r,o);a((i=i.apply(t,e)).next())});class e{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}initialize(){return t(this,null,function*(){var t;this.assertOpen();const e=window,i=window.AudioContext||e.webkitAudioContext;if(!i)throw new Error("AudioContext is not supported");const s=null!=(t=this.context)?t:this.context=new i({sampleRate:this.sampleRate});if("suspended"===s.state&&(yield s.resume()),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{yield s.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=s.createMediaElementSource(this.video),this.direct=!0}catch(n){console.warn("[artplayerPluginAsr] Direct connection failed:",n)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=s.createMediaStreamSource(this.stream)}}})}prepare(){return null!=this.preparation||(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const n=this.gain=s||e.createGain();s||(n.gain.value=this.direct?1:0);const r=this.recorder=new AudioWorkletNode(e,"recorder-processor");r.port.onmessage=e=>{this.closed||this.recorder!==r||t(e.data)},i.connect(r),this.direct?i.connect(n):r.connect(n),n.connect(e.destination)}disconnect(){var t,e;this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),null==(t=this.gain)||t.disconnect(),this.gain=void 0,null==(e=this.source)||e.disconnect()}close(){return t(this,null,function*(){var t;if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),null==(t=this.stream)||t.getTracks().forEach(t=>t.stop()),this.stream=void 0;const e=this.context;this.context=void 0,this.source=void 0,e&&"closed"!==e.state&&(yield e.close())})}}class i{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const i=this.epoch,s=()=>!this.terminal&&this.epoch===i,n=(()=>t(this,null,function*(){var t;if(yield this.closing,!s())return;const{sampleRate:i,interval:n}=this.options,r=Math.floor(i*n/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(n)||n<=0)throw new Error("Audio chunk length must be positive and finite");const o=null!=(t=this.graph)?t:this.graph=new e(this.video,i,this.options.captureOnly);yield o.prepare(),s()?(o.connect(t=>{if(this.running&&this.graph===o)return this.queue.length+t.length>Math.max(60*i,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),n)):this.running||this.graph!==o||o.idle()}))().catch(e=>t(this,null,function*(){s()&&(console.error("[artplayerPluginAsr] Initialization failed:",e),yield this.stop())})).finally(()=>{this.starting===n&&(this.starting=void 0)});return this.starting=n,n}tick(e){return t(this,null,function*(){if(!this.running||this.pending)return;const t=this.queue.take(e);if(!t)return;const i=this.epoch,s=this.pending={};try{const e=yield this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function n(t={}){const{length:e=3,interval:i=100,sampleRate:n=16e3,autoHideTimeout:r=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===(null==a?void 0:a.type);return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const l=function(t,e,i){let s,n=!1;function r(){clearTimeout(s),s=void 0}function o(){n||(t.style.display="none")}return{append:function(a){n||"string"!==typeof a||(r(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(new RegExp("(?<=[\u3001\u3002\uff01\uff1f!?.])\\s*","u")).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){n=!0,r()}}}(a,e,r),c=new s(t.video,{interval:i,sampleRate:n,onAudioChunk:o,captureOnly:h},l.append),d=()=>c.start(),u=()=>c.pause(),p=()=>c.restart(),f=()=>c.stop(),g=()=>(l.destroy(),t.off("play",d),t.off("pause",u),t.off("restart",p),t.off("video:error",f),t.off("destroy",g),c.stop(!0));return t.on("play",d),t.on("pause",u),t.on("restart",p),t.on("video:error",f),t.on("destroy",g),{name:"artplayerPluginAsr",stop:f,hide:l.hide,append:l.append}}}if(Object.defineProperty(n,"default",{value:n}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return n}); diff --git a/docs/compiled/artplayer-plugin-asr.mjs b/docs/compiled/artplayer-plugin-asr.mjs index baa8911a1..fbae88cbe 100644 --- a/docs/compiled/artplayer-plugin-asr.mjs +++ b/docs/compiled/artplayer-plugin-asr.mjs @@ -379,12 +379,14 @@ function artplayerPluginAsr(option = {}) { art.off("play", play); art.off("pause", pause); art.off("restart", restart); + art.off("video:error", stop); art.off("destroy", destroy); return capture.stop(true); }; art.on("play", play); art.on("pause", pause); art.on("restart", restart); + art.on("video:error", stop); art.on("destroy", destroy); return { name: "artplayerPluginAsr", stop, hide: subtitles.hide, append: subtitles.append }; }; diff --git a/package.json b/package.json index 892ab2b54..a99de83f7 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "ci:build": "yarn build:types && yarn build all && yarn build:i18n && yarn build:ts && yarn build:llm && yarn build:vconsole && yarn build:console && yarn build:site-notices && yarn build:test && yarn build:docs && yarn test:imports", "test:imports": "node --test test/esm.test.js test/i18n.test.js test/ssr.test.js test/asr-distribution.test.js", "typecheck": "node scripts/typecheck.mjs", - "test:unit": "node --test test/danmuku-setting.test.js test/danmuku-heatmap.test.js test/danmuku-renderer.test.js test/danmuku-scheduler.test.js test/danmuku-worker-client.test.js test/danmuku-input.test.js test/danmuku-parser.test.js test/danmuku-failures.test.js test/danmuku-mask-failures.test.js test/danmuku-mask-lifecycle.test.js test/asr-encoding.test.js test/asr-lifecycle.test.js test/asr-audio.test.js test/asr.test.js test/jassub.test.js test/jassub-registration.test.js test/jassub-runtime.test.js test/jassub-vendor-lifecycle.test.js test/jassub-frame-polyfill.test.js test/jassub-offscreen.test.js test/multiple-subtitles-ass.test.js test/multiple-subtitles-caption.test.js test/multiple-subtitles-merge.test.js test/multiple-subtitles-entities.test.js test/multiple-subtitles-lifecycle.test.js test/multiple-subtitles-failures.test.js test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js test/vtt-thumbnail-parser.test.js test/vtt-thumbnail-lifecycle.test.js test/vtt-thumbnail.test.js test/auto-thumbnail-exports.test.js test/auto-thumbnail-canvas.test.js test/auto-thumbnail-frames.test.js test/auto-thumbnail-encoding.test.js test/auto-thumbnail-metadata.test.js test/auto-thumbnail-lifecycle.test.js test/auto-thumbnail.test.js test/thumbnail-emitter.test.js test/thumbnail-runtime.test.js test/thumbnail-vendor.test.js test/thumbnail-lifecycle.test.js test/thumbnail-input.test.js test/thumbnail.test.js test/iframe-navigation.test.js test/iframe-boundaries.test.js test/iframe-lifecycle.test.js test/iframe.test.js test/mediabunny.test.js test/mediabunny-shim.test.js test/mediabunny-coordination.test.js test/mediabunny-video.test.js test/mediabunny-audio.test.js test/mediabunny-hls.test.js test/mediabunny-entry.test.js test/mediabunny-capability.test.js test/mediabunny-load.test.js test/mediabunny-input.test.js test/dpip.test.js test/dpip-lifecycle.test.js test/canvas.test.js test/canvas-lifecycle.test.js test/ambilight.test.js test/ambilight-lifecycle.test.js test/ambilight-proxy.test.js test/vast-exports.test.js test/vast.test.js test/vast-lifecycle.test.js test/vast-compatibility.test.js test/ads.test.js test/ads-lifecycle.test.js test/playback.test.js test/dash-control.test.js test/dash-contract.test.js test/dash-lifecycle.test.js test/dash-events.test.js test/hls-control.test.js test/audio-track.test.js test/public-behavior.test.js test/helpers.test.js test/chapter.test.js test/utils.test.js test/resource-scope.test.js test/instance-lifecycle.test.js test/options.test.js test/media-hosts.test.js test/plugins.test.js test/source.test.js test/playback-properties.test.js test/media-events.test.js test/template-resources.test.js test/core-vendor.test.js test/component-resources.test.js test/setting-model.test.js test/setting-layout.test.js test/setting-resources.test.js test/subtitle.test.js test/display-native.test.js test/display-video-fullscreen.test.js test/display-pip.test.js test/display-mini.test.js test/display-sizing.test.js test/display-orientation.test.js test/hotkey.test.js test/listener-registry.test.js test/global-events.test.js test/pointer-events.test.js test/gesture.test.js test/event-scheduling.test.js test/notice.test.js test/fast-forward.test.js test/auto-playback.test.js test/builtin-layers.test.js test/prompt-components.test.js test/screenshot.test.js test/thumbnails.test.js test/progress.test.js test/environment.test.js test/storage.test.js test/facade-properties.test.js test/dom-boundaries.test.js test/initialization.test.js test/entry.test.js test/accessibility-button.test.js test/accessibility-focus.test.js test/accessibility-slider.test.js test/asr-fallback-routing.test.js test/asr-local-example.test.js test/asr-explicit-capture.test.js test/chromecast.test.js test/chromecast-failures.test.js test/chromecast-runtime.test.js", + "test:unit": "node --test test/danmuku-setting.test.js test/danmuku-heatmap.test.js test/danmuku-renderer.test.js test/danmuku-scheduler.test.js test/danmuku-worker-client.test.js test/danmuku-input.test.js test/danmuku-parser.test.js test/danmuku-failures.test.js test/danmuku-mask-failures.test.js test/danmuku-mask-lifecycle.test.js test/asr-encoding.test.js test/asr-lifecycle.test.js test/asr-audio.test.js test/asr.test.js test/jassub.test.js test/jassub-registration.test.js test/jassub-runtime.test.js test/jassub-vendor-lifecycle.test.js test/jassub-frame-polyfill.test.js test/jassub-offscreen.test.js test/multiple-subtitles-ass.test.js test/multiple-subtitles-caption.test.js test/multiple-subtitles-merge.test.js test/multiple-subtitles-entities.test.js test/multiple-subtitles-lifecycle.test.js test/multiple-subtitles-failures.test.js test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js test/vtt-thumbnail-parser.test.js test/vtt-thumbnail-lifecycle.test.js test/vtt-thumbnail.test.js test/auto-thumbnail-exports.test.js test/auto-thumbnail-canvas.test.js test/auto-thumbnail-frames.test.js test/auto-thumbnail-encoding.test.js test/auto-thumbnail-metadata.test.js test/auto-thumbnail-lifecycle.test.js test/auto-thumbnail.test.js test/thumbnail-emitter.test.js test/thumbnail-runtime.test.js test/thumbnail-vendor.test.js test/thumbnail-lifecycle.test.js test/thumbnail-input.test.js test/thumbnail.test.js test/iframe-navigation.test.js test/iframe-boundaries.test.js test/iframe-lifecycle.test.js test/iframe.test.js test/mediabunny.test.js test/mediabunny-shim.test.js test/mediabunny-coordination.test.js test/mediabunny-video.test.js test/mediabunny-audio.test.js test/mediabunny-hls.test.js test/mediabunny-entry.test.js test/mediabunny-capability.test.js test/mediabunny-load.test.js test/mediabunny-input.test.js test/dpip.test.js test/dpip-lifecycle.test.js test/canvas.test.js test/canvas-lifecycle.test.js test/ambilight.test.js test/ambilight-lifecycle.test.js test/ambilight-proxy.test.js test/vast-exports.test.js test/vast.test.js test/vast-lifecycle.test.js test/vast-compatibility.test.js test/ads.test.js test/ads-lifecycle.test.js test/playback.test.js test/dash-control.test.js test/dash-contract.test.js test/dash-lifecycle.test.js test/dash-events.test.js test/hls-control.test.js test/audio-track.test.js test/public-behavior.test.js test/helpers.test.js test/chapter.test.js test/utils.test.js test/resource-scope.test.js test/instance-lifecycle.test.js test/options.test.js test/media-hosts.test.js test/plugins.test.js test/source.test.js test/playback-properties.test.js test/media-events.test.js test/template-resources.test.js test/core-vendor.test.js test/component-resources.test.js test/setting-model.test.js test/setting-layout.test.js test/setting-resources.test.js test/subtitle.test.js test/display-native.test.js test/display-video-fullscreen.test.js test/display-pip.test.js test/display-mini.test.js test/display-sizing.test.js test/display-orientation.test.js test/hotkey.test.js test/listener-registry.test.js test/global-events.test.js test/pointer-events.test.js test/gesture.test.js test/event-scheduling.test.js test/notice.test.js test/fast-forward.test.js test/auto-playback.test.js test/builtin-layers.test.js test/prompt-components.test.js test/screenshot.test.js test/thumbnails.test.js test/progress.test.js test/environment.test.js test/storage.test.js test/facade-properties.test.js test/dom-boundaries.test.js test/initialization.test.js test/entry.test.js test/accessibility-button.test.js test/accessibility-focus.test.js test/accessibility-slider.test.js test/asr-fallback-routing.test.js test/asr-local-example.test.js test/asr-explicit-capture.test.js test/chromecast.test.js test/chromecast-failures.test.js test/chromecast-runtime.test.js test/asr-media-error.test.js", "test:coverage": "node --test test/coverage.test.js && node scripts/coverage.mjs", "test": "yarn test:node && yarn test:baseline", "test:browser": "playwright test", @@ -98,7 +98,7 @@ "check:ci": "node refactor/scripts/ci-workflow.mjs", "test:ci": "node --test test/ci-summary.test.js refactor/scripts/ci-workflow.test.mjs refactor/scripts/impact.test.mjs test/package-runtime.test.js test/pages-artifact.test.js", "test:package:runtime": "node scripts/package-runtime.mjs --canonical", - "test:asr": "node --test test/asr.test.js test/asr-audio.test.js test/asr-encoding.test.js test/asr-lifecycle.test.js test/asr-distribution.test.js test/asr-fallback-routing.test.js test/asr-local-example.test.js test/asr-explicit-capture.test.js", + "test:asr": "node --test test/asr.test.js test/asr-audio.test.js test/asr-encoding.test.js test/asr-lifecycle.test.js test/asr-distribution.test.js test/asr-fallback-routing.test.js test/asr-local-example.test.js test/asr-explicit-capture.test.js test/asr-media-error.test.js", "test:asr-types-package": "node refactor/scripts/asr-package-types.mjs", "test:asr-demo": "node refactor/scripts/asr-local-demo.mjs", "test:chromecast": "node --test test/chromecast.test.js test/chromecast-failures.test.js test/chromecast-runtime.test.js", diff --git a/packages/artplayer-plugin-asr/ARCHITECTURE.md b/packages/artplayer-plugin-asr/ARCHITECTURE.md index 4cdbb78f1..c46abc614 100644 --- a/packages/artplayer-plugin-asr/ARCHITECTURE.md +++ b/packages/artplayer-plugin-asr/ARCHITECTURE.md @@ -29,6 +29,13 @@ Rejections are logged and later ticks continue. Pause, source restart, stop and destroy invalidate old recognizer completions and discard obsolete queued audio. Each recorder also checks its own identity, rejecting messages from retired ports. +`video:error` uses the same nonterminal stop path. Native source changes or decode +failures can emit an error without a pause event, so pause alone cannot cancel old +recognition. Error handling clears the queue/timer and invalidates pending results, +closes captured graphs, and keeps an existing direct connection available for later +playback. Existing subtitles retain their auto-hide deadline. Destroy also removes +this error listener; a later play can initialize or reconnect normally. + Pause detaches the recorder and cancels the interval. The direct media source continues through its playback gain to the destination. A source switch reuses the direct source and replaces the recorder; a captured-stream fallback is closed and @@ -162,7 +169,7 @@ recognizer service as a prerequisite for local audio verification. ## Shared installed browser validation -Seven 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, video-only input recovery, volume/mute and ownership. Deliberately forced Firefox binding rejection remains labeled; no recognition service or physical speaker output is claimed. +Eight 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, video-only input recovery, 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 @@ -186,3 +193,11 @@ It does not prove speaker output, malformed-media recovery, Safari or device support. Run `yarn test:browser asr-no-audio.spec.js --workers=1` for source mode; the same file is included in the installed CI roster. WebAudio capability skips remain visible and cannot be counted as audio processing passes. + +`asr-media-error.spec.js` holds a caller recognition Promise after real nonzero PCM, +assigns non-media HTTP content through public `art.video.src`, waits for the native +MediaError, then completes that old Promise. It verifies that obsolete subtitles +are rejected and normal audio recognition resumes on a valid source. It does not +simulate a network outage or every decoder error. `test/asr-media-error.test.js` +also covers errors during Worklet loading and delayed capture closure. Both are +required when changing capture cancellation or error listener ownership. diff --git a/packages/artplayer-plugin-asr/README.md b/packages/artplayer-plugin-asr/README.md index ff0bdf353..45d05ad5a 100644 --- a/packages/artplayer-plugin-asr/README.md +++ b/packages/artplayer-plugin-asr/README.md @@ -84,6 +84,10 @@ root and `/legacy` option declarations remain unchanged. ## Maintenance +A media error stops recognition and ignores pending results from the failed source. +Existing subtitles keep their auto-hide behavior; playback of a valid source can +resume recognition. ASR does not cancel a caller's own network request. + See [ARCHITECTURE.md](ARCHITECTURE.md) for the current audio flow, public behavior, known migration gaps and test commands. diff --git a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.js b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.js index d3b1b4ace..fa9e94228 100644 --- a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.js +++ b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";class t{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}async initialize(){this.assertOpen();const t=window,e=window.AudioContext||t.webkitAudioContext;if(!e)throw new Error("AudioContext is not supported");const i=this.context??(this.context=new e({sampleRate:this.sampleRate}));if("suspended"===i.state&&await i.resume(),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{await i.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=i.createMediaElementSource(this.video),this.direct=!0}catch(s){console.warn("[artplayerPluginAsr] Direct connection failed:",s)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=i.createMediaStreamSource(this.stream)}}}prepare(){return this.preparation??(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const r=this.gain=s||e.createGain();s||(r.gain.value=this.direct?1:0);const n=this.recorder=new AudioWorkletNode(e,"recorder-processor");n.port.onmessage=e=>{this.closed||this.recorder!==n||t(e.data)},i.connect(n),this.direct?i.connect(r):n.connect(r),r.connect(e.destination)}disconnect(){this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),this.gain?.disconnect(),this.gain=void 0,this.source?.disconnect()}async close(){if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),this.stream?.getTracks().forEach(t=>t.stop()),this.stream=void 0;const t=this.context;this.context=void 0,this.source=void 0,t&&"closed"!==t.state&&await t.close()}}class e{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const e=this.epoch,i=()=>!this.terminal&&this.epoch===e,s=(async()=>{if(await this.closing,!i())return;const{sampleRate:e,interval:s}=this.options,r=Math.floor(e*s/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(s)||s<=0)throw new Error("Audio chunk length must be positive and finite");const n=this.graph??(this.graph=new t(this.video,e,this.options.captureOnly));await n.prepare(),i()?(n.connect(t=>{if(this.running&&this.graph===n)return this.queue.length+t.length>Math.max(60*e,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),s)):this.running||this.graph!==n||n.idle()})().catch(async t=>{i()&&(console.error("[artplayerPluginAsr] Initialization failed:",t),await this.stop())}).finally(()=>{this.starting===s&&(this.starting=void 0)});return this.starting=s,s}async tick(t){if(!this.running||this.pending)return;const e=this.queue.take(t);if(!e)return;const i=this.epoch,s=this.pending={};try{const t=await this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function s(t={}){const{length:e=3,interval:s=100,sampleRate:r=16e3,autoHideTimeout:n=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===a?.type;return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const c=function(t,e,i){let s,r=!1;function n(){clearTimeout(s),s=void 0}function o(){r||(t.style.display="none")}return{append:function(a){r||"string"!==typeof a||(n(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(/(?<=[\u3001\u3002\uff01\uff1f!?.])\s*/u).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){r=!0,n()}}}(a,e,n),l=new i(t.video,{interval:s,sampleRate:r,onAudioChunk:o,captureOnly:h},c.append),d=()=>l.start(),p=()=>l.pause(),u=()=>l.restart(),f=()=>(c.destroy(),t.off("play",d),t.off("pause",p),t.off("restart",u),t.off("destroy",f),l.stop(!0));return t.on("play",d),t.on("pause",p),t.on("restart",u),t.on("destroy",f),{name:"artplayerPluginAsr",stop:()=>l.stop(),hide:c.hide,append:c.append}}}if(Object.defineProperty(s,"default",{value:s}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return s}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";class t{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}async initialize(){this.assertOpen();const t=window,e=window.AudioContext||t.webkitAudioContext;if(!e)throw new Error("AudioContext is not supported");const i=this.context??(this.context=new e({sampleRate:this.sampleRate}));if("suspended"===i.state&&await i.resume(),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{await i.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=i.createMediaElementSource(this.video),this.direct=!0}catch(s){console.warn("[artplayerPluginAsr] Direct connection failed:",s)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=i.createMediaStreamSource(this.stream)}}}prepare(){return this.preparation??(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const r=this.gain=s||e.createGain();s||(r.gain.value=this.direct?1:0);const n=this.recorder=new AudioWorkletNode(e,"recorder-processor");n.port.onmessage=e=>{this.closed||this.recorder!==n||t(e.data)},i.connect(n),this.direct?i.connect(r):n.connect(r),r.connect(e.destination)}disconnect(){this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),this.gain?.disconnect(),this.gain=void 0,this.source?.disconnect()}async close(){if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),this.stream?.getTracks().forEach(t=>t.stop()),this.stream=void 0;const t=this.context;this.context=void 0,this.source=void 0,t&&"closed"!==t.state&&await t.close()}}class e{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const e=this.epoch,i=()=>!this.terminal&&this.epoch===e,s=(async()=>{if(await this.closing,!i())return;const{sampleRate:e,interval:s}=this.options,r=Math.floor(e*s/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(s)||s<=0)throw new Error("Audio chunk length must be positive and finite");const n=this.graph??(this.graph=new t(this.video,e,this.options.captureOnly));await n.prepare(),i()?(n.connect(t=>{if(this.running&&this.graph===n)return this.queue.length+t.length>Math.max(60*e,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),s)):this.running||this.graph!==n||n.idle()})().catch(async t=>{i()&&(console.error("[artplayerPluginAsr] Initialization failed:",t),await this.stop())}).finally(()=>{this.starting===s&&(this.starting=void 0)});return this.starting=s,s}async tick(t){if(!this.running||this.pending)return;const e=this.queue.take(t);if(!e)return;const i=this.epoch,s=this.pending={};try{const t=await this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function s(t={}){const{length:e=3,interval:s=100,sampleRate:r=16e3,autoHideTimeout:n=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===a?.type;return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const c=function(t,e,i){let s,r=!1;function n(){clearTimeout(s),s=void 0}function o(){r||(t.style.display="none")}return{append:function(a){r||"string"!==typeof a||(n(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(/(?<=[\u3001\u3002\uff01\uff1f!?.])\s*/u).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){r=!0,n()}}}(a,e,n),l=new i(t.video,{interval:s,sampleRate:r,onAudioChunk:o,captureOnly:h},c.append),d=()=>l.start(),p=()=>l.pause(),u=()=>l.restart(),f=()=>l.stop(),g=()=>(c.destroy(),t.off("play",d),t.off("pause",p),t.off("restart",u),t.off("video:error",f),t.off("destroy",g),l.stop(!0));return t.on("play",d),t.on("pause",p),t.on("restart",u),t.on("video:error",f),t.on("destroy",g),{name:"artplayerPluginAsr",stop:f,hide:c.hide,append:c.append}}}if(Object.defineProperty(s,"default",{value:s}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return s}); diff --git a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js index 53ad308e2..a0f44ac8e 100644 --- a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js +++ b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";var t=(t,e,i)=>new Promise((s,n)=>{var r=t=>{try{a(i.next(t))}catch(e){n(e)}},o=t=>{try{a(i.throw(t))}catch(e){n(e)}},a=t=>t.done?s(t.value):Promise.resolve(t.value).then(r,o);a((i=i.apply(t,e)).next())});class e{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}initialize(){return t(this,null,function*(){var t;this.assertOpen();const e=window,i=window.AudioContext||e.webkitAudioContext;if(!i)throw new Error("AudioContext is not supported");const s=null!=(t=this.context)?t:this.context=new i({sampleRate:this.sampleRate});if("suspended"===s.state&&(yield s.resume()),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{yield s.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=s.createMediaElementSource(this.video),this.direct=!0}catch(n){console.warn("[artplayerPluginAsr] Direct connection failed:",n)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=s.createMediaStreamSource(this.stream)}}})}prepare(){return null!=this.preparation||(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const n=this.gain=s||e.createGain();s||(n.gain.value=this.direct?1:0);const r=this.recorder=new AudioWorkletNode(e,"recorder-processor");r.port.onmessage=e=>{this.closed||this.recorder!==r||t(e.data)},i.connect(r),this.direct?i.connect(n):r.connect(n),n.connect(e.destination)}disconnect(){var t,e;this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),null==(t=this.gain)||t.disconnect(),this.gain=void 0,null==(e=this.source)||e.disconnect()}close(){return t(this,null,function*(){var t;if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),null==(t=this.stream)||t.getTracks().forEach(t=>t.stop()),this.stream=void 0;const e=this.context;this.context=void 0,this.source=void 0,e&&"closed"!==e.state&&(yield e.close())})}}class i{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const i=this.epoch,s=()=>!this.terminal&&this.epoch===i,n=(()=>t(this,null,function*(){var t;if(yield this.closing,!s())return;const{sampleRate:i,interval:n}=this.options,r=Math.floor(i*n/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(n)||n<=0)throw new Error("Audio chunk length must be positive and finite");const o=null!=(t=this.graph)?t:this.graph=new e(this.video,i,this.options.captureOnly);yield o.prepare(),s()?(o.connect(t=>{if(this.running&&this.graph===o)return this.queue.length+t.length>Math.max(60*i,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),n)):this.running||this.graph!==o||o.idle()}))().catch(e=>t(this,null,function*(){s()&&(console.error("[artplayerPluginAsr] Initialization failed:",e),yield this.stop())})).finally(()=>{this.starting===n&&(this.starting=void 0)});return this.starting=n,n}tick(e){return t(this,null,function*(){if(!this.running||this.pending)return;const t=this.queue.take(e);if(!t)return;const i=this.epoch,s=this.pending={};try{const e=yield this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function n(t={}){const{length:e=3,interval:i=100,sampleRate:n=16e3,autoHideTimeout:r=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===(null==a?void 0:a.type);return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const l=function(t,e,i){let s,n=!1;function r(){clearTimeout(s),s=void 0}function o(){n||(t.style.display="none")}return{append:function(a){n||"string"!==typeof a||(r(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(new RegExp("(?<=[\u3001\u3002\uff01\uff1f!?.])\\s*","u")).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){n=!0,r()}}}(a,e,r),c=new s(t.video,{interval:i,sampleRate:n,onAudioChunk:o,captureOnly:h},l.append),d=()=>c.start(),u=()=>c.pause(),p=()=>c.restart(),f=()=>(l.destroy(),t.off("play",d),t.off("pause",u),t.off("restart",p),t.off("destroy",f),c.stop(!0));return t.on("play",d),t.on("pause",u),t.on("restart",p),t.on("destroy",f),{name:"artplayerPluginAsr",stop:()=>c.stop(),hide:l.hide,append:l.append}}}if(Object.defineProperty(n,"default",{value:n}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return n}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginAsr=e(),define(function(){return t.artplayerPluginAsr})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginAsr=e()}(this,function(){"use strict";var t=(t,e,i)=>new Promise((s,n)=>{var r=t=>{try{a(i.next(t))}catch(e){n(e)}},o=t=>{try{a(i.throw(t))}catch(e){n(e)}},a=t=>t.done?s(t.value):Promise.resolve(t.value).then(r,o);a((i=i.apply(t,e)).next())});class e{constructor(t,e,i=!1){this.video=t,this.sampleRate=e,this.captureOnly=i,this.closed=!1,this.direct=!1,this.workletLoaded=!1}assertOpen(){if(this.closed)throw new Error("Audio capture was closed")}revokeWorklet(){void 0!==this.blobUrl&&(URL.revokeObjectURL(this.blobUrl),this.blobUrl=void 0)}initialize(){return t(this,null,function*(){var t;this.assertOpen();const e=window,i=window.AudioContext||e.webkitAudioContext;if(!i)throw new Error("AudioContext is not supported");const s=null!=(t=this.context)?t:this.context=new i({sampleRate:this.sampleRate});if("suspended"===s.state&&(yield s.resume()),this.assertOpen(),!this.workletLoaded){this.blobUrl=URL.createObjectURL(new Blob(["\nclass RecorderProcessor extends AudioWorkletProcessor {\n process(inputs) {\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(input[0]);\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n"],{type:"application/javascript"}));try{yield s.audioWorklet.addModule(this.blobUrl),this.workletLoaded=!0}finally{this.revokeWorklet()}}if(this.assertOpen(),!this.source){if(!this.captureOnly)try{this.source=s.createMediaElementSource(this.video),this.direct=!0}catch(n){console.warn("[artplayerPluginAsr] Direct connection failed:",n)}if(!this.source){const t=this.video.captureStream||this.video.mozCaptureStream;if(!t)throw new Error("Could not establish audio source");this.stream=t.call(this.video),this.source=s.createMediaStreamSource(this.stream)}}})}prepare(){return null!=this.preparation||(this.preparation=this.initialize().catch(t=>{throw this.preparation=void 0,t})),this.preparation}get ownsMediaConnection(){return this.direct}idle(){const t=this.gain;this.disconnect(),this.direct&&this.context&&this.source&&(this.gain=t||this.context.createGain(),t||(this.gain.gain.value=1),this.source.connect(this.gain),this.gain.connect(this.context.destination))}connect(t){this.assertOpen();const e=this.context,i=this.source;if(!e||!i)throw new Error("Audio capture is not prepared");const s=this.gain;this.disconnect();const n=this.gain=s||e.createGain();s||(n.gain.value=this.direct?1:0);const r=this.recorder=new AudioWorkletNode(e,"recorder-processor");r.port.onmessage=e=>{this.closed||this.recorder!==r||t(e.data)},i.connect(r),this.direct?i.connect(n):r.connect(n),n.connect(e.destination)}disconnect(){var t,e;this.recorder&&(this.recorder.port.onmessage=null,this.recorder.disconnect(),this.recorder=void 0),null==(t=this.gain)||t.disconnect(),this.gain=void 0,null==(e=this.source)||e.disconnect()}close(){return t(this,null,function*(){var t;if(this.closed)return;this.closed=!0,this.disconnect(),this.revokeWorklet(),null==(t=this.stream)||t.getTracks().forEach(t=>t.stop()),this.stream=void 0;const e=this.context;this.context=void 0,this.source=void 0,e&&"closed"!==e.state&&(yield e.close())})}}class i{constructor(){this.offset=0,this.size=0}get length(){return this.size}push(t){if(0===t.length)return;const e={samples:new Float32Array(t)};this.tail?this.tail.next=e:this.head=e,this.tail=e,this.size+=t.length}take(t){if(!Number.isSafeInteger(t)||t<=0)throw new RangeError("Sample count must be a positive safe integer");if(t>this.size)return null;const e=new Float32Array(t);let i=0;for(;this.head&&it&&!this.terminal&&this.epoch===i?this.start():void 0)}return t?this.start():Promise.resolve()}start(){if(this.terminal||this.running)return Promise.resolve();if(this.starting)return this.starting;const i=this.epoch,s=()=>!this.terminal&&this.epoch===i,n=(()=>t(this,null,function*(){var t;if(yield this.closing,!s())return;const{sampleRate:i,interval:n}=this.options,r=Math.floor(i*n/1e3);if(!Number.isSafeInteger(r)||r<1||!Number.isFinite(n)||n<=0)throw new Error("Audio chunk length must be positive and finite");const o=null!=(t=this.graph)?t:this.graph=new e(this.video,i,this.options.captureOnly);yield o.prepare(),s()?(o.connect(t=>{if(this.running&&this.graph===o)return this.queue.length+t.length>Math.max(60*i,2*r)?(console.error("[artplayerPluginAsr] Audio callback backlog exceeded its capture limit"),void this.pause()):void this.queue.push(t)}),this.running=!0,this.timer=setInterval(()=>this.tick(r),n)):this.running||this.graph!==o||o.idle()}))().catch(e=>t(this,null,function*(){s()&&(console.error("[artplayerPluginAsr] Initialization failed:",e),yield this.stop())})).finally(()=>{this.starting===n&&(this.starting=void 0)});return this.starting=n,n}tick(e){return t(this,null,function*(){if(!this.running||this.pending)return;const t=this.queue.take(e);if(!t)return;const i=this.epoch,s=this.pending={};try{const e=yield this.options.onAudioChunk(function(t,e){const i=new ArrayBuffer(2*t.length),s=new DataView(i);for(let a=0;a{})),this.closing}}function n(t={}){const{length:e=3,interval:i=100,sampleRate:n=16e3,autoHideTimeout:r=1e4,onAudioChunk:o=()=>null,audioInput:a}=t;if(void 0!==a&&"capture"!==a.type)throw new TypeError("Unsupported ASR audio input");const h="capture"===(null==a?void 0:a.type);return t=>{const a=t.layers.add({name:"asr",html:""});if(!a)throw new Error("Could not create ASR subtitle layer");const l=function(t,e,i){let s,n=!1;function r(){clearTimeout(s),s=void 0}function o(){n||(t.style.display="none")}return{append:function(a){n||"string"!==typeof a||(r(),s=setTimeout(o,i),t.style.display="",t.innerHTML=a.split(new RegExp("(?<=[\u3001\u3002\uff01\uff1f!?.])\\s*","u")).map(t=>t.trim()).filter(Boolean).slice(-e).map(t=>`
${t}
`).join(""))},hide:o,destroy(){n=!0,r()}}}(a,e,r),c=new s(t.video,{interval:i,sampleRate:n,onAudioChunk:o,captureOnly:h},l.append),d=()=>c.start(),u=()=>c.pause(),p=()=>c.restart(),f=()=>c.stop(),g=()=>(l.destroy(),t.off("play",d),t.off("pause",u),t.off("restart",p),t.off("video:error",f),t.off("destroy",g),c.stop(!0));return t.on("play",d),t.on("pause",u),t.on("restart",p),t.on("video:error",f),t.on("destroy",g),{name:"artplayerPluginAsr",stop:f,hide:l.hide,append:l.append}}}if(Object.defineProperty(n,"default",{value:n}),"undefined"!==typeof document&&!document.getElementById("artplayer-plugin-asr")){const t=document.createElement("style");t.id="artplayer-plugin-asr",t.textContent=".art-video-player .art-layer-asr{pointer-events:none!important;position:absolute;z-index:150;inset:0;display:flex;flex-direction:column;justify-content:end;padding:0 2%;font-size:1rem;gap:var(--art-subtitle-gap);padding-bottom:var(--art-subtitle-bottom);transition:padding-bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-control-show .art-layer-asr{padding-bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}",document.head.appendChild(t)}return n}); diff --git a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs index baa8911a1..fbae88cbe 100644 --- a/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs +++ b/packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs @@ -379,12 +379,14 @@ function artplayerPluginAsr(option = {}) { art.off("play", play); art.off("pause", pause); art.off("restart", restart); + art.off("video:error", stop); art.off("destroy", destroy); return capture.stop(true); }; art.on("play", play); art.on("pause", pause); art.on("restart", restart); + art.on("video:error", stop); art.on("destroy", destroy); return { name: "artplayerPluginAsr", stop, hide: subtitles.hide, append: subtitles.append }; }; diff --git a/packages/artplayer-plugin-asr/src/index.ts b/packages/artplayer-plugin-asr/src/index.ts index cce94e8ff..098b14627 100644 --- a/packages/artplayer-plugin-asr/src/index.ts +++ b/packages/artplayer-plugin-asr/src/index.ts @@ -24,12 +24,14 @@ export default function artplayerPluginAsr(option: AsrOptions = {}) { art.off('play', play) art.off('pause', pause) art.off('restart', restart) + art.off('video:error', stop) art.off('destroy', destroy) return capture.stop(true) } art.on('play', play) art.on('pause', pause) art.on('restart', restart) + art.on('video:error', stop) art.on('destroy', destroy) return { name: 'artplayerPluginAsr', stop, hide: subtitles.hide, append: subtitles.append } } diff --git a/refactor/baselines/asr-media-error-validation.json b/refactor/baselines/asr-media-error-validation.json new file mode 100644 index 000000000..4f9671956 --- /dev/null +++ b/refactor/baselines/asr-media-error-validation.json @@ -0,0 +1,18044 @@ +{ + "task": "PKG-ASR-10", + "status": "done", + "capturedAt": "2026-09-15T06:24:32.736Z", + "source": "3c89b48514e9fe02b4cac64a1630c50380c4c947", + "toolchain": { + "node": "24.21.0", + "yarn": "1.22.22" + }, + "inputs": [ + { + "path": "package.json", + "sha256": "ee257672a4590d42fe9d7954136e99bc45ed0b09b1a8981a6361b9e74ea65d1f" + }, + { + "path": "yarn.lock", + "sha256": "aa33cfc38c7933ab53ce626a911fdafd7b14023e45f93ca37bf7f2f6a1d3ecce" + }, + { + "path": "packages/artplayer-plugin-asr/src/index.ts", + "sha256": "fbfc1dc6c3e848f30e452fbeaf6cb7593b050a839e9fdd2980336b77edeb4ff8" + }, + { + "path": "packages/artplayer-plugin-asr/src/capture.ts", + "sha256": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a" + }, + { + "path": "packages/artplayer-plugin-asr/src/audio-graph.ts", + "sha256": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4" + }, + { + "path": "packages/artplayer-plugin-asr/ARCHITECTURE.md", + "sha256": "7a7492ab98d922cfecc3d632395f8571b204118e0cbe5f98a56d645ae51c3b18" + }, + { + "path": "packages/artplayer-plugin-asr/README.md", + "sha256": "5e80fdcbb55c074724512e053b88b0cf1f29543c37c101cfbaa496c8c6228ebe" + }, + { + "path": "test/asr-media-error.test.js", + "sha256": "b7bcddfe5b02389b9442c08f04351214e2ea0edb65650e6d71d057aefad41170" + }, + { + "path": "test/browser/asr-media-error.spec.js", + "sha256": "653145587e7f0ea0b42a439466ea85f77796b00ac12d4b2011d4d2bbe0cac2c2" + }, + { + "path": "test/browser/asr-no-audio.spec.js", + "sha256": "e87a6493a7276d067a191ceb0c7c2daf0f7a15bc7fa4e55079ac27a6d4fdf3eb" + }, + { + "path": "test/browser/asr-playback.spec.js", + "sha256": "d2f3a370525e2f1e3a674cbb7ea1ca79ad8f2b823b7a1c2fb5bb0a1d19cdf3be" + }, + { + "path": "test/browser/asr-capture-cors.spec.js", + "sha256": "d614a45771c4dae123f29bcf52eb1fb231ce257901e0337ccf358d3f8ad0e99b" + }, + { + "path": "test/browser-validation.test.js", + "sha256": "bc3d7eaaaa0cbac3936ff61666170fad5dd44ca9d39b208e700cbc20655d8da7" + }, + { + "path": "scripts/browser-validation/scope.ts", + "sha256": "96253e006204f26a56a0989c217b1d25c691984126659aeb9ed2047c0b68bdca" + } + ], + "baselineSource": { + "commit": "3c89b48514e9fe02b4cac64a1630c50380c4c947", + "path": "packages/artplayer-plugin-asr/src/index.ts", + "gitBlob": "cce94e8ff16f77a50ead3ef179a920fb4eb2f397" + }, + "unitBefore": { + "passed": 0, + "failed": 5, + "log": { + "path": "refactor/.cache/asr-media-error-unit-before.log", + "sha256": "ed4bb18f10c97b7e052a3fd9711cafcb9262933009bfd8817ad7d323db9fa6a0" + } + }, + "units": [ + { + "name": "unit-after", + "passed": 5, + "failed": 0, + "skipped": 0, + "log": { + "path": "refactor/.cache/asr-media-error-unit-after.log", + "sha256": "443bc0e993ab363b07daa526cf4b0d5c53863cd2c3cdc87bff19e216d8631e6b" + } + }, + { + "name": "unit", + "passed": 234, + "failed": 0, + "skipped": 0, + "log": { + "path": "refactor/.cache/asr-media-error-unit.log", + "sha256": "55a5f46c114c7f67393392d519ec2766db935de130d25883ecdaa95a2d8852d2" + } + }, + { + "name": "main-unit", + "passed": 43, + "failed": 0, + "skipped": 0, + "log": { + "path": "refactor/.cache/asr-media-error-main-unit.log", + "sha256": "a111ce3d3e5266bc08ceccc435cc252ded3b9bcac6f0ff35271d063ede58c836" + } + }, + { + "name": "legacy-unit", + "passed": 43, + "failed": 0, + "skipped": 0, + "log": { + "path": "refactor/.cache/asr-media-error-legacy-unit.log", + "sha256": "503936615c3f5d10c584874eb11678fd324ef6420569b8bd2727332096e5b3e0" + } + }, + { + "name": "roster", + "passed": 6, + "failed": 0, + "skipped": 0, + "log": { + "path": "refactor/.cache/asr-media-error-roster.log", + "sha256": "ba5783354e1a0de3ec733cbcd5b7f76c2aea9da84b1b567ef43e10f736cc3e78" + } + } + ], + "checks": [ + { + "check": "build", + "exitCode": 0, + "log": { + "path": "refactor/.cache/asr-media-error-build.log", + "sha256": "b83665a8b24747df14e3c8b855465107dbe026c758e1bbfbc54bd51d8e601f1f" + } + }, + { + "check": "types", + "exitCode": 0, + "log": { + "path": "refactor/.cache/asr-media-error-types.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + { + "check": "docs-types", + "exitCode": 0, + "log": { + "path": "refactor/.cache/asr-media-error-docs-types.log", + "sha256": "d9d3717dca03c88495661f30b7571f8eeb7cf3a242e098c7deb41daf1fec678c" + } + }, + { + "check": "lint", + "exitCode": 0, + "log": { + "path": "refactor/.cache/asr-media-error-lint.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + { + "check": "toolchain", + "exitCode": 0, + "log": { + "path": "refactor/.cache/asr-media-error-toolchain.log", + "sha256": "22fa1018cbed5e71fb5aacbe2cf13edb626d341590f3b93c98cf688c0bae2be4" + } + } + ], + "installation": { + "directory": "refactor/.cache/packages/run-gTeZ8R", + "log": { + "path": "refactor/.cache/asr-media-error-package.log", + "sha256": "6e5b52e14642a39c10c466d3bf233590c6d80dbc4b6ef68cf0f80bf962f3dd06" + }, + "report": { + "path": "refactor/.cache/packages/run-gTeZ8R/report.json", + "sha256": "287a9fba5d7c819d377396d9bb1fd04f0715bc096c67faa9e8f46e41baf523ff" + }, + "runtimeTypeScope": [ + "artplayer", + "artplayer-plugin-chapter" + ], + "maps": [ + { + "map": { + "path": "refactor/.cache/packages/run-gTeZ8R/browser-artifacts.json", + "sha256": "9abaebe92952b11a3d991adce017661db30c99f04a6f3f41bc12029fefd1af02" + }, + "verified": { + "directory": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R", + "inputs": [ + { + "name": "artplayer", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer\\dist\\artplayer.js", + "member": "package/dist/artplayer.js", + "sha256": "9148a369636f814b03e6a1ed2a7db222a31b159f93e8a94d52c5a9dde2dfe6a6", + "archiveSha256": "f8b06e65a5a7e220b2160cbac678f2baba5ab25b5522a72d4fa74045b8347ecb", + "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-gTeZ8R\\artifacts\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.js", + "member": "package/dist/artplayer-plugin-chapter.js", + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "archiveSha256": "6562554412fa6c188f25977b40dc7675f934bc4cb448838160191638e02932b2", + "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-asr", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer-plugin-asr\\dist\\artplayer-plugin-asr.js", + "member": "package/dist/artplayer-plugin-asr.js", + "sha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "archiveSha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "sourceHashes": { + "src/audio-graph.ts": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4", + "src/capture.ts": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a", + "src/encoding.ts": "a1dbc731d5d47a6ae313728cf45e96250e7bf8c6e00a9e071781acc366235944", + "src/index.ts": "fbfc1dc6c3e848f30e452fbeaf6cb7593b050a839e9fdd2980336b77edeb4ff8", + "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" + } + } + ], + "toolchain": { + "yarn.lock": "aa33cfc38c7933ab53ce626a911fdafd7b14023e45f93ca37bf7f2f6a1d3ecce", + "scripts/build.js": "ec716c545d6bd0a06fdf7b616a487e0cc7605212de5c413bc247efa6737d5870", + "scripts/utils.js": "b42450026f5e8a621b59cd84f91d5c1d6915f4ec026ad2ee0980b06f16f6ae79", + "scripts/projects.js": "3956faff0032ab5b91daa45f390a664ca246559621f95fd2f53cef8bb8b58bdf", + "scripts/library/analysis.ts": "68ce6b33d0257ccd34a2abc5a75a7a6e06420cd93eaa00501cc04e38d48ad78b", + "scripts/library/assets.ts": "639c8137ccce15f903267e066e5dc55b4776c76bdfcfe5550599b15dc17e0f2e", + "scripts/library/banner.ts": "c07b9b033cf1e3ad68e9ce80c0f9e7955d24abe8ad291e01ad22b5303c9f9ec5", + "scripts/library/config.ts": "2017a781a78e227e8ecfd98af56ea9d3ae91f4f033f36b371e0efac1995a1aec", + "scripts/library/development.ts": "202d1cfa5cc5ba7a5ee474a5a7e36afaf028b7be834516ab0be5cc97a3a53f71", + "scripts/library/names.ts": "3749777e71f2f471e0edb4a1104d2c650d09643f57149a42f1c135dc79b7b1b5", + "scripts/library/production.ts": "f309ec71319d7d99f703bba3d11f3db53c1c240d6af9d0d5e6a5e36eb3b1bfeb", + "scripts/library/projects.ts": "fc658271482a4f293c21d606ac87b2668dbc88e3028b345a622587ebc0d151ca", + "scripts/library/rebuild.ts": "01cfc0f5f58263baa891e7c783349f1ff212a423a03a6805aecea568a482aec0", + "scripts/library/reload.ts": "0ee863e38c3065826d6432656e7c7d52ab4326733109195ad57ac6583fc6da58", + "scripts/library/server.ts": "389303abf965e5b8a1138de194b766457f625bf06438b50e48fb388d8a537dfd", + "scripts/library/vendor.d.ts": "af37a4c6bf37fde5c8eff862668f188eb1f3e9e3c12c3d46f563af78bd8b385f" + }, + "packages": [ + { + "name": "artplayer", + "version": "5.4.1", + "archive": "artplayer.tgz", + "sha256": "f8b06e65a5a7e220b2160cbac678f2baba5ab25b5522a72d4fa74045b8347ecb", + "files": { + "package/ARCHITECTURE.md": "dad3ccb55f25c63e0eb3b8d5f25b21db58431c48f84a2d9eb046b2492ac6cedc", + "package/README.md": "1e185e65f67fc2081b4182bbc6c4558ea05b6e3fa3acc5dd0c3ac7df1d542b09", + "package/THIRD_PARTY_NOTICES": "b77b5b46b79fa0cda850b0781f78c3b1112c4ed9672fa291956fe8eff53098e7", + "package/dist/artplayer.js": "9148a369636f814b03e6a1ed2a7db222a31b159f93e8a94d52c5a9dde2dfe6a6", + "package/dist/artplayer.legacy.js": "9bde35a6d64234cae15300e37b03204c075ef26126058f48bb3bf97d6e002449", + "package/dist/artplayer.mjs": "265bca0ad3f8373acc84333c19cdded0cbd6b309ede9e51c0bec35685c77eebd", + "package/dist/i18n/ar.js": "bd0bef65f4f7dc3f8ed562904cc6fa9071ff4537fb64c1e0fc3d554141bcd3cb", + "package/dist/i18n/ar.mjs": "59310b7bbeea83bbb7d73aadc5ca82a6ec269c3530d19aa741c94d5c64fc5da8", + "package/dist/i18n/cs.js": "6e2c93daba24c2e48dfa206bcf4f2f2a8a02713b856e404d2e4e4ecd8309ca2f", + "package/dist/i18n/cs.mjs": "c73fba18797d62d7b2581e67fe7340c35fe84510b2250ff1ecaad253d9cabbac", + "package/dist/i18n/es.js": "f4133ac6ea06b69a474b33c4a1809a4066e2376bb9464a3f3aa8330f01f1944a", + "package/dist/i18n/es.mjs": "1390bca3def2be115e811de337df0a0c3f63998e51359f283023246245c552a7", + "package/dist/i18n/fa.js": "8d3ef2e0f0cc0ea480c2167b6fcb87cdf444e90759c3519e8daa139fec576da4", + "package/dist/i18n/fa.mjs": "ab441e8a2d79043b29ceca87c783bf06874bb9d3a149c1604bc167eb481be2a9", + "package/dist/i18n/fr.js": "89dc4194a6c0a962b9ce756b52c90401c1acf3b159f265f3bc0d7d6d7d987f03", + "package/dist/i18n/fr.mjs": "99491878430fb7b6f2b7bf93da0588a831704b412e01116f23ba1d9d45863816", + "package/dist/i18n/id.js": "4c6dc86db741bcc2857df55a9d037e82e91d375fa6fd22e0562809ff621b92db", + "package/dist/i18n/id.mjs": "383e5803a6b6686c6de4e867770241de75b6f517dcca2bdedc6f2004bf6e1fb3", + "package/dist/i18n/pl.js": "3a38828b1c3d719c0aca9906cf6a46c23555a8411f8d57645f0e0ce8147dc664", + "package/dist/i18n/pl.mjs": "079ed96732979035297af387c64a7b99519b5a43107fb86735a654ea4fe8e9b5", + "package/dist/i18n/ru.js": "62fac9dddb302eb16382e6e9301fc4b2c66f5f69d4a358a26b67026a5fa4e787", + "package/dist/i18n/ru.mjs": "a893aeaee1d79409db72e324fbff200e3864f33ed168f04d91d25f7cf2efa765", + "package/dist/i18n/tr.js": "1492c36b069a7d73db4f3913bd18085faff7afd8b3c158138fe264e31600e38c", + "package/dist/i18n/tr.mjs": "a90478cac078836b76c2a98261907610fee07f3e4b28671b8e7dbf533778f918", + "package/dist/i18n/vi.js": "c7216ef7e608a79b7e2c479a07bf310d4ab79577947ac4a62d676faaced0e9cf", + "package/dist/i18n/vi.mjs": "66270fdfa0b5da396322d1769169b7df37a030ba15ac18eb30bd87b3af8074ec", + "package/dist/i18n/zh-tw.js": "11c49857d6d40a5ffd224ffa59c9026e71621b345f63c5a086326db80a22371a", + "package/dist/i18n/zh-tw.mjs": "a38e630cb96de96c15d824686aec750e25cf6c8ada01285a292442a81566314f", + "package/package.json": "82e92699e7c29847f32ac6767ece0401290e7d7a12854722bdbcfd09b90b7954", + "package/types/COMPATIBILITY.md": "a7da9e102a116104b513df4f7451247b7759bc502d3375f30bd5b14a541826e0", + "package/types/README.md": "1bd9868e773610e6312fd48a1c5aa20772d29df0af40c3db66e75b7ab4a1aee0", + "package/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "package/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "package/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "package/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "package/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "package/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "package/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "package/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "package/types/i18n.d.ts": "f4f2f05bdfda73c74fef34767cb18ee8e11b743120b1c4598e9714d7846018e5", + "package/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "package/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "package/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "package/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "package/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "package/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "package/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "package/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "package/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "package/types/runtime.d.cts": "7ee988dfea9a0ac71a34a656f96f7b74e78aa92547cfdfab7ff7e1139a77d4a3", + "package/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "package/types/runtime.d.ts": "9c6ccd39a1be293f17ae46dae8ea077053e12635ee79d73a5e3b3a559230fcff", + "package/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "package/types/runtime/construction.d.ts": "7a87bedf6f7ffff0c46078aa5f1551e0077d35574e286516121f5f935e2d9ce4", + "package/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "package/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "package/types/runtime/option.d.ts": "6e334e1a76fdcc40b4665c02523bd31c3994d96078fadeb40e23422aa54c1a1d", + "package/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "package/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "package/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "package/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "package/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "package/types/runtime/template.d.ts": "7a62f968a38b4bf9109a4439557c02074eb1d62ba1f6e21a8eb194e91f0badfe", + "package/types/runtime/utils.d.ts": "6bf731705d86853e066dbaf3b8d4003b6548423fe615b7412b722bd0d3a6e48b", + "package/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "package/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "package/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "package/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + } + }, + { + "name": "artplayer-plugin-chapter", + "version": "1.1.0", + "archive": "artplayer-plugin-chapter.tgz", + "sha256": "6562554412fa6c188f25977b40dc7675f934bc4cb448838160191638e02932b2", + "files": { + "package/ARCHITECTURE.md": "7734e4d29aa25ccb39cab826781409c4ecfd2a47ef19c5535f1a70d7fb47b4c1", + "package/README.md": "b95400ff3d525621a15268bb56a2d353aacaaadefde7e735d7abd91a34edd96f", + "package/dist/artplayer-plugin-chapter.js": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "package/dist/artplayer-plugin-chapter.legacy.js": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "package/dist/artplayer-plugin-chapter.mjs": "754fbcfc60add74d6b6ad3bc8db253df3eb14ace13ac8a5439be0592bd5512d0", + "package/package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "package/types/artplayer-plugin-chapter.d.cts": "4f07514b37453cd6cea8e5aa28fa018ff31738e0d423c11a3b5eccd50ed30bcc", + "package/types/artplayer-plugin-chapter.d.mts": "610179754db36276e161a07bccf4eaba8b4480f053e716a2bcc5a1574871a171", + "package/types/artplayer-plugin-chapter.d.ts": "581aa2862e709601c87a23585f54a969ebd350be56a7469a31ff53f1311b578d" + } + }, + { + "name": "artplayer-plugin-asr", + "version": "2.1.0", + "archive": "artplayer-plugin-asr.tgz", + "sha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "files": { + "package/ARCHITECTURE.md": "7a7492ab98d922cfecc3d632395f8571b204118e0cbe5f98a56d645ae51c3b18", + "package/README.md": "5e80fdcbb55c074724512e053b88b0cf1f29543c37c101cfbaa496c8c6228ebe", + "package/dist/artplayer-plugin-asr.js": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "package/dist/artplayer-plugin-asr.legacy.js": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "package/dist/artplayer-plugin-asr.mjs": "2449d2981912973e2fe8790f27db3452b6e53821e910225b55e2fbc4ba5f4f92", + "package/package.json": "781b1eebefdff5fdc234b793ff9d6d8263275115ccff4c4d90c55eca942f2444", + "package/types/artplayer-plugin-asr.d.ts": "afa3a72330cdfe7858d6aa3f95c4a77d6f19fd5c34da5adc084c0f83f5e3b99a", + "package/types/runtime.d.cts": "2965dccc49a3a75c3b16c0c13501077b8ac199e78bac2d19d57be3d811583606", + "package/types/runtime.d.mts": "ff0769d3e408d66c7d38574171ff2621456afccc50ee8191ca4ee394dc57666e", + "package/types/runtime.d.ts": "2965dccc49a3a75c3b16c0c13501077b8ac199e78bac2d19d57be3d811583606" + } + } + ] + } + }, + { + "map": { + "path": "refactor/.cache/packages/run-gTeZ8R/browser-artifacts-legacy.json", + "sha256": "aad555e3d87a3134a7e28643d4d30538414421650f6d8246d606ac5c00fb08fb" + }, + "verified": { + "directory": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R", + "inputs": [ + { + "name": "artplayer", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer\\dist\\artplayer.legacy.js", + "member": "package/dist/artplayer.legacy.js", + "sha256": "9bde35a6d64234cae15300e37b03204c075ef26126058f48bb3bf97d6e002449", + "archiveSha256": "f8b06e65a5a7e220b2160cbac678f2baba5ab25b5522a72d4fa74045b8347ecb", + "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-gTeZ8R\\artifacts\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.legacy.js", + "member": "package/dist/artplayer-plugin-chapter.legacy.js", + "sha256": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "archiveSha256": "6562554412fa6c188f25977b40dc7675f934bc4cb448838160191638e02932b2", + "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-asr", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer-plugin-asr\\dist\\artplayer-plugin-asr.legacy.js", + "member": "package/dist/artplayer-plugin-asr.legacy.js", + "sha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "archiveSha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "sourceHashes": { + "src/audio-graph.ts": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4", + "src/capture.ts": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a", + "src/encoding.ts": "a1dbc731d5d47a6ae313728cf45e96250e7bf8c6e00a9e071781acc366235944", + "src/index.ts": "fbfc1dc6c3e848f30e452fbeaf6cb7593b050a839e9fdd2980336b77edeb4ff8", + "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" + } + } + ], + "toolchain": { + "yarn.lock": "aa33cfc38c7933ab53ce626a911fdafd7b14023e45f93ca37bf7f2f6a1d3ecce", + "scripts/build.js": "ec716c545d6bd0a06fdf7b616a487e0cc7605212de5c413bc247efa6737d5870", + "scripts/utils.js": "b42450026f5e8a621b59cd84f91d5c1d6915f4ec026ad2ee0980b06f16f6ae79", + "scripts/projects.js": "3956faff0032ab5b91daa45f390a664ca246559621f95fd2f53cef8bb8b58bdf", + "scripts/library/analysis.ts": "68ce6b33d0257ccd34a2abc5a75a7a6e06420cd93eaa00501cc04e38d48ad78b", + "scripts/library/assets.ts": "639c8137ccce15f903267e066e5dc55b4776c76bdfcfe5550599b15dc17e0f2e", + "scripts/library/banner.ts": "c07b9b033cf1e3ad68e9ce80c0f9e7955d24abe8ad291e01ad22b5303c9f9ec5", + "scripts/library/config.ts": "2017a781a78e227e8ecfd98af56ea9d3ae91f4f033f36b371e0efac1995a1aec", + "scripts/library/development.ts": "202d1cfa5cc5ba7a5ee474a5a7e36afaf028b7be834516ab0be5cc97a3a53f71", + "scripts/library/names.ts": "3749777e71f2f471e0edb4a1104d2c650d09643f57149a42f1c135dc79b7b1b5", + "scripts/library/production.ts": "f309ec71319d7d99f703bba3d11f3db53c1c240d6af9d0d5e6a5e36eb3b1bfeb", + "scripts/library/projects.ts": "fc658271482a4f293c21d606ac87b2668dbc88e3028b345a622587ebc0d151ca", + "scripts/library/rebuild.ts": "01cfc0f5f58263baa891e7c783349f1ff212a423a03a6805aecea568a482aec0", + "scripts/library/reload.ts": "0ee863e38c3065826d6432656e7c7d52ab4326733109195ad57ac6583fc6da58", + "scripts/library/server.ts": "389303abf965e5b8a1138de194b766457f625bf06438b50e48fb388d8a537dfd", + "scripts/library/vendor.d.ts": "af37a4c6bf37fde5c8eff862668f188eb1f3e9e3c12c3d46f563af78bd8b385f" + }, + "packages": [ + { + "name": "artplayer", + "version": "5.4.1", + "archive": "artplayer.tgz", + "sha256": "f8b06e65a5a7e220b2160cbac678f2baba5ab25b5522a72d4fa74045b8347ecb", + "files": { + "package/ARCHITECTURE.md": "dad3ccb55f25c63e0eb3b8d5f25b21db58431c48f84a2d9eb046b2492ac6cedc", + "package/README.md": "1e185e65f67fc2081b4182bbc6c4558ea05b6e3fa3acc5dd0c3ac7df1d542b09", + "package/THIRD_PARTY_NOTICES": "b77b5b46b79fa0cda850b0781f78c3b1112c4ed9672fa291956fe8eff53098e7", + "package/dist/artplayer.js": "9148a369636f814b03e6a1ed2a7db222a31b159f93e8a94d52c5a9dde2dfe6a6", + "package/dist/artplayer.legacy.js": "9bde35a6d64234cae15300e37b03204c075ef26126058f48bb3bf97d6e002449", + "package/dist/artplayer.mjs": "265bca0ad3f8373acc84333c19cdded0cbd6b309ede9e51c0bec35685c77eebd", + "package/dist/i18n/ar.js": "bd0bef65f4f7dc3f8ed562904cc6fa9071ff4537fb64c1e0fc3d554141bcd3cb", + "package/dist/i18n/ar.mjs": "59310b7bbeea83bbb7d73aadc5ca82a6ec269c3530d19aa741c94d5c64fc5da8", + "package/dist/i18n/cs.js": "6e2c93daba24c2e48dfa206bcf4f2f2a8a02713b856e404d2e4e4ecd8309ca2f", + "package/dist/i18n/cs.mjs": "c73fba18797d62d7b2581e67fe7340c35fe84510b2250ff1ecaad253d9cabbac", + "package/dist/i18n/es.js": "f4133ac6ea06b69a474b33c4a1809a4066e2376bb9464a3f3aa8330f01f1944a", + "package/dist/i18n/es.mjs": "1390bca3def2be115e811de337df0a0c3f63998e51359f283023246245c552a7", + "package/dist/i18n/fa.js": "8d3ef2e0f0cc0ea480c2167b6fcb87cdf444e90759c3519e8daa139fec576da4", + "package/dist/i18n/fa.mjs": "ab441e8a2d79043b29ceca87c783bf06874bb9d3a149c1604bc167eb481be2a9", + "package/dist/i18n/fr.js": "89dc4194a6c0a962b9ce756b52c90401c1acf3b159f265f3bc0d7d6d7d987f03", + "package/dist/i18n/fr.mjs": "99491878430fb7b6f2b7bf93da0588a831704b412e01116f23ba1d9d45863816", + "package/dist/i18n/id.js": "4c6dc86db741bcc2857df55a9d037e82e91d375fa6fd22e0562809ff621b92db", + "package/dist/i18n/id.mjs": "383e5803a6b6686c6de4e867770241de75b6f517dcca2bdedc6f2004bf6e1fb3", + "package/dist/i18n/pl.js": "3a38828b1c3d719c0aca9906cf6a46c23555a8411f8d57645f0e0ce8147dc664", + "package/dist/i18n/pl.mjs": "079ed96732979035297af387c64a7b99519b5a43107fb86735a654ea4fe8e9b5", + "package/dist/i18n/ru.js": "62fac9dddb302eb16382e6e9301fc4b2c66f5f69d4a358a26b67026a5fa4e787", + "package/dist/i18n/ru.mjs": "a893aeaee1d79409db72e324fbff200e3864f33ed168f04d91d25f7cf2efa765", + "package/dist/i18n/tr.js": "1492c36b069a7d73db4f3913bd18085faff7afd8b3c158138fe264e31600e38c", + "package/dist/i18n/tr.mjs": "a90478cac078836b76c2a98261907610fee07f3e4b28671b8e7dbf533778f918", + "package/dist/i18n/vi.js": "c7216ef7e608a79b7e2c479a07bf310d4ab79577947ac4a62d676faaced0e9cf", + "package/dist/i18n/vi.mjs": "66270fdfa0b5da396322d1769169b7df37a030ba15ac18eb30bd87b3af8074ec", + "package/dist/i18n/zh-tw.js": "11c49857d6d40a5ffd224ffa59c9026e71621b345f63c5a086326db80a22371a", + "package/dist/i18n/zh-tw.mjs": "a38e630cb96de96c15d824686aec750e25cf6c8ada01285a292442a81566314f", + "package/package.json": "82e92699e7c29847f32ac6767ece0401290e7d7a12854722bdbcfd09b90b7954", + "package/types/COMPATIBILITY.md": "a7da9e102a116104b513df4f7451247b7759bc502d3375f30bd5b14a541826e0", + "package/types/README.md": "1bd9868e773610e6312fd48a1c5aa20772d29df0af40c3db66e75b7ab4a1aee0", + "package/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "package/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "package/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "package/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "package/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "package/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "package/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "package/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "package/types/i18n.d.ts": "f4f2f05bdfda73c74fef34767cb18ee8e11b743120b1c4598e9714d7846018e5", + "package/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "package/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "package/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "package/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "package/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "package/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "package/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "package/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "package/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "package/types/runtime.d.cts": "7ee988dfea9a0ac71a34a656f96f7b74e78aa92547cfdfab7ff7e1139a77d4a3", + "package/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "package/types/runtime.d.ts": "9c6ccd39a1be293f17ae46dae8ea077053e12635ee79d73a5e3b3a559230fcff", + "package/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "package/types/runtime/construction.d.ts": "7a87bedf6f7ffff0c46078aa5f1551e0077d35574e286516121f5f935e2d9ce4", + "package/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "package/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "package/types/runtime/option.d.ts": "6e334e1a76fdcc40b4665c02523bd31c3994d96078fadeb40e23422aa54c1a1d", + "package/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "package/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "package/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "package/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "package/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "package/types/runtime/template.d.ts": "7a62f968a38b4bf9109a4439557c02074eb1d62ba1f6e21a8eb194e91f0badfe", + "package/types/runtime/utils.d.ts": "6bf731705d86853e066dbaf3b8d4003b6548423fe615b7412b722bd0d3a6e48b", + "package/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "package/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "package/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "package/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + } + }, + { + "name": "artplayer-plugin-chapter", + "version": "1.1.0", + "archive": "artplayer-plugin-chapter.tgz", + "sha256": "6562554412fa6c188f25977b40dc7675f934bc4cb448838160191638e02932b2", + "files": { + "package/ARCHITECTURE.md": "7734e4d29aa25ccb39cab826781409c4ecfd2a47ef19c5535f1a70d7fb47b4c1", + "package/README.md": "b95400ff3d525621a15268bb56a2d353aacaaadefde7e735d7abd91a34edd96f", + "package/dist/artplayer-plugin-chapter.js": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "package/dist/artplayer-plugin-chapter.legacy.js": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "package/dist/artplayer-plugin-chapter.mjs": "754fbcfc60add74d6b6ad3bc8db253df3eb14ace13ac8a5439be0592bd5512d0", + "package/package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "package/types/artplayer-plugin-chapter.d.cts": "4f07514b37453cd6cea8e5aa28fa018ff31738e0d423c11a3b5eccd50ed30bcc", + "package/types/artplayer-plugin-chapter.d.mts": "610179754db36276e161a07bccf4eaba8b4480f053e716a2bcc5a1574871a171", + "package/types/artplayer-plugin-chapter.d.ts": "581aa2862e709601c87a23585f54a969ebd350be56a7469a31ff53f1311b578d" + } + }, + { + "name": "artplayer-plugin-asr", + "version": "2.1.0", + "archive": "artplayer-plugin-asr.tgz", + "sha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "files": { + "package/ARCHITECTURE.md": "7a7492ab98d922cfecc3d632395f8571b204118e0cbe5f98a56d645ae51c3b18", + "package/README.md": "5e80fdcbb55c074724512e053b88b0cf1f29543c37c101cfbaa496c8c6228ebe", + "package/dist/artplayer-plugin-asr.js": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "package/dist/artplayer-plugin-asr.legacy.js": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "package/dist/artplayer-plugin-asr.mjs": "2449d2981912973e2fe8790f27db3452b6e53821e910225b55e2fbc4ba5f4f92", + "package/package.json": "781b1eebefdff5fdc234b793ff9d6d8263275115ccff4c4d90c55eca942f2444", + "package/types/artplayer-plugin-asr.d.ts": "afa3a72330cdfe7858d6aa3f95c4a77d6f19fd5c34da5adc084c0f83f5e3b99a", + "package/types/runtime.d.cts": "2965dccc49a3a75c3b16c0c13501077b8ac199e78bac2d19d57be3d811583606", + "package/types/runtime.d.mts": "ff0769d3e408d66c7d38574171ff2621456afccc50ee8191ca4ee394dc57666e", + "package/types/runtime.d.ts": "2965dccc49a3a75c3b16c0c13501077b8ac199e78bac2d19d57be3d811583606" + } + } + ] + } + } + ] + }, + "outputs": [ + { + "workspace": { + "path": "packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.js", + "sha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70" + }, + "docs": { + "path": "docs/compiled/artplayer-plugin-asr.js", + "sha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70" + }, + "installed": { + "path": "refactor/.cache/packages/run-gTeZ8R/artifacts/artplayer-plugin-asr/dist/artplayer-plugin-asr.js", + "sha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70" + } + }, + { + "workspace": { + "path": "packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js", + "sha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c" + }, + "docs": { + "path": "docs/compiled/artplayer-plugin-asr.legacy.js", + "sha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c" + }, + "installed": { + "path": "refactor/.cache/packages/run-gTeZ8R/artifacts/artplayer-plugin-asr/dist/artplayer-plugin-asr.legacy.js", + "sha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c" + } + }, + { + "workspace": { + "path": "packages/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs", + "sha256": "2449d2981912973e2fe8790f27db3452b6e53821e910225b55e2fbc4ba5f4f92" + }, + "docs": { + "path": "docs/compiled/artplayer-plugin-asr.mjs", + "sha256": "2449d2981912973e2fe8790f27db3452b6e53821e910225b55e2fbc4ba5f4f92" + }, + "installed": { + "path": "refactor/.cache/packages/run-gTeZ8R/artifacts/artplayer-plugin-asr/dist/artplayer-plugin-asr.mjs", + "sha256": "2449d2981912973e2fe8790f27db3452b6e53821e910225b55e2fbc4ba5f4f92" + } + } + ], + "browser": { + "finalPassed": 80, + "finalSkipped": 40, + "finalFailed": 0, + "finalRetries": 0, + "rounds": [ + { + "mode": "before", + "report": { + "path": "refactor/.cache/asr-media-error-before-report.json", + "sha256": "de3183e440161145683ebf3edda3787e440eb93678cfc94aeae8ef07ba38c549" + }, + "log": { + "path": "refactor/.cache/asr-media-error-before.log", + "sha256": "889168d0b3787bfa553f8d4069f48ed194e22eae47fcdbeaa2efefd2ac09b98c" + }, + "stats": { + "startTime": "2026-09-15T06:10:38.261Z", + "duration": 9793.175, + "expected": 0, + "skipped": 0, + "unexpected": 4, + "flaky": 0 + }, + "cases": [ + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:87:35", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 35, + "line": 87 + }, + "snippet": " 85 | const failed = await page.evaluate(() => window.mediaErrorState())\n 86 | await testInfo.attach('asr-native-media-failure', { contentType: 'application/json', body: JSON.stringify(failed) })\n> 87 | expect(failed.subtitle).not.toContain('Obsolete recognition')\n | ^\n 88 | if (mode === 'capture')\n 89 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true)\n 90 | await page.evaluate(() => {" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "f5fcf901c7e8c197f72d44ed6d7e4445cbad0c6ce2258d9127a765712d75b010" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 143.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 566.6999999880791, + "error": null + }, + { + "name": "video:error", + "at": 571.8000000119209, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "Obsolete recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 143.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 566.6999999880791, + "error": null + }, + { + "name": "video:error", + "at": 571.8000000119209, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported" + } + ], + "subtitle": "Recovered recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:87:35", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 35, + "line": 87 + }, + "snippet": " 85 | const failed = await page.evaluate(() => window.mediaErrorState())\n 86 | await testInfo.attach('asr-native-media-failure', { contentType: 'application/json', body: JSON.stringify(failed) })\n> 87 | expect(failed.subtitle).not.toContain('Obsolete recognition')\n | ^\n 88 | if (mode === 'capture')\n 89 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true)\n 90 | await page.evaluate(() => {" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "f5fcf901c7e8c197f72d44ed6d7e4445cbad0c6ce2258d9127a765712d75b010" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 147.19999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 570.1000000238419, + "error": null + }, + { + "name": "video:error", + "at": 578.3999999761581, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4085, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "Obsolete recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 147.19999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 570.1000000238419, + "error": null + }, + { + "name": "video:error", + "at": 578.3999999761581, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4085, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported" + } + ], + "subtitle": "Recovered recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:87:35", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 35, + "line": 87 + }, + "snippet": " 85 | const failed = await page.evaluate(() => window.mediaErrorState())\n 86 | await testInfo.attach('asr-native-media-failure', { contentType: 'application/json', body: JSON.stringify(failed) })\n> 87 | expect(failed.subtitle).not.toContain('Obsolete recognition')\n | ^\n 88 | if (mode === 'capture')\n 89 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true)\n 90 | await page.evaluate(() => {" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "f5fcf901c7e8c197f72d44ed6d7e4445cbad0c6ce2258d9127a765712d75b010" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 163.39999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 616.1999999880791, + "error": null + }, + { + "name": "video:error", + "at": 619, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "Obsolete recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 163.39999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 616.1999999880791, + "error": null + }, + { + "name": "video:error", + "at": 619, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported" + } + ], + "subtitle": "Recovered recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mnot\u001b[2m.\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: not \u001b[32m\"Obsolete recognition\"\u001b[39m\nReceived string: \u001b[31m\"\u001b[7mObsolete recognition\u001b[27m\"\u001b[39m\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:87:35", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 35, + "line": 87 + }, + "snippet": " 85 | const failed = await page.evaluate(() => window.mediaErrorState())\n 86 | await testInfo.attach('asr-native-media-failure', { contentType: 'application/json', body: JSON.stringify(failed) })\n> 87 | expect(failed.subtitle).not.toContain('Obsolete recognition')\n | ^\n 88 | if (mode === 'capture')\n 89 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true)\n 90 | await page.evaluate(() => {" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "f5fcf901c7e8c197f72d44ed6d7e4445cbad0c6ce2258d9127a765712d75b010" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 158, + "error": null + }, + { + "name": "video:emptied", + "at": 577.3999999761581, + "error": null + }, + { + "name": "video:error", + "at": 586, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "Obsolete recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 158, + "error": null + }, + { + "name": "video:emptied", + "at": 577.3999999761581, + "error": null + }, + { + "name": "video:error", + "at": 586, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported" + } + ], + "subtitle": "Recovered recognition", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + } + } + } + ] + }, + { + "mode": "source-initial", + "report": { + "path": "refactor/.cache/asr-media-error-source-initial-report.json", + "sha256": "520af3f1434f58c0e8f9484c352dc9443c9e0cea6a57e471557e748d62d50b33" + }, + "log": { + "path": "refactor/.cache/asr-media-error-source-initial.log", + "sha256": "44ae2ce9d6ed58a50c457768b6a1a51d55d3af95b581a561098fab04932e5702" + }, + "stats": { + "startTime": "2026-09-15T06:13:18.997Z", + "duration": 45079.2, + "expected": 5, + "skipped": 4, + "unexpected": 3, + "flaky": 0 + }, + "cases": [ + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 139.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 557.5, + "error": null + }, + { + "name": "video:error", + "at": 561.0999999642372, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 139.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 557.5, + "error": null + }, + { + "name": "video:error", + "at": 561.0999999642372, + "error": 4 + }, + { + "name": "video:emptied", + "at": 575, + "error": null + }, + { + "name": "restart", + "at": 579, + "error": null + }, + { + "name": "play", + "at": 639, + "error": null + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 123.60000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 492.5, + "error": null + }, + { + "name": "video:error", + "at": 497.4000000357628, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 123.60000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 492.5, + "error": null + }, + { + "name": "video:error", + "at": 497.4000000357628, + "error": 4 + }, + { + "name": "video:emptied", + "at": 512.8000000119209, + "error": null + }, + { + "name": "restart", + "at": 515.8000000119209, + "error": null + }, + { + "name": "play", + "at": 555.9000000357628, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 144.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 514.3000000119209, + "error": null + }, + { + "name": "video:error", + "at": 517.3000000119209, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 144.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 514.3000000119209, + "error": null + }, + { + "name": "video:error", + "at": 517.3000000119209, + "error": 4 + }, + { + "name": "video:emptied", + "at": 531.6999999880791, + "error": null + }, + { + "name": "restart", + "at": 536.3999999761581, + "error": null + }, + { + "name": "play", + "at": 593.8000000119209, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 139.89999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 277.5, + "error": null + }, + { + "name": "video:error", + "at": 282.39999997615814, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 139.89999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 277.5, + "error": null + }, + { + "name": "video:error", + "at": 282.39999997615814, + "error": 4 + }, + { + "name": "video:emptied", + "at": 301, + "error": null + }, + { + "name": "restart", + "at": 305.19999998807907, + "error": null + }, + { + "name": "play", + "at": 355.80000001192093, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:75:115", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 115, + "line": 75 + }, + "snippet": " 73 | await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true)\n 74 | await page.locator('#play').click()\n> 75 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().chunks.some(chunk => chunk.peak > 0))).toBe(true)\n | ^\n 76 | await page.evaluate(() => {\n 77 | window.art.video.src = '/test/manifest.json?asr-media-error=unsupported'\n 78 | })" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 466, + "error": null + }, + { + "name": "play", + "at": 717, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a", + "paused": false + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:75:115", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 115, + "line": 75 + }, + "snippet": " 73 | await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true)\n 74 | await page.locator('#play').click()\n> 75 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().chunks.some(chunk => chunk.peak > 0))).toBe(true)\n | ^\n 76 | await page.evaluate(() => {\n 77 | window.art.video.src = '/test/manifest.json?asr-media-error=unsupported'\n 78 | })" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 350, + "error": null + }, + { + "name": "play", + "at": 586, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a", + "paused": false + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "failed", + "retry": 0, + "annotations": [], + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n at D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js:75:115", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "column": 115, + "line": 75 + }, + "snippet": " 73 | await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true)\n 74 | await page.locator('#play').click()\n> 75 | await expect.poll(() => page.evaluate(() => window.mediaErrorState().chunks.some(chunk => chunk.peak > 0))).toBe(true)\n | ^\n 76 | await page.evaluate(() => {\n 77 | window.art.video.src = '/test/manifest.json?asr-media-error=unsupported'\n 78 | })" + }, + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 366, + "error": null + }, + { + "name": "play", + "at": 600, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a", + "paused": false + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 369, + "error": null + }, + { + "name": "play", + "at": 607, + "error": null + }, + { + "name": "video:emptied", + "at": 1037, + "error": null + }, + { + "name": "video:error", + "at": 1043, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4086, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 369, + "error": null + }, + { + "name": "play", + "at": 607, + "error": null + }, + { + "name": "video:emptied", + "at": 1037, + "error": null + }, + { + "name": "video:error", + "at": 1043, + "error": 4 + }, + { + "name": "video:emptied", + "at": 1074, + "error": null + }, + { + "name": "restart", + "at": 1083, + "error": null + }, + { + "name": "play", + "at": 1133, + "error": null + } + ], + "chunks": [ + { + "peak": 4086, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4160, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4194, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4264, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + } + ] + }, + { + "mode": "source", + "report": { + "path": "refactor/.cache/asr-media-error-source-report.json", + "sha256": "d5c15fc051eb9c28df9cb37933aac103edd4629dc6eae7d4c718718194de7589" + }, + "log": { + "path": "refactor/.cache/asr-media-error-source.log", + "sha256": "9ba3d7299d56bf57cac2c25a70822df47a3de8af53bf0b6812a63b9cd388dc8b" + }, + "stats": { + "startTime": "2026-09-15T06:15:03.513Z", + "duration": 21010.587, + "expected": 8, + "skipped": 4, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 142.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 581.7999999523163, + "error": null + }, + { + "name": "video:error", + "at": 585.6999999880791, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 142.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 581.7999999523163, + "error": null + }, + { + "name": "video:error", + "at": 585.6999999880791, + "error": 4 + }, + { + "name": "video:emptied", + "at": 600.7999999523163, + "error": null + }, + { + "name": "restart", + "at": 604, + "error": null + }, + { + "name": "play", + "at": 658.5, + "error": null + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2500, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2509, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 131.39999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 257.80000001192093, + "error": null + }, + { + "name": "video:error", + "at": 264, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 131.39999997615814, + "error": null + }, + { + "name": "video:emptied", + "at": 257.80000001192093, + "error": null + }, + { + "name": "video:error", + "at": 264, + "error": 4 + }, + { + "name": "video:emptied", + "at": 283.5999999642372, + "error": null + }, + { + "name": "restart", + "at": 287.69999998807907, + "error": null + }, + { + "name": "play", + "at": 332.19999998807907, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 136.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 260.7000000476837, + "error": null + }, + { + "name": "video:error", + "at": 264.2000000476837, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 136.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 260.7000000476837, + "error": null + }, + { + "name": "video:error", + "at": 264.2000000476837, + "error": 4 + }, + { + "name": "video:emptied", + "at": 277.5, + "error": null + }, + { + "name": "restart", + "at": 281, + "error": null + }, + { + "name": "play", + "at": 334.60000002384186, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2541, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 143.10000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 508.5, + "error": null + }, + { + "name": "video:error", + "at": 516.1000000238419, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 143.10000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 508.5, + "error": null + }, + { + "name": "video:error", + "at": 516.1000000238419, + "error": 4 + }, + { + "name": "video:emptied", + "at": 543.5, + "error": null + }, + { + "name": "restart", + "at": 548.3999999761581, + "error": null + }, + { + "name": "play", + "at": 592.6999999880791, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 399, + "error": null + }, + { + "name": "play", + "at": 621, + "error": null + }, + { + "name": "video:emptied", + "at": 1031, + "error": null + }, + { + "name": "video:error", + "at": 1036, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2526, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 399, + "error": null + }, + { + "name": "play", + "at": 621, + "error": null + }, + { + "name": "video:emptied", + "at": 1031, + "error": null + }, + { + "name": "video:error", + "at": 1036, + "error": 4 + }, + { + "name": "video:emptied", + "at": 1055, + "error": null + }, + { + "name": "restart", + "at": 1062, + "error": null + }, + { + "name": "play", + "at": 1115, + "error": null + }, + { + "name": "video:emptied", + "at": 2037, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2526, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2501, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2514, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2549, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 97, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 604, + "error": null + }, + { + "name": "video:error", + "at": 612, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4188, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 97, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 604, + "error": null + }, + { + "name": "video:error", + "at": 612, + "error": 4 + }, + { + "name": "video:emptied", + "at": 638, + "error": null + }, + { + "name": "restart", + "at": 645, + "error": null + }, + { + "name": "play", + "at": 697, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4188, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4188, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 114, + "error": null + }, + { + "name": "play", + "at": 201, + "error": null + }, + { + "name": "video:emptied", + "at": 618, + "error": null + }, + { + "name": "video:error", + "at": 627, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2546, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 114, + "error": null + }, + { + "name": "play", + "at": 201, + "error": null + }, + { + "name": "video:emptied", + "at": 618, + "error": null + }, + { + "name": "video:error", + "at": 627, + "error": 4 + }, + { + "name": "video:emptied", + "at": 659, + "error": null + }, + { + "name": "restart", + "at": 667, + "error": null + }, + { + "name": "play", + "at": 727, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2546, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2501, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2514, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 167, + "error": null + }, + { + "name": "play", + "at": 281, + "error": null + }, + { + "name": "video:emptied", + "at": 703, + "error": null + }, + { + "name": "video:error", + "at": 708, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 167, + "error": null + }, + { + "name": "play", + "at": 281, + "error": null + }, + { + "name": "video:emptied", + "at": 703, + "error": null + }, + { + "name": "video:error", + "at": 708, + "error": 4 + }, + { + "name": "video:emptied", + "at": 757, + "error": null + }, + { + "name": "restart", + "at": 770, + "error": null + }, + { + "name": "play", + "at": 835, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4245, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "kind": "source-build", + "file": null, + "sha256": "07e3c72ff8af09259a9aa014783f5f26a1ee9d5d7e1da4202df87a0ac674c9e0" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + } + ] + }, + { + "mode": "main", + "report": { + "path": "refactor/.cache/asr-media-error-main-report.json", + "sha256": "9265997f84ab6a0c6ea6bb556a6df742c7d64e60aa6ec0ffab2d5756adf155d4" + }, + "log": { + "path": "refactor/.cache/asr-media-error-main.log", + "sha256": "97c3400037256486322e4b8e63da2d0d457b85d57a1fcc78ddb770f5928a429f" + }, + "stats": { + "startTime": "2026-09-15T06:17:26.109Z", + "duration": 126254.24500000001, + "expected": 36, + "skipped": 18, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at t.initialize (:7:1749)\n at async :7:4905" + ], + "failedRequests": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + } + ], + "directBindings": 0, + "contexts": [ + "closed" + ], + "streams": [], + "retainedTracks": [], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + }, + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at t.initialize (:7:1749)\n at async :7:4905" + ], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4290, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4237, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4290, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4237, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at t.initialize (:7:1749)\n at async :7:4905" + ], + "failedRequests": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + } + ], + "directBindings": 0, + "contexts": [ + "closed" + ], + "streams": [], + "retainedTracks": [], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + }, + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at t.initialize (:7:1749)\n at async :7:4905" + ], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4158, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4167, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4215, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4189, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4288, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4249, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4218, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4246, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4158, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4167, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4215, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4189, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4288, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4249, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4218, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4246, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "running" + ], + "streams": [ + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4199, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4244, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4259, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4199, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4244, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4259, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "running" + ], + "streams": [ + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4215, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4248, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4183, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4231, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4242, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4215, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4248, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4183, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4231, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4242, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "capture-cors-final-observation": null + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "capture-cors-final-observation": null + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 141.10000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 513.8999999761581, + "error": null + }, + { + "name": "video:error", + "at": 517.6999999880791, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 141.10000002384186, + "error": null + }, + { + "name": "video:emptied", + "at": 513.8999999761581, + "error": null + }, + { + "name": "video:error", + "at": 517.6999999880791, + "error": 4 + }, + { + "name": "video:emptied", + "at": 531.6000000238419, + "error": null + }, + { + "name": "restart", + "at": 534.8999999761581, + "error": null + }, + { + "name": "play", + "at": 589.8999999761581, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 137.70000004768372, + "error": null + }, + { + "name": "video:emptied", + "at": 264.60000002384186, + "error": null + }, + { + "name": "video:error", + "at": 273.2000000476837, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 137.70000004768372, + "error": null + }, + { + "name": "video:emptied", + "at": 264.60000002384186, + "error": null + }, + { + "name": "video:error", + "at": 273.2000000476837, + "error": 4 + }, + { + "name": "video:emptied", + "at": 293.5, + "error": null + }, + { + "name": "restart", + "at": 298, + "error": null + }, + { + "name": "play", + "at": 354.10000002384186, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 132.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 509.19999998807907, + "error": null + }, + { + "name": "video:error", + "at": 512.5, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 132.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 509.19999998807907, + "error": null + }, + { + "name": "video:error", + "at": 512.5, + "error": 4 + }, + { + "name": "video:emptied", + "at": 541.3000000119209, + "error": null + }, + { + "name": "restart", + "at": 544.6999999880791, + "error": null + }, + { + "name": "play", + "at": 599.4000000357628, + "error": null + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2500, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2509, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 124, + "error": null + }, + { + "name": "video:emptied", + "at": 496.9000000357628, + "error": null + }, + { + "name": "video:error", + "at": 502.30000001192093, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 124, + "error": null + }, + { + "name": "video:emptied", + "at": 496.9000000357628, + "error": null + }, + { + "name": "video:error", + "at": 502.30000001192093, + "error": 4 + }, + { + "name": "video:emptied", + "at": 526.1000000238419, + "error": null + }, + { + "name": "restart", + "at": 529.9000000357628, + "error": null + }, + { + "name": "play", + "at": 574.5, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4167, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4255, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4182, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4260, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 137.19999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 521.0999999642372, + "error": null + }, + { + "name": "video:error", + "at": 529.6999999880791, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 137.19999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 521.0999999642372, + "error": null + }, + { + "name": "video:error", + "at": 529.6999999880791, + "error": 4 + }, + { + "name": "video:emptied", + "at": 558.6999999880791, + "error": null + }, + { + "name": "restart", + "at": 562.7999999523163, + "error": null + }, + { + "name": "play", + "at": 621.7999999523163, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2500, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 135.9000000357628, + "error": null + }, + { + "name": "video:emptied", + "at": 519.9000000357628, + "error": null + }, + { + "name": "video:error", + "at": 524.4000000357628, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 135.9000000357628, + "error": null + }, + { + "name": "video:emptied", + "at": 519.9000000357628, + "error": null + }, + { + "name": "video:error", + "at": 524.4000000357628, + "error": 4 + }, + { + "name": "video:emptied", + "at": 542, + "error": null + }, + { + "name": "restart", + "at": 545.8000000119209, + "error": null + }, + { + "name": "play", + "at": 586.3000000119209, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4167, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4255, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4182, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4260, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 101, + "error": null + }, + { + "name": "play", + "at": 212, + "error": null + }, + { + "name": "video:emptied", + "at": 623, + "error": null + }, + { + "name": "video:error", + "at": 628, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2494, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 101, + "error": null + }, + { + "name": "play", + "at": 212, + "error": null + }, + { + "name": "video:emptied", + "at": 623, + "error": null + }, + { + "name": "video:error", + "at": 628, + "error": 4 + }, + { + "name": "video:emptied", + "at": 645, + "error": null + }, + { + "name": "restart", + "at": 653, + "error": null + }, + { + "name": "play", + "at": 718, + "error": null + }, + { + "name": "video:emptied", + "at": 1633, + "error": null + } + ], + "chunks": [ + { + "peak": 2494, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2501, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2514, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2549, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 102, + "error": null + }, + { + "name": "play", + "at": 316, + "error": null + }, + { + "name": "video:emptied", + "at": 727, + "error": null + }, + { + "name": "video:error", + "at": 732, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 102, + "error": null + }, + { + "name": "play", + "at": 316, + "error": null + }, + { + "name": "video:emptied", + "at": 727, + "error": null + }, + { + "name": "video:error", + "at": 732, + "error": 4 + }, + { + "name": "video:emptied", + "at": 752, + "error": null + }, + { + "name": "restart", + "at": 761, + "error": null + }, + { + "name": "play", + "at": 826, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4245, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 98, + "error": null + }, + { + "name": "play", + "at": 180, + "error": null + }, + { + "name": "video:emptied", + "at": 590, + "error": null + }, + { + "name": "video:error", + "at": 595, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 98, + "error": null + }, + { + "name": "play", + "at": 180, + "error": null + }, + { + "name": "video:emptied", + "at": 590, + "error": null + }, + { + "name": "video:error", + "at": 595, + "error": 4 + }, + { + "name": "video:emptied", + "at": 612, + "error": null + }, + { + "name": "restart", + "at": 617, + "error": null + }, + { + "name": "play", + "at": 673, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 91, + "error": null + }, + { + "name": "play", + "at": 190, + "error": null + }, + { + "name": "video:emptied", + "at": 595, + "error": null + }, + { + "name": "video:error", + "at": 601, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 91, + "error": null + }, + { + "name": "play", + "at": 190, + "error": null + }, + { + "name": "video:emptied", + "at": 595, + "error": null + }, + { + "name": "video:error", + "at": 601, + "error": 4 + }, + { + "name": "video:emptied", + "at": 622, + "error": null + }, + { + "name": "restart", + "at": 629, + "error": null + }, + { + "name": "play", + "at": 680, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4245, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 105, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 599, + "error": null + }, + { + "name": "video:error", + "at": 603, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2545, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 105, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 599, + "error": null + }, + { + "name": "video:error", + "at": 603, + "error": 4 + }, + { + "name": "video:emptied", + "at": 621, + "error": null + }, + { + "name": "restart", + "at": 630, + "error": null + }, + { + "name": "play", + "at": 680, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2545, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2501, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2514, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 111, + "error": null + }, + { + "name": "play", + "at": 193, + "error": null + }, + { + "name": "video:emptied", + "at": 605, + "error": null + }, + { + "name": "video:error", + "at": 609, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 111, + "error": null + }, + { + "name": "play", + "at": 193, + "error": null + }, + { + "name": "video:emptied", + "at": 605, + "error": null + }, + { + "name": "video:error", + "at": 609, + "error": 4 + }, + { + "name": "video:emptied", + "at": 636, + "error": null + }, + { + "name": "restart", + "at": 642, + "error": null + }, + { + "name": "play", + "at": 702, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4160, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4194, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4264, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + } + ], + "media": { + "time": 1.810943, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0.39325, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at t.initialize (:7:1780)\n at async :7:4905" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.790007, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at t.initialize (:7:1780)\n at async :7:4905" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0.333063, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + } + ], + "media": { + "time": 1.804183, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0.378667, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at t.initialize (:7:1780)\n at async :7:4905" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.820711, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at t.initialize (:7:1780)\n at async :7:4905" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0.33633, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [], + "media": { + "time": 1.870992, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0.36, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.776243, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4160, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + } + ], + "media": { + "time": 0.362666, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4160, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [], + "media": { + "time": 1.791219, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0.36, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.784958, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4150, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4208, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4256, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + } + ], + "media": { + "time": 0.882666, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4150, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4208, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4256, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published-5.3.0", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08787948230355566, + "pcm": [ + 0.08835072539670251, + 0.08808053860419865, + 0.08778756430874764 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.022246404221227818, + "pcm": [ + 0.08778756430874764, + 0.04426866557912365, + 0.0444701668851365 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.0054766057046575665, + "pcm": [ + 0.0444701668851365, + 0.022075330653785093, + 0.02227207842432014 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.01802640660824271, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02211527189992743, + "pcm": [ + 0, + 0.04389501187689295, + 0.04399763280919699 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08899373366704011, + "pcm": [ + 0.0877633660849313, + 0.08831393066676758, + 0.08946979144057579 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021973417620766544, + "pcm": [ + 0.08946979144057579, + 0.04383005283875869, + 0.04398053383670986 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005479238383639084, + "pcm": [ + 0.04398053383670986, + 0.02294723508509991, + 0.022078521447244124 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.01883008803970856, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021881905314743953, + "pcm": [ + 0, + 0.04433052376797802, + 0.04434785403107414 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "candidate", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08881764562325266, + "pcm": [ + 0.08845850646989735, + 0.08920581671522691, + 0.08873534933928903 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.0219929082437882, + "pcm": [ + 0.08873534933928903, + 0.043647279661655436, + 0.04382086162955032 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.0054889531309362605, + "pcm": [ + 0.04382086162955032, + 0.02753776142880231, + 0.022082609916615908 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.018802786323679273, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02191927817418262, + "pcm": [ + 0.04417595782408277, + 0.04453984516022929, + 0.04391207156375677 + ] + } + ] + } + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published-5.3.0", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08796469854585355, + "pcm": [ + 0.08795775308358135, + 0.08878124722219483, + 0.08800097492301474 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044559566034143114, + "pcm": [ + 0.04430991648684296, + 0.044596180816154525, + 0.044378397916800434 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021912121516963288, + "pcm": [ + 0.022155495818042662, + 0.021816868180573042, + 0.022105326678381037 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04418047497169044, + "pcm": [ + 0.03767791056684492, + 0.044123469592345275, + 0.04434685721630363 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.0218007072709506, + "pcm": [ + 0.03767791056684492, + 0.044123469592345275, + 0.04434685721630363 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022000287936815296, + "pcm": [ + 0.02182742009657979, + 0.021982632054642157, + 0.021958760344495665 + ] + } + } + } + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08775032809431582, + "pcm": [ + 0.0883050442445268, + 0.08866511123953921, + 0.08770036081168703 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044467688262433025, + "pcm": [ + 0.04430890862445003, + 0.04448419659243059, + 0.04456807190430078 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021988159514982068, + "pcm": [ + 0.021858652213692063, + 0.022264040427332873, + 0.02183564101232853 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044277490739225385, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021930222420306306, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022213827390522967, + "pcm": [ + 0.022021088905864624, + 0.022085751968557686, + 0.022060814420923412 + ] + } + } + } + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "candidate", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08780572202537891, + "pcm": [ + 0.0883050442445268, + 0.08866511123953921, + 0.08770036081168703 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044467688262433025, + "pcm": [ + 0.04430890862445003, + 0.04448419659243059, + 0.04456807190430078 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021988159514982068, + "pcm": [ + 0.021858652213692063, + 0.022264040427332873, + 0.02183564101232853 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044277490739225385, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021930222420306306, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02198559315061824, + "pcm": [ + 0.021835771272249227, + 0.021951527145485605, + 0.0220374083355859 + ] + } + } + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published-5.3.0", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08911361260496614, + "pcm": [ + 0.08855371516543255, + 0.08921661917491973, + 0.08885541622111617 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02194707375892373, + "pcm": [ + 0.04415364360933533, + 0.04456905132518692, + 0.04365620070017901 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.0054856791510426665, + "pcm": [ + 0.03593056173830748, + 0.022036277098852145, + 0.021970316086764842 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.021970316086764842, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02180771275588487, + "pcm": [ + 0.04441367991490472, + 0.04424242432221851, + 0.04385696331738755 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08912685275780025, + "pcm": [ + 0.08806569795731894, + 0.08906136820059894, + 0.08881292144959071 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02194707375892373, + "pcm": [ + 0.0538994469044862, + 0.04364493781136172, + 0.04379788626181218 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.0054856791510426665, + "pcm": [ + 0.02210216636694911, + 0.02204141293959012, + 0.02203781349584488 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021854309327144418, + "pcm": [ + 0, + 0.044458640546815725, + 0.04444793222890891 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "candidate", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08886396360216711, + "pcm": [ + 0.08853333679709022, + 0.08916360164526327, + 0.08878285589121811 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021968354930148513, + "pcm": [ + 0.08878285589121811, + 0.04358297176566231, + 0.043659711102453314 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005480246246280377, + "pcm": [ + 0.02208047930411219, + 0.022042319293990177, + 0.02202451103888762 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02178571120620569, + "pcm": [ + 0.04441367991490472, + 0.04443658950945701, + 0.04385696331738755 + ] + } + ] + } + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published-5.3.0", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08940728509770036, + "pcm": [ + 0.08784014202375302, + 0.08948681281419237, + 0.08860720592719423 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04386953939901304, + "pcm": [ + 0.04427650739033863, + 0.04380943033532075, + 0.0439682697161229 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021958794854565592, + "pcm": [ + 0.03688321788888417, + 0.022178501578754582, + 0.021976284350103122 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0.01242763035171051, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.0439393347347574, + "pcm": [ + 0.04427983403380637, + 0.044339419298582795, + 0.04438180276871922 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022076308300997265, + "pcm": [ + 0.04427983403380637, + 0.044339419298582795, + 0.04438180276871922 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022171873675503648, + "pcm": [ + 0.02220114946844545, + 0.022166795925380886, + 0.02217514892282711 + ] + } + } + } + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08845187451056867, + "pcm": [ + 0.08764581308134357, + 0.08868078531214164, + 0.08832207248279998 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04470364254885018, + "pcm": [ + 0.04473653542507642, + 0.044296986412714734, + 0.04427968413643314 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02193476969950652, + "pcm": [ + 0.021898050861181014, + 0.021977304642445614, + 0.021992905994729868 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04419010266266127, + "pcm": [ + 0.04411792860634942, + 0.04414790888442041, + 0.04427520692950356 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021854309327144418, + "pcm": [ + 0.04411792860634942, + 0.04414790888442041, + 0.04427520692950356 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.0219904776900491, + "pcm": [ + 0.02184029398048793, + 0.02194748736357611, + 0.02202845896993363 + ] + } + } + } + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "candidate", + "pluginSha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "selected": { + "provenanceRef": "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08810013634479952, + "pcm": [ + 0.0884990064993636, + 0.08806198781379916, + 0.08878739867516433 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04448013269655777, + "pcm": [ + 0.04426693951862272, + 0.04456862990617027, + 0.04446017372248553 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02192255205233447, + "pcm": [ + 0.021786681020980823, + 0.02226592885090314, + 0.02181833916594806 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04432480753945975, + "pcm": [ + 0.0443846992598668, + 0.04385625519551284, + 0.0443854665150084 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022025085104559392, + "pcm": [ + 0.04385625519551284, + 0.0443854665150084, + 0.044319155176405306 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022005026069055793, + "pcm": [ + 0.022023171610807045, + 0.022021262647248404, + 0.022030605063019574 + ] + } + } + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + } + ] + }, + { + "mode": "legacy", + "report": { + "path": "refactor/.cache/asr-media-error-legacy-report.json", + "sha256": "e197ae0e1b9073026e4cae8672f2b05198d43f2f5ae972119b48fbe2def185ef" + }, + "log": { + "path": "refactor/.cache/asr-media-error-legacy.log", + "sha256": "ce8c7fa7229e7b26ad3df7b2ddbc7b3990e2b89ea4b938aecb52dfd98cdd8671" + }, + "stats": { + "startTime": "2026-09-15T06:20:01.951Z", + "duration": 124608.238, + "expected": 36, + "skipped": 18, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at e. (:7:1996)\n at Generator.next ()\n at r (:7:364)" + ], + "failedRequests": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + } + ], + "directBindings": 0, + "contexts": [ + "closed" + ], + "streams": [], + "retainedTracks": [], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + }, + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at e. (:7:1996)\n at Generator.next ()\n at r (:7:364)" + ], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4290, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4241, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4290, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4241, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at e. (:7:1996)\n at Generator.next ()\n at r (:7:364)" + ], + "failedRequests": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + } + ], + "directBindings": 0, + "contexts": [ + "closed" + ], + "streams": [], + "retainedTracks": [], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + }, + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: SecurityError: Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data\n at prototype. [as captureStream] (eval at evaluate (:311:30), :29:40)\n at e. (:7:1996)\n at Generator.next ()\n at r (:7:364)" + ], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4158, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4237, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4384, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": { + "name": "SecurityError", + "message": "Failed to execute 'captureStream' on 'HTMLMediaElement': Cannot capture from element with cross-origin data" + } + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4158, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4192, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4263, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4202, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4237, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4384, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "running" + ], + "streams": [ + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4204, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4238, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4197, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4226, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4181, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4204, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4238, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4197, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4251, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4226, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4181, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "opaque-native-capture-observation": { + "opaque": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "running" + ], + "streams": [ + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [] + }, + "responses": [ + { + "url": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "status": 206, + "allowOrigin": null + } + ], + "consoleErrors": [], + "properties": { + "src": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "crossOrigin": null, + "crossOriginAttribute": null, + "muted": false, + "defaultMuted": false, + "volume": 0.6, + "playbackRate": 1, + "autoplay": false, + "controls": false, + "loop": false, + "preload": "metadata", + "playsInline": true + }, + "clockAdvanced": true + }, + "same-origin-capture-recovery": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "running" + ], + "streams": [ + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": false, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ] + }, + { + "active": true, + "tracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4137, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4248, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4183, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + }, + "capture-cors-final-observation": { + "attempts": [ + { + "source": "http://localhost:8084/test/audio-tone.m4a?capture-cors=opaque", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "error": null + } + ], + "directBindings": 0, + "contexts": [ + "closed", + "closed", + "closed" + ], + "streams": [ + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + }, + { + "active": false, + "tracks": [] + } + ], + "retainedTracks": [ + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": true, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + }, + { + "kind": "audio", + "muted": false, + "enabled": true, + "readyState": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4305, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4188, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4257, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4247, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4261, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4253, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4256, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4250, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4137, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4248, + "pcmBytes": 3200, + "wavBytes": 3244 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?capture-cors=recovery", + "peak": 4183, + "pcmBytes": 3200, + "wavBytes": 3244 + } + ] + } + } + }, + { + "title": "ASR explicit capture + published: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "published", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "capture-cors-final-observation": null + } + }, + { + "title": "ASR explicit capture + candidate: opaque media keeps native routing and same-origin capture recovers", + "file": "asr-capture-cors.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "capture-cors-inputs": { + "core": "candidate", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "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" + }, + "capture-cors-final-observation": null + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 126, + "error": null + }, + { + "name": "video:emptied", + "at": 500.5, + "error": null + }, + { + "name": "video:error", + "at": 503.30000001192093, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 126, + "error": null + }, + { + "name": "video:emptied", + "at": 500.5, + "error": null + }, + { + "name": "video:error", + "at": 503.30000001192093, + "error": 4 + }, + { + "name": "video:emptied", + "at": 516.4000000357628, + "error": null + }, + { + "name": "restart", + "at": 519.7000000476837, + "error": null + }, + { + "name": "play", + "at": 576.4000000357628, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2541, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 148.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 525.3000000119209, + "error": null + }, + { + "name": "video:error", + "at": 530.4000000357628, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 148.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 525.3000000119209, + "error": null + }, + { + "name": "video:error", + "at": 530.4000000357628, + "error": 4 + }, + { + "name": "video:emptied", + "at": 546.1999999880791, + "error": null + }, + { + "name": "restart", + "at": 550.1999999880791, + "error": null + }, + { + "name": "play", + "at": 597.6000000238419, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4167, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4255, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4182, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4260, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 133.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 261.30000001192093, + "error": null + }, + { + "name": "video:error", + "at": 265.30000001192093, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 133.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 261.30000001192093, + "error": null + }, + { + "name": "video:error", + "at": 265.30000001192093, + "error": 4 + }, + { + "name": "video:emptied", + "at": 277.30000001192093, + "error": null + }, + { + "name": "restart", + "at": 280.60000002384186, + "error": null + }, + { + "name": "play", + "at": 332.5, + "error": null + } + ], + "chunks": [ + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2500, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2509, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 124.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 491.89999997615814, + "error": null + }, + { + "name": "video:error", + "at": 497.30000001192093, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 124.30000001192093, + "error": null + }, + { + "name": "video:emptied", + "at": 491.89999997615814, + "error": null + }, + { + "name": "video:error", + "at": 497.30000001192093, + "error": 4 + }, + { + "name": "video:emptied", + "at": 516.0999999642372, + "error": null + }, + { + "name": "restart", + "at": 519.1999999880791, + "error": null + }, + { + "name": "play", + "at": 574.3000000119209, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "play", + "at": 121.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 488.69999998807907, + "error": null + }, + { + "name": "video:error", + "at": 492.89999997615814, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 121.69999998807907, + "error": null + }, + { + "name": "video:emptied", + "at": 488.69999998807907, + "error": null + }, + { + "name": "video:error", + "at": 492.89999997615814, + "error": 4 + }, + { + "name": "video:emptied", + "at": 503.19999998807907, + "error": null + }, + { + "name": "restart", + "at": 508.0999999642372, + "error": null + }, + { + "name": "play", + "at": 555.0999999642372, + "error": null + } + ], + "chunks": [ + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2574, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2515, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2500, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2509, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2556, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "play", + "at": 133.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 510, + "error": null + }, + { + "name": "video:error", + "at": 517.3000000119209, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "play", + "at": 133.5999999642372, + "error": null + }, + { + "name": "video:emptied", + "at": 510, + "error": null + }, + { + "name": "video:error", + "at": 517.3000000119209, + "error": 4 + }, + { + "name": "video:emptied", + "at": 539.1999999880791, + "error": null + }, + { + "name": "restart", + "at": 544.3999999761581, + "error": null + }, + { + "name": "play", + "at": 599.3999999761581, + "error": null + } + ], + "chunks": [ + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4192, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4263, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4167, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4255, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4182, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4260, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 103, + "error": null + }, + { + "name": "play", + "at": 207, + "error": null + }, + { + "name": "video:emptied", + "at": 614, + "error": null + }, + { + "name": "video:error", + "at": 619, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 103, + "error": null + }, + { + "name": "play", + "at": 207, + "error": null + }, + { + "name": "video:emptied", + "at": 614, + "error": null + }, + { + "name": "video:error", + "at": 619, + "error": 4 + }, + { + "name": "video:emptied", + "at": 635, + "error": null + }, + { + "name": "restart", + "at": 642, + "error": null + }, + { + "name": "play", + "at": 697, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2557, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2501, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 101, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 596, + "error": null + }, + { + "name": "video:error", + "at": 601, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4068, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 101, + "error": null + }, + { + "name": "play", + "at": 187, + "error": null + }, + { + "name": "video:emptied", + "at": 596, + "error": null + }, + { + "name": "video:error", + "at": 601, + "error": 4 + }, + { + "name": "video:emptied", + "at": 622, + "error": null + }, + { + "name": "restart", + "at": 628, + "error": null + }, + { + "name": "play", + "at": 678, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4068, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4160, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4194, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4264, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4168, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4183, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4262, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 97, + "error": null + }, + { + "name": "play", + "at": 192, + "error": null + }, + { + "name": "video:emptied", + "at": 590, + "error": null + }, + { + "name": "video:error", + "at": 597, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2526, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 97, + "error": null + }, + { + "name": "play", + "at": 192, + "error": null + }, + { + "name": "video:emptied", + "at": 590, + "error": null + }, + { + "name": "video:error", + "at": 597, + "error": 4 + }, + { + "name": "video:emptied", + "at": 613, + "error": null + }, + { + "name": "restart", + "at": 619, + "error": null + }, + { + "name": "play", + "at": 666, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2526, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 98, + "error": null + }, + { + "name": "play", + "at": 182, + "error": null + }, + { + "name": "video:emptied", + "at": 595, + "error": null + }, + { + "name": "video:error", + "at": 599, + "error": 4 + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4059, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 98, + "error": null + }, + { + "name": "play", + "at": 182, + "error": null + }, + { + "name": "video:emptied", + "at": 595, + "error": null + }, + { + "name": "video:error", + "at": 599, + "error": 4 + }, + { + "name": "video:emptied", + "at": 622, + "error": null + }, + { + "name": "restart", + "at": 629, + "error": null + }, + { + "name": "play", + "at": 692, + "error": null + } + ], + "chunks": [ + { + "peak": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4059, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4188, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4171, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4261, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4191, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4256, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "running" + ], + "events": [ + { + "name": "video:emptied", + "at": 103, + "error": null + }, + { + "name": "play", + "at": 190, + "error": null + }, + { + "name": "video:emptied", + "at": 613, + "error": null + }, + { + "name": "video:error", + "at": 621, + "error": 4 + } + ], + "chunks": [ + { + "peak": 2494, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 103, + "error": null + }, + { + "name": "play", + "at": 190, + "error": null + }, + { + "name": "video:emptied", + "at": 613, + "error": null + }, + { + "name": "video:error", + "at": 621, + "error": 4 + }, + { + "name": "video:emptied", + "at": 638, + "error": null + }, + { + "name": "restart", + "at": 644, + "error": null + }, + { + "name": "play", + "at": 702, + "error": null + } + ], + "chunks": [ + { + "peak": 2494, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 2582, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2512, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 2553, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-native-media-failure": { + "contexts": [ + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 116, + "error": null + }, + { + "name": "play", + "at": 207, + "error": null + }, + { + "name": "video:emptied", + "at": 636, + "error": null + }, + { + "name": "video:error", + "at": 647, + "error": 4 + } + ], + "chunks": [ + { + "peak": 4086, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + } + ], + "subtitle": "", + "error": 4, + "source": "http://127.0.0.1:8084/test/manifest.json?asr-media-error=unsupported", + "paused": true + }, + "asr-media-error-final": { + "contexts": [ + "closed", + "closed" + ], + "events": [ + { + "name": "video:emptied", + "at": 116, + "error": null + }, + { + "name": "play", + "at": 207, + "error": null + }, + { + "name": "video:emptied", + "at": 636, + "error": null + }, + { + "name": "video:error", + "at": 647, + "error": 4 + }, + { + "name": "video:emptied", + "at": 671, + "error": null + }, + { + "name": "restart", + "at": 678, + "error": null + }, + { + "name": "play", + "at": 735, + "error": null + } + ], + "chunks": [ + { + "peak": 4086, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a" + }, + { + "peak": 4158, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4245, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + }, + { + "peak": 4257, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery" + } + ], + "subtitle": "", + "error": null, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-media-error=recovery", + "paused": true + } + } + }, + { + "title": "ASR default + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published-5.3.0: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published-5.3.0", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + published: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR capture + candidate: native media error invalidates pending recognition and permits recovery", + "file": "asr-media-error.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-media-error.spec.js", + "line": 29, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-media-error-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "recognizer": "Controlled pending caller Promise; PCM and media errors are native", + "errorSource": "/test/manifest.json", + "mediaAssignment": "public art.video.src" + }, + "asr-media-error-final": null + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + } + ], + "media": { + "time": 1.804216, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0.386667, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at e. (:7:2027)\n at Generator.next ()\n at r (:7:364)" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.815133, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at e. (:7:2027)\n at Generator.next ()\n at r (:7:364)" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0.32245, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + } + ], + "media": { + "time": 1.798689, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0.386667, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "peak": 0, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2547, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at e. (:7:2027)\n at Generator.next ()\n at r (:7:364)" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/pattern.mp4", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + }, + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.805716, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: InvalidStateError: Failed to execute 'createMediaStreamSource' on 'AudioContext': MediaStream has no audio track\n at window.AudioContext.createMediaStreamSource (eval at evaluate (:311:30), :26:26)\n at e. (:7:2027)\n at Generator.next ()\n at r (:7:364)" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0.336206, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4158, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4263, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [], + "media": { + "time": 1.805906, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0.368, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.859795, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4108, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4252, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4254, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4258, + "bytes": 3200 + } + ], + "media": { + "time": 0.88, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4108, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4192, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4252, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4254, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4258, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [], + "media": { + "time": 1.816264, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "running" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0.368, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "direct", + "source": "http://127.0.0.1:8084/test/pattern.mp4" + } + ], + "contexts": [ + "closed" + ], + "tracks": [], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2582, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2512, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 2553, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "function", + "worklet": "function", + "capture": "function", + "mozCapture": "function" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-playing": { + "silent": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + } + ], + "contexts": [ + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + } + ], + "chunks": [], + "media": { + "time": 1.809473, + "source": "http://127.0.0.1:8084/test/pattern.mp4", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "errors": [ + "[artplayerPluginAsr] Initialization failed: JSHandle@object" + ], + "changingDecodedPixels": true + }, + "asr-audio-recovered": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "running" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "live" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4160, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4168, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4183, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + } + ], + "media": { + "time": 0.882666, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": false, + "error": null, + "volume": 0.6, + "muted": false + } + }, + "asr-no-audio-final": { + "bindings": [ + { + "kind": "stream", + "audio": 0, + "video": 1 + }, + { + "kind": "stream", + "audio": 1, + "video": 0 + } + ], + "contexts": [ + "closed", + "closed" + ], + "tracks": [ + { + "kind": "video", + "state": "ended" + }, + { + "kind": "audio", + "state": "ended" + } + ], + "chunks": [ + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4160, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4194, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4264, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4168, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4257, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4183, + "bytes": 3200 + }, + { + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "peak": 4262, + "bytes": 3200 + } + ], + "media": { + "time": 0, + "source": "http://127.0.0.1:8084/test/audio-tone.m4a?asr-no-audio=recovery", + "paused": true, + "error": null, + "volume": 0.6, + "muted": false + } + } + } + }, + { + "title": "ASR default + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR capture + published: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "published", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR default + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "default", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR capture + candidate: video-only input keeps playback and recovers audio capture after switching", + "file": "asr-no-audio.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "annotations": [ + { + "type": "skip", + "description": "Windows WebKit has no WebAudio; not an Apple-device ASR acceptance", + "location": { + "file": "D:\\github\\ArtPlayer\\test\\browser\\asr-no-audio.spec.js", + "line": 36, + "column": 14 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-no-audio-inputs": { + "core": "candidate", + "mode": "capture", + "capabilities": { + "context": "undefined", + "worklet": "undefined", + "capture": "undefined", + "mozCapture": "undefined" + }, + "provenance": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "videoSha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "audioSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "forcedException": false, + "physicalAudioOutput": false + }, + "asr-no-audio-final": null + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published-5.3.0", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08869937889857589, + "pcm": [ + 0.08845850646989735, + 0.08920581671522691, + 0.08873534933928903 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.0219929082437882, + "pcm": [ + 0.08873534933928903, + 0.043647279661655436, + 0.04382086162955032 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005489132588793657, + "pcm": [ + 0.04382086162955032, + 0.022998663300253012, + 0.022082609916615908 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.018802786323679273, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02185291103345544, + "pcm": [ + 0, + 0.04416826003408665, + 0.04456043476535389 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08893537652486605, + "pcm": [ + 0.08787946197693994, + 0.08831393066676758, + 0.08946979144057579 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021998937691154137, + "pcm": [ + 0.08946979144057579, + 0.04383005283875869, + 0.04398588058411821 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.00547318859760831, + "pcm": [ + 0.04398588058411821, + 0.029555717831295986, + 0.02197440376220297 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.02081478783722802, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02187457829970592, + "pcm": [ + 0.028436252440869548, + 0.04429160160247414, + 0.04420321607182133 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "candidate", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08869937889857589, + "pcm": [ + 0.08845850646989735, + 0.08920581671522691, + 0.08873534933928903 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.022060637301205763, + "pcm": [ + 0.08873534933928903, + 0.0704430701616106, + 0.04382086162955032 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005470987673812252, + "pcm": [ + 0.02965964765401842, + 0.022082609916615908, + 0.022042078815232683 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.022042078815232683, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021928894984433157, + "pcm": [ + 0, + 0.04417595782408277, + 0.04396218678565687 + ] + } + ] + } + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published-5.3.0", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08775032809431582, + "pcm": [ + 0.0883050442445268, + 0.08866511123953921, + 0.08770036081168703 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044496866833520055, + "pcm": [ + 0.04430890862445003, + 0.04448419659243059, + 0.04456807190430078 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021973417620766544, + "pcm": [ + 0.021858652213692063, + 0.022264040427332873, + 0.02183564101232853 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044194221418538814, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02187457829970592, + "pcm": [ + 0.04396084522213605, + 0.044432151516888986, + 0.04395881000500656 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02202411885421048, + "pcm": [ + 0.021804498345921568, + 0.02198419956474147, + 0.021982649795519126 + ] + } + } + } + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08787948230355566, + "pcm": [ + 0.08795775308358135, + 0.08878124722219483, + 0.08800097492301474 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044492808442455636, + "pcm": [ + 0.04430991648684296, + 0.044596180816154525, + 0.044378397916800434 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02194410751949727, + "pcm": [ + 0.021816868180573042, + 0.022105326678381037, + 0.021903387849962052 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04423054379985486, + "pcm": [ + 0.04442405714277681, + 0.04386321129881638, + 0.044346254907267436 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02191927817418262, + "pcm": [ + 0.04442405714277681, + 0.04386321129881638, + 0.044346254907267436 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021983035902468993, + "pcm": [ + 0.02181143044178004, + 0.0219679614190671, + 0.02201840433077935 + ] + } + } + } + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "chromium", + "browser": "153.0.8010.12", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [ + { + "url": "http://127.0.0.1:8084/test/audio-tone.m4a", + "resourceType": "media", + "failure": { + "errorText": "net::ERR_ABORTED" + } + } + ], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "candidate", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08796469854585355, + "pcm": [ + 0.08795775308358135, + 0.08878124722219483, + 0.08800097492301474 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04450800610770228, + "pcm": [ + 0.04430991648684296, + 0.044596180816154525, + 0.044378397916800434 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021912121516963288, + "pcm": [ + 0.021816868180573042, + 0.022105326678381037, + 0.021903387849962052 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04416012729095513, + "pcm": [ + 0.044123469592345275, + 0.04434685721630363, + 0.04387337831145842 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02185291103345544, + "pcm": [ + 0.04434685721630363, + 0.04387337831145842, + 0.04439994985841757 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022000287936815296, + "pcm": [ + 0.02182742009657979, + 0.021982632054642157, + 0.021958760344495665 + ] + } + } + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published-5.3.0", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08904967086996865, + "pcm": [ + 0.08855371516543255, + 0.08853333679709022, + 0.08916360164526327 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02194707375892373, + "pcm": [ + 0.04921297200168736, + 0.04369602815096391, + 0.04365620070017901 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.0054830108316244654, + "pcm": [ + 0.022106203712787546, + 0.02202451103888762, + 0.021970316086764842 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021835679200481448, + "pcm": [ + 0, + 0.04435146220544914, + 0.04445195000984118 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "published", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08904225607153446, + "pcm": [ + 0.08855469092733274, + 0.08921692807422214, + 0.08885600774915095 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021960467512092786, + "pcm": [ + 0.08878238089452287, + 0.049211640485482634, + 0.04456854555658749 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005481031538353114, + "pcm": [ + 0.02203661986357328, + 0.02205554910929216, + 0.021914593194844137 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.021914593194844137, + 0.01074041116181024, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.02180771275588487, + "pcm": [ + 0.01557073756192592, + 0.04424242432221851, + 0.04385696331738755 + ] + } + ] + } + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "2.1.0", + "core": "candidate", + "pluginSha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d", + "selected": { + "kind": "published", + "version": "2.1.0", + "sha256": "7f975b131a9ea207f88a157aafec778bc4906230500db9b30f5bbfbf327b251d" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08904225607153446, + "pcm": [ + 0.08806801916229816, + 0.08906166922697853, + 0.088771837021475 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021960467512092786, + "pcm": [ + 0.0491113025038852, + 0.0435833207860825, + 0.04456854555658749 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 0.25, + "rms": 0.005485413595725441, + "pcm": [ + 0.039047587662621126, + 0.022042451448579678, + 0.022019974819111478 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 0.5, + "rms": 0, + "pcm": [ + 0.022019974819111478, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 0.5, + "rms": 0.021854309327144418, + "pcm": [ + 0.008443926588161727, + 0.044458640546815725, + 0.04444793222890891 + ] + } + ] + } + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published-5.3.0", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08855895958891209, + "pcm": [ + 0.08908183979042286, + 0.08764581308134357, + 0.08868078531214164 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044633353690720357, + "pcm": [ + 0.04473653542507642, + 0.044296986412714734, + 0.04427968413643314 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021989446480124193, + "pcm": [ + 0.021898050861181014, + 0.021977304642445614, + 0.021992905994729868 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04413579171123217, + "pcm": [ + 0.04411792860634942, + 0.04414790888442041, + 0.04427520692950356 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021913630369413562, + "pcm": [ + 0.04411792860634942, + 0.04414790888442041, + 0.04427520692950356 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022014059038695664, + "pcm": [ + 0.021872597774304888, + 0.02200811190489522, + 0.021987152682026105 + ] + } + } + } + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "published", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08852997168333146, + "pcm": [ + 0.0889094072471484, + 0.08793253805241841, + 0.08875856883304752 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.044661544512328274, + "pcm": [ + 0.04435064214655401, + 0.04458171970984217, + 0.04437906713383526 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022011989894107277, + "pcm": [ + 0.021815722666330063, + 0.02207708505402961, + 0.021914709479212778 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04405022280685774, + "pcm": [ + 0.0441875108666125, + 0.04416586853126714, + 0.04403555895876407 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021960225713345063, + "pcm": [ + 0.0441875108666125, + 0.04416586853126714, + 0.04403555895876407 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.022054510226932084, + "pcm": [ + 0.02186797836392918, + 0.02200784493438205, + 0.021986612245612783 + ] + } + } + } + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "firefox", + "browser": "155.0", + "platform": "win32", + "status": "passed", + "retry": 0, + "annotations": [], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": { + "asr-playback-inputs": { + "version": "candidate", + "core": "candidate", + "pluginSha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "selected": { + "provenanceRef": "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd" + }, + "mediaSha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "meter": "Native unity analyser inserted between plugin gain and destination", + "physicalAudioOutput": false + }, + "asr-playback-levels": [ + { + "volume": 1, + "muted": false, + "gain": 1, + "rms": 0.08796622066748236, + "pcm": [ + 0.08856621011290323, + 0.08802579381840739, + 0.08877629138222441 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04450892667220991, + "pcm": [ + 0.04426222419987773, + 0.044579330514580504, + 0.04444434303170814 + ] + }, + { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021956920684417715, + "pcm": [ + 0.021783230316330178, + 0.02224751321941901, + 0.021832039170324335 + ] + }, + { + "volume": 0.5, + "muted": true, + "gain": 1, + "rms": 0, + "pcm": [ + 0, + 0, + 0 + ] + }, + { + "volume": 0.5, + "muted": false, + "gain": 1, + "rms": 0.04406337941797656, + "pcm": [ + 0.04412210363241919, + 0.04435791086065361, + 0.043868818000666734 + ] + } + ], + "asr-playback-restart": { + "stopped": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.021946426944436867, + "pcm": [ + 0.04412210363241919, + 0.04435791086065361, + 0.043868818000666734 + ] + }, + "resumed": { + "volume": 0.25, + "muted": false, + "gain": 1, + "rms": 0.02202188032794338, + "pcm": [ + 0.02200811190489522, + 0.021987152682026105, + 0.02206908144513587 + ] + } + } + } + }, + { + "title": "ASR 2.1.0 + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR 2.1.0 + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR 2.1.0 + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + published-5.3.0: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + published: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + }, + { + "title": "ASR candidate + candidate: native playback volume and mute", + "file": "asr-playback.spec.js", + "engine": "webkit", + "browser": "26.6", + "platform": "win32", + "status": "skipped", + "retry": 0, + "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 + } + } + ], + "errors": [], + "consoleErrors": [], + "failedRequests": [], + "observations": {} + } + ] + } + ], + "provenance": { + "c8c39065ae1ca05f97b42bd49dcb5a3140ec5570b7654b049cf47ddd8b01f056": { + "kind": "installed", + "name": "artplayer-plugin-asr", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer-plugin-asr\\dist\\artplayer-plugin-asr.js", + "member": "package/dist/artplayer-plugin-asr.js", + "sha256": "51679054326f6fff40be415483aa0571f0069792bad08c0a8392ce53dfe9cb70", + "archiveSha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "sourceHashes": { + "src/audio-graph.ts": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4", + "src/capture.ts": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a", + "src/encoding.ts": "a1dbc731d5d47a6ae313728cf45e96250e7bf8c6e00a9e071781acc366235944", + "src/index.ts": "fbfc1dc6c3e848f30e452fbeaf6cb7593b050a839e9fdd2980336b77edeb4ff8", + "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" + } + }, + "14fd939c5e6cae56c5eb1baeb32f4b49cc855728d7a88fd59724a1eab93c45cd": { + "kind": "installed", + "name": "artplayer-plugin-asr", + "file": "D:\\github\\ArtPlayer\\refactor\\.cache\\packages\\run-gTeZ8R\\artifacts\\artplayer-plugin-asr\\dist\\artplayer-plugin-asr.legacy.js", + "member": "package/dist/artplayer-plugin-asr.legacy.js", + "sha256": "d2dacbffe68097c0e45c1dbe64309eb72532243618ddfb59b86e4ed50dcc390c", + "archiveSha256": "2b17308d429cdcd1c6c0b2e4f2dd542634992e1252a480601b3c16c79c7e8635", + "sourceHashes": { + "src/audio-graph.ts": "abe87a81af7c3864d7b3255b7d8033fdc8c204b26025939f58338439a858ece4", + "src/capture.ts": "9cec5de6d09e6ce859b166ae4f41f2c4be7754b437a8e228bf4b02ef7bab212a", + "src/encoding.ts": "a1dbc731d5d47a6ae313728cf45e96250e7bf8c6e00a9e071781acc366235944", + "src/index.ts": "fbfc1dc6c3e848f30e452fbeaf6cb7593b050a839e9fdd2980336b77edeb4ff8", + "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" + } + } + } + }, + "limitations": [ + "Media failure is a native code4 from nonmedia HTTP content assigned through public art.video.src; not a network-outage or all-decoder-failures claim.", + "Caller recognition Promise is controlled; media, PCM, errors and contexts are native.", + "Initial Firefox failures occurred before media error because a zero-PCM callback was held; guard now arms on nonzero PCM without loosening the audio assertion.", + "Source final covers core5.4.0 and candidate; final installed tests add actual core5.3.0 and normal no-audio/CORS/volume/mute controls.", + "WebKit WebAudio skips do not establish Safari or physical-device acceptance.", + "ASR-05, remote CI and release review gates remain open; no dependencies, lock or public declarations changed." + ] +} diff --git a/refactor/changes/2026-09-15-PKG-ASR-10-media-error.md b/refactor/changes/2026-09-15-PKG-ASR-10-media-error.md new file mode 100644 index 000000000..4aa7948df --- /dev/null +++ b/refactor/changes/2026-09-15-PKG-ASR-10-media-error.md @@ -0,0 +1,64 @@ +# PKG-ASR-10 原生媒体错误取消与恢复 + +来源 HEAD:`3c89b48514e9fe02b4cac64a1630c50380c4c947`。从 PKG-ASR-05 的 +不支持媒体验收中拆出本项独立缺陷修复,任务05新增对此项的依赖。 + +## 问题与修复 + +真实 PCM 进入调用方识别 Promise 后,通过公开 `art.video.src` 切换到 HTTP +JSON 内容,Chromium 发出 `video:emptied`、`video:error`(MediaError code 4), +但没有 pause。此前 ASR 只处理 play/pause/restart/destroy,仍运行原采集会话。 +延迟识别完成会把失败媒体的过期字幕显示出来,显式捕获图也仍保持 running。 +两种模式和新旧核心的四项原生复现全部失败于旧字幕断言。 + +修复在工厂注册处将 `video:error` 连接到既有 `capture.stop()` 路径,并在 destroy +时对称移除该监听。不另建状态机、不改变停止语义:错误会同步清空队列/定时器, +使 pending 识别和迟到 Worklet 消息失效;捕获模式关闭 Context/轨道,默认直接 +绑定保留视频所需的原音频连接。已有字幕沿用原 auto-hide 期限,后续合法播放 +可以复用或重新创建采集。不会取消调用方自己的识别网络请求。 + +这不是声称普通 `art.url` 切换必然有同一问题,也不是网络中断/所有解码错误的 +完整证明。本轮原生错误来自不可解码 HTTP 内容;受控单测覆盖相同错误事件在 +其他异步阶段的取消。正常参数、根及 `/runtime` 类型、返回对象、事件名、分发 +入口保持不变;改变的是错误后不应继续显示旧识别结果的行为。 + +## 测试与构建 + +新增五项单元回归,旧代码全部失败、修复后全部通过:两种模式的 pending 识别 +与迟到 port 消息、两种模式的 Worklet 加载中取消、延迟捕获关闭期间取消重启。 +同时检查默认 Context 保留、捕获资源释放、正常再播放、既有字幕期限和销毁解绑。 + +原生 `asr-media-error.spec.js` 使用真实本地 AAC、AudioContext/Worklet、原生错误; +只有调用方识别 Promise 由测试控制。验证错误后旧结果不显示,随后切回 AAC +恢复至少三块非零 PCM 和正常字幕,销毁关闭所有 Context。安装轮包含真实旧核心 +5.3.0、5.4.0 与候选核心,以及两种音频输入模式。 + +第一轮跨浏览器检查的三个 Firefox 失败发生在触发错误之前:测试挂起了首个 +静音块,又等待被该 Promise 阻止的后续非零块。已修正为仅在首个非零 PCM +到达后挂起识别;保留失败报告、原 7 秒等待和非零 PCM 断言,不作为生产回归。 + +正常 `yarn build artplayer-plugin-asr` 生成 main/legacy/ESM 与 docs/compiled。 +三个格式都与隔离安装快照逐字节相同。`run-gTeZ8R` 通过重新构建、Yarn pack、 +仓库外安装/冻结复装及文件核验;通用 36 runtime、5 旧类型、8 精确类型仍只 +属于 core/chapter,ASR 的运行证据来自本批专项与实际安装浏览器测试。 + +最终命令、版本、输入指纹、失败与通过结果见 +[验证记录](../baselines/asr-media-error-validation.json)。Node 24.21.0、Yarn 1.22.22; +234 项 ASR 专项及 main/legacy 各43项生命周期回归通过,类型/lint/工具链与清单 +检查通过。安装回归同时保留正常音量/静音、无音轨和跨域显式捕获用例。 +Windows WebKit 无 WebAudio 的项目明确跳过,不以这些跳过关闭设备要求。 + +最终源码轮为 8 通过/4 能力跳过;加入 5.3.0 错误路径及正常回归的 installed +main/legacy 各 36 通过/18 能力跳过。合计 80 通过、40 跳过、0 失败、0 重试。 +这与修复前四项全红及测试等待修正前的 5 通过/3 失败/4 跳过分别保存,不能 +合并成一个全部成功的历史结果。Chromium 的媒体取消诊断仍保留在机器证据中。 + +## 维护与剩余 + +包内 README/ARCHITECTURE 解释新错误边界、监听所有权、重启和调用方请求职责。 +`test:asr`、`test:unit` 与 installed CI 清单均纳入回归;远端 CI 仍待执行。 +没有新增依赖或改锁,类型文件未改;最终各包大版本升级由既有发布任务承接。 + +本项不关闭 PKG-ASR-05 的其他不支持媒体、真实设备或分发门槛,也不改变默认 +CORS 限制。回退需同时撤销错误监听/解绑、测试/文档并正常重建产物;这样会 +重新引入已证明的过期识别问题。未推送、部署或发布。 diff --git a/refactor/plan.md b/refactor/plan.md index 697e7b1e8..97a192c6a 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -2,9 +2,9 @@ > 由 tasks.json 生成。请修改数据后运行 `node refactor/scripts/plan.mjs --write`,不要手改本表。 -基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 266 项,范围 22 个包及工作区/示例。 +基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 267 项,范围 22 个包及工作区/示例。 -状态:todo 43 / doing 21 / blocked 0 / done 202 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 43 / doing 21 / blocked 0 / done 203 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -17,7 +17,7 @@ | artplayer | 5.4.1 | CORE-01, CORE-02, CORE-03, CORE-04, CORE-05, CORE-06, CORE-07, CORE-08, CORE-09, CORE-10, CORE-11, CORE-12, CORE-13, CORE-14, CORE-15, CORE-16, CORE-17, CORE-18, CORE-19, CORE-20, CORE-21, CORE-23, CORE-22, CORE-24, SITE-BUILD-01, CORE-25, ENG-12, CORE-SUBTITLE-OFFSET-01, PKG-MULTI-SUB-09, ENG-LINT-02 | | artplayer-plugin-ads | 2.1.0 | PKG-ADS-01, PKG-ADS-02, PKG-ADS-03, PKG-ADS-04, PKG-ADS-05, PKG-ADS-06 | | artplayer-plugin-ambilight | 1.1.0 | PKG-AMBILIGHT-01, PKG-AMBILIGHT-02, PKG-AMBILIGHT-03, PKG-AMBILIGHT-04, PKG-AMBILIGHT-PROXY-01, PKG-AMBILIGHT-05, PKG-AMBILIGHT-06, PKG-FACTORY-01 | -| artplayer-plugin-asr | 2.1.0 | PKG-ASR-01, PKG-ASR-02, PKG-ASR-03, PKG-ASR-04, PKG-ASR-05, PKG-ASR-06, PKG-ASR-07, PKG-ASR-08, PKG-ASR-09 | +| artplayer-plugin-asr | 2.1.0 | PKG-ASR-01, PKG-ASR-02, PKG-ASR-03, PKG-ASR-04, PKG-ASR-05, PKG-ASR-06, PKG-ASR-07, PKG-ASR-08, PKG-ASR-09, PKG-ASR-10 | | artplayer-plugin-audio-track | 1.1.0 | PKG-AUDIO-01, PKG-AUDIO-02, PKG-AUDIO-03, PKG-AUDIO-04, PKG-AUDIO-05, PKG-AUDIO-06 | | artplayer-plugin-auto-thumbnail | 1.1.0 | PKG-AUTO-THUMB-01, PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-03, PKG-AUTO-THUMB-04, PKG-AUTO-THUMB-05, PKG-AUTO-THUMB-06, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-08, PKG-AUTO-THUMB-09, PKG-AUTO-THUMB-10, PKG-AUTO-THUMB-11, PKG-AUTO-THUMB-12 | | artplayer-plugin-chapter | 1.1.0 | PILOT-01, PKG-CHAPTER-01, PKG-CHAPTER-02, PKG-CHAPTER-03, PKG-CHAPTER-04, PKG-CHAPTER-05, PKG-CHAPTER-06, PKG-CHAPTER-HOVER-01 | @@ -275,11 +275,12 @@ | PKG-ASR-02 | artplayer-plugin-asr
建立特有行为与错误测试 | PKG-ASR-01, ENG-03, ENG-05 | PCM/WAV、chunk 时序、回调慢/拒绝、重复初始化与停止 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done | | PKG-ASR-03 | artplayer-plugin-asr
整理内部职责与资源 | PKG-ASR-02, CORE-10, CORE-18 | AudioContext/Worklet/Stream 生命周期和背压分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done | | PKG-ASR-04 | artplayer-plugin-asr
迁移自有源码和公开类型 | PKG-ASR-03, ENG-04, ENG-06, CORE-07 | 主线程/Worklet/音频 buffer 与异步回调类型 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | done | -| PKG-ASR-05 | artplayer-plugin-asr
验证新旧核心和组合 | PKG-ASR-04, CORE-22, PKG-ASR-07, PKG-ASR-08, PKG-ASR-09 | 真实 WebAudio 分块、播放暂停/切源/销毁,不引入网络 ASR | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | doing | +| PKG-ASR-05 | artplayer-plugin-asr
验证新旧核心和组合 | PKG-ASR-04, CORE-22, PKG-ASR-07, PKG-ASR-08, PKG-ASR-09, PKG-ASR-10 | 真实 WebAudio 分块、播放暂停/切源/销毁,不引入网络 ASR | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | doing | | PKG-ASR-06 | artplayer-plugin-asr
验证分发并同步文档 | PKG-ASR-05, ENG-07 | asr.js、Worklet 资源、输出格式与声明证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo | | PKG-ASR-07 | artplayer-plugin-asr
修复原生播放音量二次衰减 | PKG-ASR-04 | 移除重复音量应用;保留新旧原生音频振幅对照及正式产物验收 | Chromium/Firefox 两核心和 source/main/legacy 输出音量线性、静音和 stop/restart 正确;旧版平方衰减单独保留;单元/类型/真实安装通过,不代替设备验收 | H | done | | PKG-ASR-08 | artplayer-plugin-asr
修复捕获回退重复播放与静音漏声 | PKG-ASR-07 | 捕获回退静音输出图、非零PCM与外部播放归属;真实红绿证据及产物验证 | 已进入回退后不产生额外输出、静音不漏声、外部播放图不被关闭、stop/restart/换源清理正确;明确Firefox受控拒绝不代表自然选择回退 | H | done | | PKG-ASR-09 | artplayer-plugin-asr
提供显式捕获归属并取消过期切源重启 | PKG-ASR-04, PKG-ASR-08 | 保留默认API的capture模式、精确runtime类型、可取消重启和原生外部归属/CORS证据 | 显式模式零直接绑定、不增加输出、拥有资源正确清理;Firefox不强制异常,CORS无绕过;旧工厂类型保持;延迟关闭期间pause/stop取消旧重启 | H | done | +| PKG-ASR-10 | artplayer-plugin-asr
媒体错误取消过期识别并释放捕获资源 | PKG-ASR-09 | 原生媒体错误取消、延迟加载/关闭回归、安装产物恢复与维护文档 | 旧红新绿证明错误后旧识别不显示、无新采集;捕获图释放,直接图保留合法回放归属;新旧核心实际错误与恢复通过,销毁移除监听 | H | done | ## 5 包迁移:artplayer-plugin-ads @@ -671,6 +672,7 @@ - PKG-ASR-07: [记录](changes/2026-09-13-PKG-ASR-07-playback-volume.md) [记录](baselines/asr-volume-validation.json) - PKG-ASR-08: [记录](changes/2026-09-13-PKG-ASR-08-capture-output.md) [记录](baselines/asr-fallback-validation.json) - PKG-ASR-09: [记录](changes/2026-09-13-PKG-ASR-09-explicit-capture.md) [记录](baselines/asr-explicit-capture-validation.json) +- PKG-ASR-10: [记录](changes/2026-09-15-PKG-ASR-10-media-error.md) [记录](baselines/asr-media-error-validation.json) - PKG-DANMUKU-10: [记录](changes/2026-09-13-PKG-DANMUKU-10-heatmap-density.md) [记录](baselines/danmuku-heatmap-density-validation.json) - PKG-DANMUKU-11: [记录](changes/2026-09-13-PKG-DANMUKU-11-visible-lifetime.md) [记录](baselines/danmuku-lifetime-validation.json) - PKG-DANMUKU-12: [记录](changes/2026-09-13-PKG-DANMUKU-12-frame-sampling.md) [记录](baselines/danmuku-frame-sampling-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 6d6d3d97b..50a852529 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,21 @@ # 进度与证据 +## PKG-ASR-10 修复原生媒体错误后的过期识别 + +复现真实 `art.video.src` 不可解码输入产生 error 而没有 pause:旧识别结果仍显示、 +捕获图继续运行。新增对 `video:error` 的停止/销毁解绑,复用现有取消、资源归属 +与恢复逻辑。五项单测旧红新绿,错误中加载/延迟关闭、旧回调和恢复均覆盖。 + +234 ASR 专项、main/legacy 各43生命周期及6清单测试通过。源码/两份实际安装 +产物共80浏览器通过、40 Windows WebKit WebAudio能力跳过;正常音量/静音、 +无音轨、跨域及三种核心的错误恢复纳入回归。三种正式构建字节与独立安装一致。 +初版 Firefox 等待首个静音块的测试死锁已修正并保留失败记录。 + +见[修复记录](changes/2026-09-15-PKG-ASR-10-media-error.md)和 +[证据](baselines/asr-media-error-validation.json)。任务10完成,任务05继续doing; +203 done、21 doing、43 todo,共267项。类型/依赖/锁未改,远端CI/设备/发布复盘 +仍待完成;未推送、部署或发布。 + ## PKG-ASR-05 无音轨视频与恢复 新增真实无音轨 H.264 → AAC 的默认/显式捕获测试:播放时钟与解码画面继续, diff --git a/refactor/risk-table.md b/refactor/risk-table.md index b40f7601c..8d19112f9 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -280,3 +280,4 @@ | CONSOLE-OWNERSHIP-01 | resolved / 已复现 | 多个控制台的全局 hook 所有权冲突 | SITE-CONSOLE-01, SITE-07 | | CONSOLE-ERROR-01 | resolved / 已复现 | Firefox/WebKit 控制台丢失原生 Error 消息 | SITE-CONSOLE-01, SITE-07 | | AUTO-THUMB-METADATA-01 | resolved / 已复现 | Private metadata loading can retain its decoder indefinitely without metadata or media errors | PKG-AUTO-THUMB-12 | +| ASR-MEDIA-01 | resolved / 已复现 | ASR accepts obsolete recognition after native media error without pause | PKG-ASR-10, PKG-ASR-05 | diff --git a/refactor/risks.json b/refactor/risks.json index 0035d73a4..5d982122f 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -6579,6 +6579,28 @@ "refactor/baselines/auto-thumbnail-metadata-validation.json" ], "resolutionRationale": "Seven regressions fail on prechange main; source 189/189, main and legacy 82/82, native main and legacy 36/36 each. Final pending-response tests observe the HTTP server directly. Existing first-frame risk stays open." + }, + { + "id": "ASR-MEDIA-01", + "title": "ASR accepts obsolete recognition after native media error without pause", + "confirmation": "reproduced", + "status": "resolved", + "owners": [ + "PKG-ASR-10", + "PKG-ASR-05" + ], + "evidence": [ + "test/asr-media-error.test.js", + "test/browser/asr-media-error.spec.js", + "refactor/baselines/asr-media-error-validation.json" + ], + "compatibleResolution": "Use the existing nonterminal stop path on video:error; preserve direct media ownership and later playback, release capture graphs, invalidate old callbacks and remove the listener on destroy.", + "closureCriteria": "Prepatch failures and fixed regressions prove pending-result and initialization/close cancellation, plus native errors and recovery on supported old/candidate core inputs; missing device/WebAudio evidence stays in task05.", + "resolutionEvidence": [ + "refactor/changes/2026-09-15-PKG-ASR-10-media-error.md", + "refactor/baselines/asr-media-error-validation.json" + ], + "resolutionRationale": "Five prepatch unit failures and four native Chromium failures become passing cancellation/recovery checks. Source and actual installed main/legacy pass, including minimum5.3.0 and5.4.0 core controls; default routing and captured cleanup remain intact. WebKit capability skips and broader package acceptance are not waived." } ] } diff --git a/refactor/tasks.json b/refactor/tasks.json index d08547445..262451ce0 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -2906,7 +2906,8 @@ "CORE-22", "PKG-ASR-07", "PKG-ASR-08", - "PKG-ASR-09" + "PKG-ASR-09", + "PKG-ASR-10" ], "status": "doing", "risk": "H", @@ -5170,6 +5171,25 @@ "baselines/asr-explicit-capture-validation.json" ] }, + { + "id": "PKG-ASR-10", + "phase": "5 包迁移:artplayer-plugin-asr", + "title": "媒体错误取消过期识别并释放捕获资源", + "scope": [ + "artplayer-plugin-asr" + ], + "dependsOn": [ + "PKG-ASR-09" + ], + "status": "done", + "risk": "H", + "deliverable": "原生媒体错误取消、延迟加载/关闭回归、安装产物恢复与维护文档", + "acceptance": "旧红新绿证明错误后旧识别不显示、无新采集;捕获图释放,直接图保留合法回放归属;新旧核心实际错误与恢复通过,销毁移除监听", + "evidence": [ + "changes/2026-09-15-PKG-ASR-10-media-error.md", + "baselines/asr-media-error-validation.json" + ] + }, { "id": "PKG-DANMUKU-10", "phase": "5 包迁移:artplayer-plugin-danmuku", diff --git a/scripts/browser-validation/scope.ts b/scripts/browser-validation/scope.ts index f79ff590d..41f10eab0 100644 --- a/scripts/browser-validation/scope.ts +++ b/scripts/browser-validation/scope.ts @@ -42,6 +42,7 @@ export const installedTests = [ 'asr-cors.spec.js', 'asr-capture-cors.spec.js', 'asr-no-audio.spec.js', + 'asr-media-error.spec.js', 'asr-audio-track.spec.js', 'chromecast-lifecycle.spec.js', 'mediabunny-audio.spec.js', diff --git a/test/asr-media-error.test.js b/test/asr-media-error.test.js new file mode 100644 index 000000000..4ea97bb90 --- /dev/null +++ b/test/asr-media-error.test.js @@ -0,0 +1,90 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import process from 'node:process' +// eslint-disable-next-line test/no-import-node-test -- Exercise cancellation after a native media error without depending on browser timing. +import test from 'node:test' +import { asrAudioEnvironment, deferredAudio } from './helpers/asr-audio.js' +import { compilePackage } from './helpers/load.js' + +const artifact = process.env.ARTPLAYER_ASR_ARTIFACT +const implementation = { name: artifact || 'candidate-asr', code: artifact ? fs.readFileSync(artifact, 'utf8') : await compilePackage('artplayer-plugin-asr', 'umd') } + +for (const capture of [false, true]) { + const option = capture ? { audioInput: { type: 'capture' } } : {} + test(`ASR media error cancels pending recognition and permits ${capture ? 'capture' : 'direct'} recovery`, async () => { + const pending = deferredAudio() + let calls = 0 + const environment = asrAudioEnvironment(implementation, { ...option, sampleRate: 8000, interval: 1, onAudioChunk: () => ++calls === 1 ? pending.promise : 'Recovered' }) + await environment.emit('play') + environment.send(new Float32Array(8).fill(0.5)) + const recognizing = environment.tick() + assert.equal(calls, 1) + const oldMessage = environment.recorders[0].port.onmessage + await environment.emit('video:error') + assert.equal(environment.intervals.size, 0, 'Media error must stop collection even without a pause event') + assert.equal(environment.recorders[0].port.onmessage, null) + pending.resolve('Obsolete') + await recognizing + assert.equal(environment.layer.innerHTML, '') + assert.equal(environment.timeouts.size, 0) + assert.equal(environment.contexts[0].state, capture ? 'closed' : 'running') + assert.equal(environment.tracks[0].stops, capture ? 1 : 0) + oldMessage({ data: new Float32Array(8).fill(1) }) + assert.equal(calls, 1) + await environment.emit('play') + assert.equal(environment.contexts.length, capture ? 2 : 1) + assert.equal(environment.intervals.size, 1) + environment.send(new Float32Array(8).fill(0.25)) + await environment.tick() + assert.match(environment.layer.innerHTML, /Recovered/) + await environment.emit('destroy') + assert(environment.contexts.every(context => context.state === 'closed')) + assert.equal(environment.listeners.get('video:error').length, 0) + }) + + test(`ASR media error during ${capture ? 'capture' : 'direct'} worklet loading cancels late initialization`, async () => { + const moduleGate = deferredAudio() + const moduleEntered = deferredAudio() + const environment = asrAudioEnvironment(implementation, option, { moduleGate, moduleEntered }) + const starting = environment.emit('play') + await moduleEntered.promise + await environment.emit('video:error') + moduleGate.resolve() + await starting + assert.equal(environment.contexts[0].state, 'closed') + assert.equal(environment.recorders.length, 0) + assert.equal(environment.nodes.filter(node => ['element', 'stream'].includes(node.kind)).length, 0) + assert.equal(environment.intervals.size, 0) + assert.equal(environment.blobs.size, 0) + assert.equal(environment.errors.length, 0) + await environment.emit('play') + assert.equal(environment.intervals.size, 1) + await environment.emit('destroy') + assert(environment.contexts.every(context => context.state === 'closed')) + }) +} + +test('ASR media error cancels a capture restart waiting for close without hiding an existing subtitle', async () => { + const environment = asrAudioEnvironment(implementation, { audioInput: { type: 'capture' } }) + environment.plugin.append('Existing') + const timers = [...environment.timeouts.keys()] + await environment.emit('play') + const closing = deferredAudio() + const close = environment.contexts[0].close.bind(environment.contexts[0]) + environment.contexts[0].close = async () => { + await close() + await closing.promise + } + const restarting = environment.emit('restart') + const failing = environment.emit('video:error') + closing.resolve() + await Promise.all([restarting, failing]) + assert.equal(environment.captures(), 1) + assert.equal(environment.intervals.size, 0) + assert.match(environment.layer.innerHTML, /Existing/) + assert.deepEqual([...environment.timeouts.keys()], timers) + await environment.emit('destroy') + await environment.emit('video:error') + assert.equal(environment.timeouts.size, 0) + assert.equal(environment.contexts.length, 1) +}) diff --git a/test/browser-validation.test.js b/test/browser-validation.test.js index 1be03320c..eb638353f 100644 --- a/test/browser-validation.test.js +++ b/test/browser-validation.test.js @@ -21,6 +21,7 @@ test('Source invocation clears inherited artifact selection without changing cal assert(installedTests.includes('ambilight-proxy.spec.js')) assert(installedTests.includes('canvas-lifecycle.spec.js')) assert(installedTests.includes('asr-no-audio.spec.js')) + assert(installedTests.includes('asr-media-error.spec.js')) for (const file of installedTests) assert(fs.existsSync(path.resolve('test/browser', file))) }) diff --git a/test/browser/asr-media-error.spec.js b/test/browser/asr-media-error.spec.js new file mode 100644 index 000000000..20c05210b --- /dev/null +++ b/test/browser/asr-media-error.spec.js @@ -0,0 +1,104 @@ +import process from 'node:process' +import { browserCandidate } from '../helpers/browser-candidate.js' +import { expect, test } from './fixtures.js' + +let candidate +test.beforeAll(async () => { + candidate = await browserCandidate('artplayer-plugin-asr', process.env.ARTPLAYER_ASR_ARTIFACT) +}) + +test.afterEach(async ({ page }, testInfo) => { + const state = await page.evaluate(() => window.mediaErrorState?.()).catch(error => ({ error: error.message })) + await testInfo.attach('asr-media-error-final', { contentType: 'application/json', body: JSON.stringify(state ?? null) }) + await page.evaluate(() => { + if (window.art && !window.art.isDestroy) + window.art.destroy() + }) +}) + +for (const core of ['published-5.3.0', 'published', 'candidate']) { + for (const mode of ['default', 'capture']) { + test(`ASR ${mode} + ${core}: native media error invalidates pending recognition and permits recovery`, async ({ page }, testInfo) => { + await page.goto(`/test/player.html?core=${core}`) + const capabilities = await page.evaluate(() => ({ context: typeof (window.AudioContext || window.webkitAudioContext), worklet: typeof window.AudioWorkletNode })) + await testInfo.attach('asr-media-error-inputs', { contentType: 'application/json', body: JSON.stringify({ core, mode, capabilities, provenance: candidate.provenance, recognizer: 'Controlled pending caller Promise; PCM and media errors are native', errorSource: '/test/manifest.json', mediaAssignment: 'public art.video.src' }) }) + if (capabilities.context === 'undefined') { + expect(process.platform).toBe('win32') + expect(testInfo.project.name).toBe('webkit') + expect(capabilities.worklet).toBe('undefined') + test.skip(true, 'Windows WebKit lacks native WebAudio; not Safari/device ASR acceptance') + } + await page.addScriptTag({ content: candidate.code }) + await page.evaluate((mode) => { + const Context = window.AudioContext || window.webkitAudioContext + const contexts = [] + const events = [] + const chunks = [] + window.AudioContext = class extends Context { + constructor(options) { + super(options) + contexts.push(this) + } + } + window.art = new window.Artplayer({ + container: '.player', + url: '/test/audio-tone.m4a', + volume: 0.6, + plugins: [window.artplayerPluginAsr({ + ...(mode === 'capture' ? { audioInput: { type: 'capture' } } : {}), + onAudioChunk({ pcm }) { + let peak = 0 + for (const sample of new Int16Array(pcm)) + peak = Math.max(peak, Math.abs(sample)) + chunks.push({ peak, source: window.art.video.currentSrc }) + if (!window.completeRecognition) { + if (peak > 0) + return new Promise(resolve => window.completeRecognition = resolve) + return + } + return 'Recovered recognition' + }, + })], + }) + for (const name of ['play', 'pause', 'restart', 'video:emptied', 'video:error']) + window.art.on(name, () => events.push({ name, at: performance.now(), error: window.art.video.error?.code || null })) + window.mediaErrorState = () => ({ + contexts: contexts.map(context => context.state), + events, + chunks, + subtitle: document.querySelector('.art-layer-asr')?.textContent || '', + error: window.art.video.error?.code || null, + source: window.art.video.currentSrc, + paused: window.art.video.paused, + }) + document.querySelector('#play').onclick = () => window.art.play() + }, mode) + await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => window.mediaErrorState().chunks.some(chunk => chunk.peak > 0))).toBe(true) + await page.evaluate(() => { + window.art.video.src = '/test/manifest.json?asr-media-error=unsupported' + }) + await expect.poll(() => page.evaluate(() => window.mediaErrorState().error)).toBe(4) + await page.evaluate(async () => { + window.completeRecognition('Obsolete recognition') + await Promise.resolve() + await Promise.resolve() + }) + const failed = await page.evaluate(() => window.mediaErrorState()) + await testInfo.attach('asr-native-media-failure', { contentType: 'application/json', body: JSON.stringify(failed) }) + expect(failed.subtitle).not.toContain('Obsolete recognition') + if (mode === 'capture') + await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true) + await page.evaluate(() => { + window.art.url = '/test/audio-tone.m4a?asr-media-error=recovery' + }) + await expect.poll(() => page.evaluate(() => window.art.video.currentSrc.includes('asr-media-error=recovery') && window.art.video.readyState >= 2)).toBe(true) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => window.mediaErrorState().chunks.filter(chunk => chunk.source.includes('asr-media-error=recovery') && chunk.peak > 0).length)).toBeGreaterThanOrEqual(3) + await expect(page.locator('.art-layer-asr')).toHaveText('Recovered recognition') + await page.evaluate(() => window.art.destroy()) + await expect.poll(() => page.evaluate(() => window.mediaErrorState().contexts.every(state => state === 'closed'))).toBe(true) + }) + } +}