UNPKG

@7sage/vidstack

Version:

UI component library for building high-quality, accessible video and audio experiences on the web.

2 lines (1 loc) 8.04 kB
import{e as T,g as f,f as S}from"../chunks/vidstack-D3XUwguk.js";import{s as m,E as y,e as k,o as p,p as C,a9 as E,l as g,D as w,a4 as P,k as r,i as A}from"../chunks/vidstack-CYF5HBsg.js";import{l as h,b as L}from"../chunks/vidstack-0lhgLM-q.js";import{R as x}from"../chunks/vidstack-BJ_Bs2CC.js";import{L as c}from"../chunks/vidstack-C_AxqLKV.js";let o=null,d=[],u=[];function l(){return o??=new AudioContext}function $(){const s=l(),t=s.createGain();return t.connect(s.destination),d.push(t),t}function G(s,t){const i=l(),e=i.createMediaElementSource(s);return t&&e.connect(t),u.push(e),e}function N(s){const t=d.indexOf(s);t!==-1&&(d.splice(t,1),s.disconnect(),v())}function M(s){const t=u.indexOf(s);t!==-1&&(u.splice(t,1),s.disconnect(),v())}function v(){o&&d.length===0&&u.length===0&&o.close().then(()=>{o=null})}class R{#n;#t;#e=null;#a=null;get currentGain(){return this.#e?.gain?.value??null}get supported(){return!0}constructor(t,i){this.#n=t,this.#t=i}setGain(t){const i=this.currentGain;if(t!==this.currentGain){if(t===1&&i!==1){this.removeGain();return}this.#e||(this.#e=$(),this.#a&&this.#a.connect(this.#e)),this.#a||(this.#a=G(this.#n,this.#e)),this.#e.gain.value=t,this.#t(t)}}removeGain(){this.#e&&(this.#a&&this.#a.connect(l().destination),this.#r(),this.#t(null))}destroy(){this.#h(),this.#r()}#h(){if(this.#a)try{M(this.#a)}catch{}finally{this.#a=null}}#r(){if(this.#e)try{N(this.#e)}catch{}finally{this.#e=null}}}const D=["focus","blur","visibilitychange","pageshow","pagehide"];class O{#n=m(b());#t=m(document.visibilityState);#e;connect(){const t=new y(window),i=this.#a.bind(this);for(const e of D)t.add(e,i);h&&t.add("beforeunload",e=>{this.#e=setTimeout(()=>{e.defaultPrevented||e.returnValue.length>0||(this.#n.set("hidden"),this.#t.set("hidden"))},0)})}get pageState(){return this.#n()}get visibility(){return this.#t()}#a(t){h&&window.clearTimeout(this.#e),(t.type!=="blur"||this.#n()==="active")&&(this.#n.set(b(t)),this.#t.set(document.visibilityState=="hidden"?"hidden":"visible"))}}function b(s){return s?.type==="blur"||document.visibilityState==="hidden"?"hidden":document.hasFocus()?"active":"passive"}class I{#n;#t;#e=!1;#a=!1;#h=!1;#r=new x(this.#p.bind(this));#d=new O;#u;get#i(){return this.#n.media}constructor(t,i){this.#n=t,this.#t=i,this.#u=new y(t.media),this.#g(),this.#d.connect(),k(this.#M.bind(this)),p(this.#y.bind(this))}#y(){this.#a=!1,this.#h=!1,this.#r.stop(),this.#u.abort(),this.#T?.clear()}#c=0;#l=-1;#p(){const t=this.#i.currentTime;!(h&&t-this.#l<.35)&&this.#c!==t&&(this.#o(t),this.#c=t)}#g(){this.#s("loadstart",this.#S),this.#s("abort",this.#m),this.#s("emptied",this.#k),this.#s("error",this.#j),this.#s("volumechange",this.#O)}#v(){this.#a||(this.#s("loadeddata",this.#C),this.#s("loadedmetadata",this.#E),this.#s("canplay",this.#A),this.#s("canplaythrough",this.#L),this.#s("durationchange",this.#D),this.#s("play",this.#w),this.#s("progress",this.#U),this.#s("stalled",this.#$),this.#s("suspend",this.#V),this.#s("ratechange",this.#H),this.#a=!0)}#b(){this.#h||(this.#s("pause",this.#P),this.#s("playing",this.#x),this.#s("seeked",this.#I),this.#s("seeking",this.#F),this.#s("ended",this.#N),this.#s("waiting",this.#G),this.#h=!0)}#T=void 0;#q=void 0;#s(t,i){this.#u.add(t,i.bind(this))}#B(t){}#o(t,i){const e=Math.min(t,this.#t.$state.seekableEnd());this.#t.notify("time-change",e,i)}#S(t){if(this.#i.networkState===3){this.#m(t);return}this.#v(),this.#t.notify("load-start",void 0,t)}#m(t){this.#t.notify("abort",void 0,t)}#k(){this.#t.notify("emptied",void 0,event)}#C(t){this.#t.notify("loaded-data",void 0,t)}#E(t){this.#c=0,this.#l=-1,this.#b(),this.#t.notify("loaded-metadata",void 0,t),(L||h&&T(this.#t.$state.source()))&&this.#t.delegate.ready(this.#f(),t)}#f(){return{provider:C(this.#t.$provider),duration:this.#i.duration,buffered:this.#i.buffered,seekable:this.#i.seekable}}#w(t){this.#t.$state.canPlay&&this.#t.notify("play",void 0,t)}#P(t){this.#i.readyState===1&&!this.#e||(this.#e=!1,this.#r.stop(),this.#t.notify("pause",void 0,t))}#A(t){this.#t.delegate.ready(this.#f(),t)}#L(t){this.#t.$state.started()||this.#t.notify("can-play-through",this.#f(),t)}#x(t){this.#i.paused||(this.#e=!1,this.#t.notify("playing",void 0,t),this.#r.start())}#$(t){this.#t.notify("stalled",void 0,t),this.#i.readyState<3&&(this.#e=!0,this.#t.notify("waiting",void 0,t))}#G(t){this.#i.readyState<3&&(this.#e=!0,this.#t.notify("waiting",void 0,t))}#N(t){this.#r.stop(),this.#o(this.#i.duration,t),this.#t.notify("end",void 0,t),this.#t.$state.loop()&&E(this.#i.controls)&&(this.#i.controls=!1)}#M(){const t=this.#t.$state.paused(),i=this.#d.visibility==="hidden";(t||i)&&g(this.#i,"timeupdate",this.#R.bind(this))}#R(t){this.#o(this.#i.currentTime,t)}#D(t){this.#t.$state.ended()&&this.#o(this.#i.duration,t),this.#t.notify("duration-change",this.#i.duration,t)}#O(t){const i={volume:this.#i.volume,muted:this.#i.muted};this.#t.notify("volume-change",i,t)}#I(t){this.#l=this.#i.currentTime,this.#o(this.#i.currentTime,t),this.#t.notify("seeked",this.#i.currentTime,t),Math.trunc(this.#i.currentTime)===Math.trunc(this.#i.duration)&&f(this.#i.duration)>f(this.#i.currentTime)&&(this.#o(this.#i.duration,t),this.#i.ended||this.#t.player.dispatch(new w("media-play-request",{trigger:t})))}#F(t){this.#t.notify("seeking",this.#i.currentTime,t)}#U(t){const i={buffered:this.#i.buffered,seekable:this.#i.seekable};this.#t.notify("progress",i,t)}#V(t){this.#t.notify("suspend",void 0,t)}#H(t){this.#t.notify("rate-change",this.#i.playbackRate,t)}#j(t){const i=this.#i.error;if(!i)return;const e={message:i.message,code:i.code,mediaError:i};this.#t.notify("error",e,t)}}class F{#n;#t;get#e(){return this.#n.media.audioTracks}constructor(t,i){this.#n=t,this.#t=i,this.#e.onaddtrack=this.#a.bind(this),this.#e.onremovetrack=this.#h.bind(this),this.#e.onchange=this.#r.bind(this),g(this.#t.audioTracks,"change",this.#u.bind(this))}#a(t){const i=t.track;if(i.label==="")return;const e=i.id.toString()||`native-audio-${this.#t.audioTracks.length}`,a={id:e,label:i.label,language:i.language,kind:i.kind,selected:!1};this.#t.audioTracks[c.add](a,t),i.enabled&&(a.selected=!0)}#h(t){const i=this.#t.audioTracks.getById(t.track.id);i&&this.#t.audioTracks[c.remove](i,t)}#r(t){let i=this.#d();if(!i)return;const e=this.#t.audioTracks.getById(i.id);e&&this.#t.audioTracks[c.select](e,!0,t)}#d(){return Array.from(this.#e).find(t=>t.enabled)}#u(t){const{current:i}=t.detail;if(!i)return;const e=this.#e.getTrackById(i.id);if(e){const a=this.#d();a&&(a.enabled=!1),e.enabled=!0}}}class U{constructor(t,i){this.media=t,this.ctx=i,this.audioGain=new R(t,e=>{this.ctx.notify("audio-gain-change",e)})}scope=P();currentSrc=null;audioGain;setup(){new I(this,this.ctx),"audioTracks"in this.media&&new F(this,this.ctx),p(()=>{this.audioGain.destroy(),this.media.srcObject=null,this.media.removeAttribute("src");for(const t of this.media.querySelectorAll("source"))t.remove();this.media.load()})}get type(){return""}setPlaybackRate(t){this.media.playbackRate=t}async play(){return this.media.play()}async pause(){return this.media.pause()}setMuted(t){this.media.muted=t}setVolume(t){this.media.volume=t}setCurrentTime(t){this.media.currentTime=t}setPlaysInline(t){r(this.media,"playsinline",t)}async loadSource({src:t,type:i},e){this.media.preload=e||"",S(t)?(this.removeSource(),this.media.srcObject=t):(this.media.srcObject=null,A(t)?i!=="?"?this.appendSource({src:t,type:i}):(this.removeSource(),this.media.src=this.#n(t)):(this.removeSource(),this.media.src=window.URL.createObjectURL(t))),this.media.load(),this.currentSrc={src:t,type:i}}appendSource(t,i){const e=this.media.querySelector("source[data-vds]"),a=e??document.createElement("source");r(a,"src",this.#n(t.src)),r(a,"type",t.type!=="?"?t.type:i),r(a,"data-vds",""),e||this.media.append(a)}removeSource(){this.media.querySelector("source[data-vds]")?.remove()}#n(t){const{clipStartTime:i,clipEndTime:e}=this.ctx.$state,a=i(),n=e();return a>0&&n>0?`${t}#t=${a},${n}`:a>0?`${t}#t=${a}`:n>0?`${t}#t=0,${n}`:t}}export{U as HTMLMediaProvider};