EmbyCrackedClient/web/modules/htmlvideoplayer/htmlmediahelper.js

1 line
7.7 KiB
JavaScript
Raw Normal View History

2025-06-25 11:46:04 +08:00
import events from"./../emby-apiclient/events.js";import browser from"./../browser.js";function canPlayNativeHls(){var media=document.createElement("video");return!(!media.canPlayType("application/x-mpegURL").replace(/no/,"")&&!media.canPlayType("application/vnd.apple.mpegURL").replace(/no/,""))}function canPlayHlsWithMSE(){return null!=globalThis.MediaSource||null!=globalThis.ManagedMediaSource}function enableHlsJsPlayer(runTimeTicks,mediaType){if(!canPlayHlsWithMSE())return!1;if("webos"===globalThis.appMode)return!1;if(browser.edge)return!1;if(canPlayNativeHls()){if(browser.android&&"Audio"===mediaType)return!0;if(runTimeTicks&&"Audio"===mediaType)return!1}return!0}let recoverDecodingErrorDate,recoverSwapAudioCodecDate;function handleHlsJsMediaError(instance,reject){var hlsPlayer=instance._hlsPlayer;if(hlsPlayer){let 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.trigger(instance,"error",[{type:type}])}function applySrc(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())}function onError(){var 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){let type;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 onPlayPromiseResolved(e){return Promise.resolve({autoplayed:!0})}function playWithPromise(instance,elem){try{var promise=elem.play();return promise&&promise.then?promise.then(onPlayPromiseResolved.bind(elem),function(e){let errorName=(e.name||"").toLowerCase();return"notallowederror"===(errorName="notsupportederror"===errorName?"medianotsupported":errorName)||"aborterror"===errorName?(onSuccessfulPlay(instance,elem),Promise.resolve({autoplayed:!1})):Promise.reject({name:errorName||"notallowederror"})}):(onSuccessfulPlay(instance,elem),Promise.resolve({autoplayed:browser.tv||browser.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{console.log("destroying hls player"),player.destroy()}catch(err){console.log(err)}instance._hlsPlayer=null}}function rejectWithError(reject,errorCode){var e=new Error("Playback failure");errorCode&&(e.name=errorCode),reject(e)}function bindEventsToHlsPlayer(instance,hls,elem,resolve,reject){hls.on(Hls.Events.MANIFEST_PARSED,function(){playWithPromise(instance,elem).then(fun