@eyevinn/web-player-cast
Version:
See [@eyevinn/web-player](https://www.npmjs.com/package/@eyevinn/web-player).
2 lines (1 loc) • 3.5 kB
JavaScript
import e from"mitt";import{PlaybackState as t}from"@eyevinn/web-player-core";class a{constructor(){this.emitter=e()}on(e,t){this.emitter.on.apply(this,arguments)}off(e,t){this.emitter.on.apply(this,arguments)}emit(e,t){this.emitter.emit.apply(this,arguments)}destroy(){this.emitter.all.clear()}}let s;function r(e,t){return s||(s=new Promise((a,s)=>{window.__onGCastApiAvailable=r=>{r?(cast.framework.CastContext.getInstance().setOptions({receiverApplicationId:e||chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,autoJoinPolicy:t||chrome.cast.AutoJoinPolicy.PAGE_SCOPED}),a()):s(new Error("[Cast] not available"))};const r=document.createElement("script");r.src="//www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1",document.body.appendChild(r)}))}var i;!function(e){e.CONNECTED="cast:connected",e.DISCONNECTED="cast:disconnected",e.STATE_CHANGE="cast:state_change"}(i||(i={}));class o extends a{constructor(e,a){super(),this.state={playbackState:t.IDLE,currentTime:0,duration:0,isLive:!1,isAtLiveEdge:!1,isSeekable:!0,isMuted:!1,audioTracks:[],textTracks:[],volume:1},this.player=void 0,this.playerController=void 0,r(e,a).then(()=>{this.player=new cast.framework.RemotePlayer,this.playerController=new cast.framework.RemotePlayerController(this.player),this.setupListeners()},e=>console.error(e))}setState(e){this.state=Object.assign({},this.state,e),this.emit(i.STATE_CHANGE,{state:this.state})}getPlaybackStateFromPlayerState(e){switch(e){case chrome.cast.media.PlayerState.BUFFERING:return t.BUFFERING;case chrome.cast.media.PlayerState.PAUSED:return t.PAUSED;case chrome.cast.media.PlayerState.PLAYING:return t.PLAYING;case chrome.cast.media.PlayerState.IDLE:return t.IDLE}}getDuration(){return this.player.liveSeekableRange?this.player.liveSeekableRange.end:this.player.duration}setupListeners(){cast.framework.CastContext.getInstance().addEventListener(cast.framework.CastContextEventType.SESSION_STATE_CHANGED,e=>{switch(e.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_RESUMED:this.emit(i.CONNECTED),this.setState({playbackState:t.READY,isMuted:this.player.isMuted});break;case cast.framework.SessionState.SESSION_ENDED:this.emit(i.DISCONNECTED),this.setState({playbackState:t.IDLE})}}),this.playerController.addEventListener(cast.framework.RemotePlayerEventType.ANY_CHANGE,({field:e,value:a})=>{switch(e){case"currentTime":this.setState({currentTime:a,isAtLiveEdge:a>=this.state.duration-20});break;case"duration":this.setState({duration:a});break;case"playerState":{const e=this.getPlaybackStateFromPlayerState(a);this.setState({playbackState:e}),e===t.IDLE&&this.stop()}break;case"liveSeekableRange":this.setState(a?{isLive:!a.isLiveDone,duration:a.end-a.start,isSeekable:a.end-a.start>300}:{isLive:!1})}})}load(e,t=null){const a=cast.framework.CastContext.getInstance().getCurrentSession(),s=new chrome.cast.media.MediaInfo(e,"video/mp4"),r=new chrome.cast.media.LoadRequest(s);return t&&(r.currentTime=t),a.loadMedia(r)}play(){this.playerController.playOrPause()}pause(){this.playerController.playOrPause()}stop(){this.playerController.stop()}mute(){this.playerController.muteOrUnmute()}unmute(){this.playerController.muteOrUnmute()}setAudioTrack(){}setTextTrack(){}seekTo({position:e,change:t,percentage:a}){a?e=Math.min(a,99.9)/100*this.getDuration():t&&(e=this.player.currentTime+t),this.player.currentTime=e,this.playerController.seek()}}export{o as CastSender,i as CastSenderEvent,r as initializeCast};