UNPKG

@ktt45678/vidstack

Version:

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

2 lines (1 loc) 8.08 kB
import{f as T}from"../chunks/vidstack-_YlOvjKd.js";import{l as D,p as M}from"../chunks/vidstack-Ds9fx5AB.js";import{f as R,e as q,a as _,i as I}from"../chunks/vidstack-BC0sXP__.js";import{VideoProvider as P}from"./vidstack-video-DuxooyRJ.js";import{l as w,e as F,D as l,k as N,i as u,y as $,j as L,a2 as K,p as C}from"../chunks/vidstack-B1PqmCkk.js";import{Q as E}from"../chunks/vidstack-dclo3F73.js";import{T as m,a as j}from"../chunks/vidstack-BjNj-jtW.js";import{L as b}from"../chunks/vidstack-ClIUVQwo.js";import{R as O}from"../chunks/vidstack-Ch6gqkZw.js";import{c as H}from"../chunks/vidstack-CYZ2CtI4.js";import"./vidstack-html-Bg5o0a89.js";import"../chunks/vidstack-CmPcDiqw.js";import"https://cdn.jsdelivr.net/npm/media-captions@next/dist/prod.js";function S(a){try{return new Intl.DisplayNames(navigator.languages,{type:"language"}).of(a)??null}catch{return null}}const G=a=>`dash-${$(a)}`;class Q{constructor(t,i){this.m=t,this.b=i,this.d=null,this.qb=null,this.rb={},this.sb=new Set,this.Kb=null,this.oe={},this.na=-1}get instance(){return this.d}setup(t){this.d=t().create();const i=this.Ii.bind(this);for(const s of Object.values(t.events))this.d.on(s,i);this.d.on(t.events.ERROR,this.Q.bind(this));for(const s of this.sb)s(this.d);this.b.player.dispatch("dash-instance",{detail:this.d}),this.d.initialize(this.m,void 0,!1),this.d.updateSettings({streaming:{text:{defaultEnabled:!1,dispatchForManualRendering:!0},buffer:{fastSwitchEnabled:!0}},...this.rb}),this.d.on(t.events.FRAGMENT_LOADING_STARTED,this.Ji.bind(this)),this.d.on(t.events.FRAGMENT_LOADING_COMPLETED,this.Ki.bind(this)),this.d.on(t.events.MANIFEST_LOADED,this.Li.bind(this)),this.d.on(t.events.QUALITY_CHANGE_RENDERED,this.Za.bind(this)),this.d.on(t.events.TEXT_TRACKS_ADDED,this.Mi.bind(this)),this.d.on(t.events.TRACK_CHANGE_RENDERED,this.pc.bind(this)),this.b.qualities[E.Ia]=this.je.bind(this),w(this.b.qualities,"change",this.ke.bind(this)),w(this.b.audioTracks,"change",this.le.bind(this)),this.qb=F(this.me.bind(this))}aa(t){return new l(G(t.type),{detail:t})}me(){if(!this.b.$state.live())return;const t=new O(this.ne.bind(this));return t.Xa(),t.$.bind(t)}ne(){if(!this.d)return;const t=this.d.duration()-this.d.time();this.b.$state.liveSyncPosition.set(isNaN(t)?1/0:t)}Ii(t){this.b.player?.dispatch(this.aa(t))}Ni(t){const i=this.Kb?.[m._],s=(i?.track).cues;if(!i||!s)return;const r=this.Kb.id,n=this.oe[r]??0,o=this.aa(t);for(let c=n;c<s.length;c++){const h=s[c];h.positionAlign||(h.positionAlign="auto"),this.Kb.addCue(h,o)}this.oe[r]=s.length}Mi(t){if(!this.d)return;const i=t.tracks,s=[...this.m.textTracks].filter(n=>"manualMode"in n),r=this.aa(t);for(let n=0;n<s.length;n++){const o=i[n],c=s[n],h=`dash-${o.kind}-${n}`,d=new j({id:h,label:o?.label??o.labels.find(f=>f.text)?.text??(o?.lang&&S(o.lang))??o?.lang??void 0,language:o.lang??void 0,kind:o.kind,default:o.defaultTrack});d[m._]={managed:!0,track:c},d[m.ma]=2,d[m.hb]=()=>{this.d&&(d.mode==="showing"?(this.d.setTextTrack(n),this.Kb=d):(this.d.setTextTrack(-1),this.Kb=null))},this.b.textTracks.add(d,r)}}pc(t){const{mediaType:i,newMediaInfo:s}=t;if(i==="audio"){const r=this.b.audioTracks.getById(`dash-audio-${s.index}`);if(r){const n=this.aa(t);this.b.audioTracks[b.ea](r,!0,n)}}}Za(t){if(t.mediaType!=="video")return;const i=this.b.qualities[t.newRepresentation.index];if(i){const s=this.aa(t);this.b.qualities[b.ea](i,!0,s)}}Li(t){if(this.b.$state.canPlay()||!this.d)return;const{type:i,mediaPresentationDuration:s}=t.data,r=this.aa(t);this.b.delegate.c("stream-type-change",i!=="static"?"live":"on-demand",r),this.b.delegate.c("duration-change",s,r),this.b.qualities[E.Wa](!0,r);const n=this.d.getVideoElement(),o=this.d.getTracksForTypeFromManifest("video",t.data),c=[...new Set(o.map(e=>e.mimeType))].find(e=>e&&R(n,e)),h=o.filter(e=>c===e.mimeType)[0];let d=this.d.getTracksForTypeFromManifest("audio",t.data);const f=[...new Set(d.map(e=>e.mimeType))].find(e=>e&&q(n,e));if(d=d.filter(e=>f===e.mimeType),h.bitrateList.forEach((e,p)=>{const g={id:e.id?.toString()??`dash-bitrate-${p}`,width:e.width??0,height:e.height??0,bitrate:e.bandwidth??0,codec:h.codec,index:p};this.b.qualities[b.da](g,r)}),N(h.index)){const e=this.b.qualities[h.index];e&&this.b.qualities[b.ea](e,!0,r)}d.forEach((e,p)=>{const g=e.labels.find(y=>navigator.languages.some(A=>y.lang&&A.toLowerCase().startsWith(y.lang.toLowerCase())))||e.labels[0],x={id:`dash-audio-${e?.index}`,label:e.bitrateList[0]?.id??g?.text??(e.lang&&S(e.lang))??e.lang??"",language:e.lang??"",kind:"main",mimeType:e.mimeType,codec:e.codec,index:p};this.b.audioTracks[b.da](x,r)}),n.dispatchEvent(new l("canplay",{trigger:r}))}Q(t){const{type:i,error:s}=t;switch(s.code){case 27:this.pe(s);break;default:this.qc(s);break}}Ji(){this.na>=0&&this._a()}Ki(t){t.mediaType==="text"&&requestAnimationFrame(this.Ni.bind(this,t))}pe(t){this._a(),this.d?.play(),this.na=window.setTimeout(()=>{this.na=-1,this.qc(t)},5e3)}_a(){clearTimeout(this.na),this.na=-1}qc(t){this.b.delegate.c("error",{message:t.message??"",code:1,error:t})}je(){this.lg("video",!0);const{qualities:t}=this.b;this.d?.setRepresentationForTypeByIndex("video",t.selectedIndex,!0)}lg(t,i){this.d?.updateSettings({streaming:{abr:{autoSwitchBitrate:{[t]:i}}}})}ke(){const{qualities:t}=this.b;!this.d||t.auto||!t.selected||(this.lg("video",!1),this.d.setRepresentationForTypeByIndex("video",t.selectedIndex,t.switch==="current"),_&&(this.m.currentTime=this.m.currentTime))}le(){if(!this.d)return;const{audioTracks:t}=this.b,i=this.d.getTracksFor("audio").find(s=>t.selected&&t.selected.id===`dash-audio-${s.index}`);i&&this.d.setCurrentTrack(i)}z(){this._a(),this.Kb=null,this.oe={}}loadSource(t){this.z(),!(!u(t.src)&&!T(t.src))&&this.d?.attachSource(t.src)}destroy(){this.z(),this.d?.destroy(),this.d=null,this.qb?.(),this.qb=null}}class z{constructor(t,i,s){this.L=t,this.b=i,this.La=s,this.qe()}async qe(){const t={onLoadStart:this.Ma.bind(this),onLoaded:this.tb.bind(this),onLoadError:this.re.bind(this)};let i=await V(this.L,t);return L(i)&&!u(this.L)&&(i=await B(this.L,t)),i?window.dashjs.supportsMediaSource()?i:(this.b.player.dispatch(new l("dash-unsupported")),this.b.delegate.c("error",{message:"[vidstack] `dash.js` is not supported in this environment",code:4}),null):null}Ma(){this.b.player.dispatch(new l("dash-lib-load-start"))}tb(t){this.b.player.dispatch(new l("dash-lib-loaded",{detail:t})),this.La(t)}re(t){const i=H(t);this.b.player.dispatch(new l("dash-lib-load-error",{detail:i})),this.b.delegate.c("error",{message:i.message,code:4,error:i})}}async function B(a,t={}){if(!L(a)){if(t.onLoadStart?.(),J(a))return t.onLoaded?.(a),a;if(v(a)){const i=a.MediaPlayer;return t.onLoaded?.(i),i}try{const i=(await a())?.default;if(v(i))return t.onLoaded?.(i.MediaPlayer),i.MediaPlayer;if(i)t.onLoaded?.(i);else throw Error("");return i}catch(i){t.onLoadError?.(i)}}}async function V(a,t={}){if(u(a)){t.onLoadStart?.();try{if(await D(a),!K(window.dashjs.MediaPlayer))throw Error("");const i=window.dashjs.MediaPlayer;return t.onLoaded?.(i),i}catch(i){t.onLoadError?.(i)}}}function J(a){return a&&a.prototype&&a.prototype!==Function}function v(a){return a&&"MediaPlayer"in a}const U="https://cdn.jsdelivr.net";class k extends P{constructor(){super(...arguments),this.$$PROVIDER_TYPE="DASH",this.rc=null,this.e=new Q(this.video,this.b),this.oa=`${U}/npm/dashjs@4.7.4/dist/dash.all.min.js`}get ctor(){return this.rc}get instance(){return this.e.instance}get type(){return"dash"}get canLiveSync(){return!0}get config(){return this.e.rb}set config(t){this.e.rb=t}get library(){return this.oa}set library(t){this.oa=t}preconnect(){u(this.oa)&&M(this.oa)}setup(){super.setup(),new z(this.oa,this.b,t=>{this.rc=t,this.e.setup(t),this.b.delegate.c("provider-setup",this);const i=C(this.b.$state.source);i&&this.loadSource(i)})}async loadSource(t,i){if(!u(t.src)&&!T(t.src)){this.oc();return}this.a.preload=i||"",this.e.loadSource(t),this.K=t}onInstance(t){const i=this.e.instance;return i&&t(i),this.e.sb.add(t),()=>this.e.sb.delete(t)}destroy(){this.e.destroy()}}k.supported=I();export{k as DASHProvider};