1 line
7.6 KiB
JavaScript
1 line
7.6 KiB
JavaScript
define(["exports","./../emby-apiclient/events.js","./../browser.js"],function(_exports,_events,_browser){var recoverDecodingErrorDate,recoverSwapAudioCodecDate;function handleHlsJsMediaError(instance,reject){var now,hlsPlayer=instance._hlsPlayer;hlsPlayer&&(now=Date.now(),window.performance&&window.performance.now&&(now=performance.now()),!recoverDecodingErrorDate||3e3<now-recoverDecodingErrorDate?(recoverDecodingErrorDate=now,console.log("try to recover media Error ..."),hlsPlayer.recoverMediaError()):!recoverSwapAudioCodecDate||3e3<now-recoverSwapAudioCodecDate?(recoverSwapAudioCodecDate=now,console.log("try to swap Audio Codec and recover media Error ..."),hlsPlayer.swapAudioCodec(),hlsPlayer.recoverMediaError()):(console.error("cannot recover, last media error recovery failed ..."),reject?rejectWithError(reject,"mediadecodeerror"):onErrorInternal(instance,"mediadecodeerror")))}function onErrorInternal(instance,type){instance.destroyCustomTrack&&instance.destroyCustomTrack(instance._mediaElement),_events.default.trigger(instance,"error",[{type:type}])}function onError(){var type,errorCode=this.error&&this.error.code||0,errorMessage=this.error&&this.error.message||"",instance=(console.log("Media element error: "+errorCode.toString()+" "+errorMessage),this._mediaPlayerInstance);if(instance){switch(errorCode){case 1:return;case 2:type="network";break;case 3:if(instance._hlsPlayer)return void handleHlsJsMediaError(instance);type="mediadecodeerror";break;case 4:type="medianotsupported";break;default:return}onErrorInternal(instance,type)}else console.log("Cannot process media element error event because _mediaPlayerInstance is null")}function removeErrorEventListener(elem){elem._mediaPlayerInstance=null,elem.removeEventListener("error",onError)}function onSuccessfulPlay(instance,elem){removeErrorEventListener(elem),elem._mediaPlayerInstance=instance,elem.addEventListener("error",onError)}function playWithPromise(instance,elem){try{var promise=elem.play();return promise&&promise.then?promise.then(function(e){return Promise.resolve({autoplayed:!0})}.bind(elem),function(e){e=(e.name||"").toLowerCase();return"notallowederror"===(e="notsupportederror"===e?"medianotsupported":e)||"aborterror"===e?(onSuccessfulPlay(instance,elem),Promise.resolve({autoplayed:!1})):Promise.reject({name:e||"notallowederror"})}):(onSuccessfulPlay(instance,elem),Promise.resolve({autoplayed:_browser.default.tv||_browser.default.chromecast}))}catch(err){return console.log("error calling video.play: "+err),Promise.reject()}}function destroyCastPlayer(instance){var player=instance._castPlayer;if(player){try{player.unload()}catch(err){console.log(err)}instance._castPlayer=null}}function destroyHlsPlayer(instance){var player=instance._hlsPlayer;if(player){try{player.destroy()}catch(err){console.log(err)}instance._hlsPlayer=null}}function destroyFlvPlayer(instance){var player=instance._flvPlayer;if(player){try{player.unload(),player.detachMediaElement(),player.destroy()}catch(err){console.log(err)}instance._flvPlayer=null}}function rejectWithError(reject,errorCode){var e=new Error("Playback failure");errorCode&&(e.name=errorCode),reject(e)}function supportsWindowsDecoder(type,name){return(new Windows.Media.Core.CodecQuery).findAllAsync(Windows.Media.Core.CodecKind[type],Windows.Media.Core.CodecCategory.Decoder,Windows.Media.Core.CodecSubtypes[name]).then(function(systemDecoders){return 0<systemDecoders.length})}function getDeviceProfileForWindowsUwp(item,options,profileBuilder){var promises=[supportsWindowsDecoder("Audio","audioFormatDolbyAC3"),supportsWindowsDecoder("Audio","audioFormatDts"),supportsWindowsDecoder("Video","videoFormatHevc")];return Promise.all(promises).then(function(results){var profileOptions={item:item};return profileOptions.supportsDts=results[1],profileOptions.supportsTrueHd=!1,profileOptions.audioChannels="undefined"!=typeof Windows&&Windows.System&&"Windows.Mobile"!==Windows.System.Profile.AnalyticsInfo.versionInfo.deviceFamily?6:2,profileBuilder(profileOptions).then(function(profile){return item&&!item.RunTimeTicks&&(profile.DirectPlayProfiles=profile.DirectPlayProfiles.filter(function(d){return"Video"!==d.Type||"ts,mpegts"!==d.Container})),profile})})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_exports.default={enableHlsJsPlayer:function(runTimeTicks,mediaType){if(null==globalThis.MediaSource)return!1;if(_browser.default.web0s||_browser.default.netcast)return!1;if(_browser.default.edge)return!1;if(!(!(media=document.createElement("video")).canPlayType("application/x-mpegURL").replace(/no/,"")&&!media.canPlayType("application/vnd.apple.mpegURL").replace(/no/,""))){if(_browser.default.android&&"Audio"===mediaType)return!0;if(runTimeTicks&&"Audio"===mediaType)return!1;if(_browser.default.osx)return!1}var media;return!0},onErrorInternal:onErrorInternal,applySrc:function(elem,src,options){return window.Windows&&options.mediaSource&&options.mediaSource.IsLocal?Windows.Storage.StorageFile.getFileFromPathAsync(options.url).then(function(file){return elem.src=URL.createObjectURL(file,{oneTimeOnly:!0}),Promise.resolve()}):(elem.src=src,Promise.resolve())},playWithPromise:playWithPromise,destroyHlsPlayer:destroyHlsPlayer,destroyFlvPlayer:destroyFlvPlayer,destroyCastPlayer:destroyCastPlayer,bindEventsToHlsPlayer:function(instance,hls,elem,resolve,reject){hls.on(Hls.Events.MANIFEST_PARSED,function(){playWithPromise(instance,elem).then(function(result){reject=null,resolve(result)},function(){reject&&(reject(),reject=null)})}),hls.on(Hls.Events.ERROR,function(event,data){if(console.log("HLS Error: Type: "+data.type+" Details: "+(data.details||"")+" Fatal: "+(data.fatal||!1)+" Reason: "+(data.reason||"")),data.type===Hls.ErrorTypes.NETWORK_ERROR)if(data.response&&data.response.code&&400<=data.response.code)return console.log("hls.js response error code: "+data.response.code),hls.destroy(),void(reject?(rejectWithError(reject,"servererror"),reject=null):onErrorInternal(instance,"servererror"));if(data.fatal||reject)switch(data.type){case Hls.ErrorTypes.NETWORK_ERROR:reject||data.response&&0===data.response.code?(data.response&&console.log("hls.js response error code: "+data.response.code),hls.destroy(),reject?(rejectWithError(reject,"network"),reject=null):onErrorInternal(instance,"network")):(console.log("fatal network error encountered, try to recover"),hls.startLoad());break;case Hls.ErrorTypes.MEDIA_ERROR:console.log("media error encountered, try to recover");var currentReject=reject;reject=null,currentReject?rejectWithError(currentReject,"mediadecodeerror"):handleHlsJsMediaError(instance,currentReject);break;default:console.log("Cannot recover from hls error - destroy and trigger error"),hls.destroy(),reject?(rejectWithError(reject,"mediadecodeerror"),reject=null):onErrorInternal(instance,"mediadecodeerror")}})},onEndedInternal:function(instance,elem,triggerStopEvent){removeErrorEventListener(elem),elem.src="",elem.innerHTML="",elem.removeAttribute("src"),destroyHlsPlayer(instance),destroyFlvPlayer(instance),destroyCastPlayer(instance),!(elem={src:instance._currentSrc})!==triggerStopEvent&&_events.default.trigger(instance,"stopped",[elem]),instance._currentTime=null,instance._currentSrc=null,instance._currentPlayOptions=null},getDeviceProfile:function(instance,item,options){return function(item){return require(["browserdeviceprofile","connectionManager"]).then(function(responses){var profileBuilder=responses[0];responses[1];return"undefined"!=typeof Windows&&Windows.Media?getDeviceProfileForWindowsUwp(item,0,profileBuilder):profileBuilder({item:item})})}(item).then(function(profile){return instance._lastProfile=profile})},removeErrorEventListener:removeErrorEventListener}}); |