@ktt45678/vidstack
Version:
UI component library for building high-quality, accessible video and audio experiences on the web.
2 lines (1 loc) • 8.53 kB
JavaScript
import{f as v}from"../chunks/vidstack-_YlOvjKd.js";import{l as M,p as q}from"../chunks/vidstack-Ds9fx5AB.js";import{f as _,e as F,a as P,i as R}from"../chunks/vidstack-BC0sXP__.js";import{VideoProvider as I}from"./vidstack-video-DuxooyRJ.js";import{l as L,e as N,D as u,k as $,i as b,y as C,j as E,a2 as K,p as j}from"../chunks/vidstack-B1PqmCkk.js";import{Q as S}from"../chunks/vidstack-dclo3F73.js";import{T as m,a as O}from"../chunks/vidstack-BjNj-jtW.js";import{L as p}from"../chunks/vidstack-ClIUVQwo.js";import{R as H}from"../chunks/vidstack-Ch6gqkZw.js";import{c as Q}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 k(a){try{return new Intl.DisplayNames(navigator.languages,{type:"language"}).of(a)??null}catch{return null}}const Y=a=>`dash-${C(a)}`;class G{constructor(t,i){this.m=t,this.b=i,this.d=null,this.qb=null,this.Yn=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[S.Ia]=this.je.bind(this),L(this.b.qualities,"change",this.ke.bind(this)),L(this.b.audioTracks,"change",this.le.bind(this)),this.qb=N(this.me.bind(this))}aa(t){return new u(Y(t.type),{detail:t})}me(){if(!this.b.$state.live())return;const t=new H(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 n=this.Kb.id,r=this.oe[n]??0,d=this.aa(t);for(let c=r;c<s.length;c++){const l=s[c];l.positionAlign||(l.positionAlign="auto"),this.Kb.addCue(l,d)}this.oe[n]=s.length}Mi(t){if(!this.d)return;const i=t.tracks,s=[...this.m.textTracks].filter(r=>"manualMode"in r),n=this.aa(t);for(let r=0;r<s.length;r++){const d=i[r],c=s[r],l=`dash-${d.kind}-${r}`,o=new O({id:l,label:d?.label??d.labels.find(f=>f.text)?.text??(d?.lang&&k(d.lang))??d?.lang??void 0,language:d.lang??void 0,kind:d.kind,default:d.defaultTrack});o[m._]={managed:!0,track:c},o[m.ma]=2,o[m.hb]=()=>{this.d&&(o.mode==="showing"?(this.d.setTextTrack(r),this.Kb=o):(this.d.setTextTrack(-1),this.Kb=null))},this.b.textTracks.add(o,n)}}pc(t){const{mediaType:i,newMediaInfo:s}=t;if(i==="audio"){const n=this.b.audioTracks.getById(`dash-audio-${s.index}`);if(n){const r=this.aa(t);this.b.audioTracks[p.ea](n,!0,r)}}else i==="video"&&this.d&&this.d.isPaused()&&!this.b.player.paused&&this.d.play()}Za(t){if(t.mediaType!=="video"||!this.d||!this.d.getCurrentTrackFor("video"))return;let i=null;if(this.Yn?(i=this.Yn,this.Yn=null):i=this.b.qualities[t.newQuality],i){const s=this.aa(t);this.b.qualities[p.ea](i,!0,s)}}Li(t){if(this.b.$state.canPlay()||!this.d)return;const{type:i,mediaPresentationDuration:s}=t.data,n=this.aa(t);this.b.delegate.c("stream-type-change",i!=="static"?"live":"on-demand",n),this.b.delegate.c("duration-change",s,n),this.b.qualities[S.Wa](!0,n);const r=this.d.getVideoElement(),d=this.d.getTracksForTypeFromManifest("video",t.data),c=[...new Set(d.map(e=>e.mimeType))].find(e=>e&&_(r,e)),l=d.filter(e=>c===e.mimeType);let o=this.d.getTracksForTypeFromManifest("audio",t.data);const f=[...new Set(o.map(e=>e.mimeType))].find(e=>e&&F(r,e));o=o.filter(e=>f===e.mimeType);let g=0;l.forEach((e,y)=>{if(e.bitrateList.forEach(h=>{const T={id:h.id?.toString()??`dash-bitrate-${g}`,width:h.width??0,height:h.height??0,bitrate:h.bandwidth??0,codec:e.codec,index:g};this.b.qualities[p.da](T,n),g++}),y===0&&$(e.index)){const h=this.b.qualities[e.index];h&&this.b.qualities[p.ea](h,!0,n)}}),o.forEach((e,y)=>{const h=e.labels.find(w=>navigator.languages.some(D=>w.lang&&D.toLowerCase().startsWith(w.lang.toLowerCase())))||e.labels[0],T={id:`dash-audio-${e?.index}`,label:e.bitrateList[0]?.id??h?.text??(e.lang&&k(e.lang))??e.lang??"",language:e.lang??"",kind:"main",mimeType:e.mimeType,codec:e.codec,index:y};this.b.audioTracks[p.da](T,n)}),r.dispatchEvent(new u("canplay",{trigger:n}))}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?.setQualityFor("video",t.selectedIndex,!0),this.Yn=null}lg(t,i){this.d?.updateSettings({streaming:{abr:{autoSwitchBitrate:{[t]:i}}}})}ke(){const{qualities:t}=this.b;if(!this.d||t.auto||!t.selected)return;let i=this.d.getCurrentTrackFor("video");if(i?.codec!==t.selected.codec){const n=this.d.getTracksFor("video").find(r=>r.codec===t.selected.codec);n&&(this.d.setCurrentTrack(n),i=n),this.Yn=t.selected}const s=i?.bitrateList.findIndex(n=>n.height===t.selected.height)??t.selectedIndex;this.lg("video",!1),this.d.setQualityFor("video",s,t.switch==="current"),P&&(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(),!(!b(t.src)&&!v(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 B(this.L,t);return E(i)&&!b(this.L)&&(i=await V(this.L,t)),i?window.dashjs.supportsMediaSource()?i:(this.b.player.dispatch(new u("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 u("dash-lib-load-start"))}tb(t){this.b.player.dispatch(new u("dash-lib-loaded",{detail:t})),this.La(t)}re(t){const i=Q(t);this.b.player.dispatch(new u("dash-lib-load-error",{detail:i})),this.b.delegate.c("error",{message:i.message,code:4,error:i})}}async function V(a,t={}){if(!E(a)){if(t.onLoadStart?.(),J(a))return t.onLoaded?.(a),a;if(x(a)){const i=a.MediaPlayer;return t.onLoaded?.(i),i}try{const i=(await a())?.default;if(x(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 B(a,t={}){if(b(a)){t.onLoadStart?.();try{if(await M(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 x(a){return a&&"MediaPlayer"in a}const U="https://cdn.jsdelivr.net";class A extends I{constructor(){super(...arguments),this.$$PROVIDER_TYPE="DASH",this.rc=null,this.e=new G(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(){b(this.oa)&&q(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=j(this.b.$state.source);i&&this.loadSource(i)})}async loadSource(t,i){if(!b(t.src)&&!v(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()}}A.supported=R();export{A as DASHProvider};