EmbyCrackedClient/web/modules/common/playback/playbackmanager.js
2025-06-25 11:46:04 +08:00

1 line
No EOL
92 KiB
JavaScript

import events from"./../../emby-apiclient/events.js";import appSettings from"./../appsettings.js";import ApiClient from"./../../emby-apiclient/apiclient.js";import pluginManager from"./../pluginmanager.js";import PlayQueueManager from"./playqueuemanager.js";import userSettings from"./../usersettings/usersettings.js";import globalize from"./../globalize.js";import connectionManager from"./../../emby-apiclient/connectionmanager.js";import{appHost,fullscreenManager}from"./../servicelocator.js";import loading from"./../../loading/loading.js";import MethodTimer from"./../methodtimer.js";import qualityOptions from"./../qualityoptions.js";let QueueQueryLimit=5e3,PlaybackItemFields="ProductionYear,PremiereDate,Container";function requireFileSystem(dep){return new Promise(function(resolve,reject){require(["filesystem"],resolve)})}function enableLocalPlaylistManagement(player){return!player.getPlaylist&&!!player.isLocalPlayer}function bindToFullscreenChange(player){events.on(fullscreenManager,"fullscreenchange",function(){events.trigger(player,"fullscreenchange")})}function triggerPlayerChange(playbackManagerInstance,newPlayer,newTarget,previousPlayer,previousTargetInfo){!newPlayer&&!previousPlayer||newTarget&&previousTargetInfo&&newTarget.id===previousTargetInfo.id||events.trigger(playbackManagerInstance,"playerchange",[newPlayer,newTarget,previousPlayer])}function returnResolve(err){return console.error(err),Promise.resolve()}function addPlaylistItemsToPlaybackReport(info,playlist,serverId){var list=[];for(let i=0,length=playlist.length;i<length;i++){var playlistItem=playlist[i],itemInfo={Id:playlistItem.Id,PlaylistItemId:playlistItem.PlaylistItemId};playlistItem.ServerId!==serverId&&(itemInfo.ServerId=playlistItem.ServerId),list.push(itemInfo)}info.NowPlayingQueue=list}function addPlaylistToPlaybackReport(playbackManagerInstance,info,player,serverId){return playbackManagerInstance.getPlaylist().then(function(playlistResult){addPlaylistItemsToPlaybackReport(info,playlistResult.Items,serverId)})}function reportPlayback(playbackManagerInstance,state,player,reportPlaylist,serverId,method,progressEventName,additionalData,isAutomated){if(!serverId)return Promise.resolve();if(state.IsBackgroundPlayback)return Promise.resolve();let info=Object.assign({},state.PlayState);if((info=additionalData?Object.assign(info,additionalData):info).ItemId=state.NowPlayingItem.Id,!info.ItemId)return Promise.resolve();progressEventName&&(info.EventName=progressEventName),info.PlaylistIndex=state.PlaylistIndex,info.PlaylistLength=state.PlaylistLength,info.NextMediaType=state.NextMediaType;let apiClient=connectionManager.getApiClient(serverId);return isAutomated&&info.IsPaused&&apiClient.isMinServerVersion("4.8.0.56")?Promise.resolve():reportPlaylist?"reportPlaybackStopped"===method?(addPlaylistItemsToPlaybackReport(info,playbackManagerInstance._playQueueManager.getPlaylistResult({}).Items,serverId),apiClient[method](info).catch(returnResolve)):addPlaylistToPlaybackReport(playbackManagerInstance,info,player,serverId,method).then(function(){return apiClient[method](info).catch(returnResolve)}):apiClient[method](info).catch(returnResolve)}function normalizeName(t){return t.toLowerCase().replace(" ","")}function getItemsFromAudioBookForPlayback(item,signal){var apiClient=connectionManager.getApiClient(item);return apiClient.getNextUpAudioBookItems({AlbumId:item.Id,UserId:apiClient.getCurrentUserId(),EnableTotalRecordCount:!1,ExcludeLocationTypes:"Virtual",Fields:PlaybackItemFields},signal).then(function(result){return result.Items.length?result:getItemsForPlayback(item.ServerId,{ParentId:item.Id,Filters:"IsNotFolder",Recursive:!0},signal)})}function getItemsFromSeriesForPlayback(item,signal){var apiClient=connectionManager.getApiClient(item);return apiClient.getNextUpEpisodes({SeriesId:item.Id,UserId:apiClient.getCurrentUserId(),EnableTotalRecordCount:!1,ExcludeLocationTypes:"Virtual",Fields:PlaybackItemFields},signal).then(function(result){return result.Items.length?result:getItemsForPlayback(item.ServerId,{ParentId:item.Id,Filters:"IsNotFolder",Recursive:!0},signal)})}function getItemsForPlayback(serverId,query,signal){var itemId,serverId=connectionManager.getApiClient(serverId);return query.Ids&&1===query.Ids.split(",").length?(itemId=query.Ids.split(","),serverId.getItem(serverId.getCurrentUserId(),itemId,{ExcludeFields:"VideoChapters,VideoMediaSources,MediaStreams,People,Overview"},signal).then(function(item){return{Items:[item],TotalRecordCount:1}})):(query.Fields=PlaybackItemFields,query.ExcludeLocationTypes="Virtual",query.EnableTotalRecordCount=!1,(query.CollapseBoxSetItems=!1)!==query.ProjectToMedia&&(query.ProjectToMedia=!0),serverId.getItems(serverId.getCurrentUserId(),query,signal))}function createStreamInfoFromUrlItem(item){return{url:item.Url||item.Path,playMethod:"DirectPlay",item:item,textTracks:[],mediaType:item.MediaType}}function mergePlaybackQueries(obj1,obj2){obj1=Object.assign(obj1,obj2),obj2=obj1.Filters?obj1.Filters.split(","):[];return obj2.includes("IsNotFolder")||obj2.push("IsNotFolder"),obj1.Filters=obj2.join(","),obj1}function getMimeType(type,container){if(container=(container||"").toLowerCase(),"audio"===type){if("opus"===container)return"audio/ogg";if("webma"===container)return"audio/webm";if("m4a"===container)return"audio/mp4"}else if("video"===type){if("mkv"===container)return"video/x-matroska";if("m4v"===container)return"video/mp4";if("mov"===container)return"video/quicktime";if("mpg"===container)return"video/mpeg";if("flv"===container)return"video/x-flv"}return type+"/"+container}function isAutomaticPlayer(player){return!!player.isLocalPlayer}function getAutomaticPlayers(instance,forceLocalPlayer){if(!forceLocalPlayer){forceLocalPlayer=instance._currentPlayer;if(forceLocalPlayer&&!isAutomaticPlayer(forceLocalPlayer))return[forceLocalPlayer]}return instance.getPlayers().filter(isAutomaticPlayer)}function isServerItem(item){return!!item.Id}function enableIntros(item){return"Video"===item.MediaType&&"TvChannel"!==item.Type&&"InProgress"!==item.Status&&isServerItem(item)}function getDefaultIntros(){return Promise.resolve({Items:[]})}function getIntros(firstItem,apiClient,options,signal){return options.shuffle||options.startPositionTicks||!1===options.fullscreen||!enableIntros(firstItem)||!userSettings.enableCinemaMode()?getDefaultIntros():(loading.show(),apiClient.getIntros(firstItem.Id,signal).catch(getDefaultIntros))}function getAudioMaxValues(deviceProfile){let maxAudioSampleRate=null,maxAudioBitDepth=null,maxAudioBitrate=null;return deviceProfile.CodecProfiles.forEach(function(codecProfile){"Audio"===codecProfile.Type&&(codecProfile.Conditions||[]).forEach(function(condition){"LessThanEqual"===condition.Condition&&"AudioBitDepth"===condition.Property&&(maxAudioBitDepth=condition.Value),"LessThanEqual"===condition.Condition&&"AudioSampleRate"===condition.Property&&(maxAudioSampleRate=condition.Value),"LessThanEqual"===condition.Condition&&"AudioBitrate"===condition.Property&&(maxAudioBitrate=condition.Value)})}),{maxAudioSampleRate:maxAudioSampleRate,maxAudioBitDepth:maxAudioBitDepth,maxAudioBitrate:maxAudioBitrate}}function getAudioStreamUrlFromDeviceProfile(item,deviceProfile,maxBitrate,apiClient,startPosition){var transcodingProfile=deviceProfile.TranscodingProfiles.filter(function(p){return"Audio"===p.Type&&"Streaming"===p.Context})[0];let directPlayContainers=[];for(let directPlayProfileIndex=0,directPlayProfilesLength=deviceProfile.DirectPlayProfiles.length;directPlayProfileIndex<directPlayProfilesLength;directPlayProfileIndex++){var p=deviceProfile.DirectPlayProfiles[directPlayProfileIndex];if("Audio"===p.Type){var audioCodecs=p.AudioCodec?p.AudioCodec.split(","):[];if(audioCodecs.length)for(let j=0,length2=audioCodecs.length;j<length2;j++)directPlayContainers.push(p.Container+"|"+audioCodecs[j]);else directPlayContainers.push(p.Container)}}directPlayContainers=directPlayContainers.join(",");var maxValues=getAudioMaxValues(deviceProfile);return apiClient.getAudioStreamUrl(item,transcodingProfile,directPlayContainers,maxValues.maxAudioBitrate||maxBitrate,maxValues.maxAudioSampleRate,maxValues.maxAudioBitDepth,startPosition,!1)}function getStreamUrls(items,deviceProfile,maxBitrate,apiClient,startPosition){var audioTranscodingProfile=deviceProfile.TranscodingProfiles.filter(function(p){return"Audio"===p.Type&&"Streaming"===p.Context})[0];let audioDirectPlayContainers="";deviceProfile.DirectPlayProfiles.forEach(function(p){"Audio"===p.Type&&(audioDirectPlayContainers?audioDirectPlayContainers+=","+p.Container:audioDirectPlayContainers=p.Container,p.AudioCodec)&&(audioDirectPlayContainers+="|"+p.AudioCodec)});deviceProfile=getAudioMaxValues(deviceProfile);return apiClient.getAudioStreamUrls(items,audioTranscodingProfile,audioDirectPlayContainers,deviceProfile.maxAudioBitrate||maxBitrate,deviceProfile.maxAudioSampleRate,deviceProfile.maxAudioBitDepth,startPosition,!1)}function setStreamUrlIntoAllMediaSources(mediaSources,streamUrl){for(let i=0,length=mediaSources.length;i<length;i++)mediaSources[i].StreamUrl=streamUrl}function createAudioMediaSourceFromItem(item){return{Id:item.Id,MediaStreams:[],RunTimeTicks:item.RunTimeTicks,Container:item.Container,Bitrate:item.Bitrate}}function setStreamUrls(items,deviceProfile,maxBitrate,apiClient,startPosition){return getStreamUrls(items,deviceProfile,maxBitrate,apiClient,startPosition).then(function(streamUrls){for(let i=0,length=items.length;i<length;i++){var item=items[i],streamUrl=streamUrls[i];streamUrl&&(item.MediaSources||(item.MediaSources=[]),item.MediaSources.length||item.MediaSources.push(createAudioMediaSourceFromItem(item)),setStreamUrlIntoAllMediaSources(item.MediaSources,streamUrl))}})}function getParam(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");name=new RegExp("[\\?&]"+name+"=([^&#]*)","i").exec(url);return null==name?"":decodeURIComponent(name[1].replace(/\+/g," "))}function addResolutionCondition(conditions,name,value){for(let i=0,length=conditions.length;i<length;i++){var currentValue,condition=conditions[i];if(condition.Property===name)return currentValue=parseInt(condition.Value),void(condition.Value=Math.min(currentValue,value).toString())}conditions.push({Condition:"LessThanEqual",Property:name,Value:value.toString(),IsRequired:!1})}function getPlaybackInfo(player,apiClient,item,deviceProfile,maxBitrate,startPosition,isPlayback,mediaSourceId,audioStreamIndex,subtitleStreamIndex,currentPlaySessionId,liveStreamId,enableDirectPlay,enableDirectStream,allowVideoStreamCopy,allowAudioStreamCopy,signal){if("Audio"===item.MediaType)return(mediaSource=createAudioMediaSourceFromItem(item)).StreamUrl=getAudioStreamUrlFromDeviceProfile(item,deviceProfile,maxBitrate,apiClient,startPosition),Promise.resolve({MediaSources:[mediaSource],PlaySessionId:getParam("playSessionId",mediaSource.StreamUrl)});if(item.MediaSources&&item.MediaSources.length&&item.MediaSources[0].StreamUrl)return Promise.resolve({MediaSources:item.MediaSources,PlaySessionId:getParam("playSessionId",item.MediaSources[0].StreamUrl)});var mediaSource=item.Id,startPosition={UserId:apiClient.getCurrentUserId(),StartTimeTicks:startPosition||0};if(isPlayback?(startPosition.IsPlayback=!0,startPosition.AutoOpenLiveStream=!0):(startPosition.IsPlayback=!1,startPosition.AutoOpenLiveStream=!1),null!=audioStreamIndex&&(startPosition.AudioStreamIndex=audioStreamIndex),null!=subtitleStreamIndex&&(startPosition.SubtitleStreamIndex=subtitleStreamIndex),null!=enableDirectPlay&&(startPosition.EnableDirectPlay=enableDirectPlay),null!=enableDirectStream&&(startPosition.EnableDirectStream=enableDirectStream),null!=allowVideoStreamCopy&&(startPosition.AllowVideoStreamCopy=allowVideoStreamCopy),null!=allowAudioStreamCopy&&(startPosition.AllowAudioStreamCopy=allowAudioStreamCopy),mediaSourceId&&(startPosition.MediaSourceId=mediaSourceId),liveStreamId&&(startPosition.LiveStreamId=liveStreamId),maxBitrate&&(startPosition.MaxStreamingBitrate=maxBitrate),player.enableMediaProbe&&!player.enableMediaProbe(item)&&(startPosition.EnableMediaProbe=!1),currentPlaySessionId&&(startPosition.CurrentPlaySessionId=currentPlaySessionId),maxBitrate){var qualities=qualityOptions.getVideoQualityOptions({currentMaxBitrate:maxBitrate,isAutomaticBitrateEnabled:!0,enableAuto:!1});let maxWidth;for(let i=0,length=qualities.length;i<length;i++)if(qualities[i].bitrate===maxBitrate){maxWidth=qualities[i].maxWidth;break}if(maxWidth){deviceProfile.CodecProfiles=deviceProfile.CodecProfiles||[];let foundGlobalCodecProfile;for(let i=0,length=deviceProfile.CodecProfiles.length;i<length;i++){var codecProfile=deviceProfile.CodecProfiles[i];"Video"===codecProfile.Type&&(codecProfile.Conditions=codecProfile.Conditions||[],addResolutionCondition(codecProfile.Conditions,"Width",maxWidth),codecProfile.Codec||(foundGlobalCodecProfile=!0))}foundGlobalCodecProfile||(addResolutionCondition((isPlayback={Type:"Video",Conditions:[]}).Conditions,"Width",maxWidth),deviceProfile.CodecProfiles.push(isPlayback))}}audioStreamIndex=apiClient.getPlaybackInfo(mediaSource,startPosition,deviceProfile,signal);return player.isLocalPlayer?audioStreamIndex:audioStreamIndex.then(sortMediaSourcesForRemotePlayer)}function sortByIsServerContent(a,b){a=ApiClient.isLocalItem(a);return a===ApiClient.isLocalItem(b)?0:a?1:-1}function sortMediaSourcesForRemotePlayer(playbackInfoResult){return playbackInfoResult.MediaSources.sort(sortByIsServerContent),playbackInfoResult}function getOptimalMediaSource(apiClient,item,versions,signal){var promises=versions.map(function(v){return supportsDirectPlay(apiClient,item,v,signal)});return promises.length?Promise.all(promises).then(function(results){for(let i=0,length=versions.length;i<length;i++)versions[i].enableDirectPlay=results[i]||!1;let optimalVersion=versions.filter(function(v){return v.enableDirectPlay})[0];return(optimalVersion=(optimalVersion=optimalVersion||versions.filter(function(v){return v.SupportsDirectStream})[0])||versions.filter(function(s){return s.SupportsTranscoding})[0])||versions[0]}):Promise.reject()}function getLiveStream(player,apiClient,item,playSessionId,deviceProfile,maxBitrate,startPosition,mediaSource,audioStreamIndex,subtitleStreamIndex,signal){deviceProfile={DeviceProfile:deviceProfile,OpenToken:mediaSource.OpenToken},mediaSource={UserId:apiClient.getCurrentUserId(),StartTimeTicks:startPosition||0,ItemId:item.Id,PlaySessionId:playSessionId};return maxBitrate&&(mediaSource.MaxStreamingBitrate=maxBitrate),null!=audioStreamIndex&&(mediaSource.AudioStreamIndex=audioStreamIndex),null!=subtitleStreamIndex&&(mediaSource.SubtitleStreamIndex=subtitleStreamIndex),apiClient.ajax({url:apiClient.getUrl("LiveStreams/Open",mediaSource),type:"POST",data:JSON.stringify(deviceProfile),contentType:"application/json",dataType:"json",signal:signal})}function isHostReachable(mediaSource,apiClient,signal){return mediaSource.IsRemote?Promise.resolve(!0):apiClient.getEndpointInfo(signal).then(function(endpointInfo){if(endpointInfo.IsInNetwork){if(!endpointInfo.IsLocal){endpointInfo=(mediaSource.Path||"").toLowerCase();if(endpointInfo.includes("localhost")||endpointInfo.includes("127.0.0.1"))return Promise.resolve(!1)}return Promise.resolve(!0)}return Promise.resolve(!1)})}function supportsDirectPlay(apiClient,item,mediaSource,signal){let isFolderRip="bluray"===mediaSource.Container||"dvd"===mediaSource.Container;if(mediaSource.SupportsDirectPlay||isFolderRip){if(mediaSource.IsRemote)return Promise.resolve(!1);if("Http"===mediaSource.Protocol&&!mediaSource.RequiredHttpHeaders.length)return mediaSource.SupportsDirectStream||mediaSource.SupportsTranscoding?isHostReachable(mediaSource,apiClient,signal):Promise.resolve(!0);if("File"===mediaSource.Protocol)return requireFileSystem().then(function(filesystem){return filesystem[isFolderRip?"directoryExists":"fileExists"](mediaSource.Path).then(function(){return!0},function(){return!1})})}return Promise.resolve(!1)}function afterPlaybackErrorMessage(instance,errorCode,playNextTrack){"RateLimitExceeded"===errorCode?instance.stop():playNextTrack&&instance.nextTrack()}function processErrorResponseWithResponseHelper(response){return Emby.importModule("./modules/common/responsehelper.js").then(function(responseHelper){return responseHelper.handleErrorResponse(response)})}function showPlaybackErrorMessage(instance,errorResponse,errorCode,fullscreen,playNextTrack){if(!fullscreen||"Aborted"===errorCode)return afterPlaybackErrorMessage(instance,errorCode,playNextTrack);function onAlertDismissed(){return afterPlaybackErrorMessage(instance,errorCode,playNextTrack)}loading.hide(),console.log((new Error).stack),(errorResponse=errorResponse||{errorCode:errorCode}).errorTitle=globalize.translate("HeaderPlaybackError"),processErrorResponseWithResponseHelper(errorResponse).then(onAlertDismissed,onAlertDismissed)}function normalizePlayOptions(playOptions){playOptions.fullscreen=!1!==playOptions.fullscreen}function truncatePlayOptions(playOptions){return{autoplay:playOptions.autoplay,fullscreen:playOptions.fullscreen,mediaSourceId:playOptions.mediaSourceId,audioStreamIndex:playOptions.audioStreamIndex,subtitleStreamIndex:playOptions.subtitleStreamIndex,startPositionTicks:playOptions.startPositionTicks,shuffle:playOptions.shuffle}}function copyPlayOptionsForNextItem(playOptions){return{fullscreen:playOptions.fullscreen}}function getNowPlayingItemForReporting(player,item,mediaSource){var nowPlayingItem=Object.assign({},item);return nowPlayingItem.playOptions=null,delete nowPlayingItem.playOptions,mediaSource&&(nowPlayingItem.RunTimeTicks=mediaSource.RunTimeTicks,nowPlayingItem.MediaStreams=mediaSource.MediaStreams,nowPlayingItem.Chapters=mediaSource.Chapters||item.Chapters,nowPlayingItem.Container=mediaSource.Container,nowPlayingItem.Bitrate=mediaSource.Bitrate,nowPlayingItem.MediaSources=null,delete nowPlayingItem.MediaSources),nowPlayingItem.RunTimeTicks||(item=player.duration())&&(nowPlayingItem.RunTimeTicks=1e4*item),nowPlayingItem}function displayPlayerIndividually(player){return!player.isLocalPlayer}function createTarget(instance,player){var allMediaTypes=["Audio","Video","Game","Photo","Book"],mediaTypes=[];for(let i=0,length=allMediaTypes.length;i<length;i++){var mediaType=allMediaTypes[i];canPlayerPlayMediaType(player,mediaType)&&mediaTypes.push(mediaType)}return{name:player.name,id:player.id,playerName:player.name,playableMediaTypes:mediaTypes,isLocalPlayer:player.isLocalPlayer,supportedCommands:instance.getSupportedCommands(player)}}function getPlayerTargets(player){return player.getTargets?player.getTargets():Promise.resolve([createTarget(player)])}function sortPlayerTargets(a,b){let aVal=a.isLocalPlayer?0:1,bVal=b.isLocalPlayer?0:1;return aVal=aVal.toString()+a.name,bVal=bVal.toString()+b.name,aVal.localeCompare(bVal)}function getDefaultPlayOptions(){return{fullscreen:!0}}let playerStates={};function getPlayerData(player){if(!player)throw new Error("player cannot be null");if(player.name)return playerStates[player.name]||(playerStates[player.name]={},playerStates[player.name]),player;throw new Error("player name cannot be null")}function canPlayerPlayMediaType(player,mediaType){return!!mediaType&&(!(!player.mediaType||player.mediaType!==mediaType)||(player.mediaTypes?player.mediaTypes.includes(mediaType):player.canPlayMediaType(mediaType)))}function PlaybackManager(){let self=this,players=[],currentTargetInfo,currentPairingId=null;function getSubtitleStream(player,index){return self.subtitleTracks(player).filter(function(s){return"Subtitle"===s.Type&&s.Index===index})[0]}function removeCurrentPlayer(player){var previousPlayer=self._currentPlayer;previousPlayer&&player.id!==previousPlayer.id||setCurrentPlayerInternal(null)}function setCurrentPlayerInternal(player,targetInfo){var previousPlayer=self._currentPlayer,previousTargetInfo=currentTargetInfo;if(player&&!targetInfo&&player.isLocalPlayer&&(targetInfo=createTarget(self,player)),player&&!targetInfo)throw new Error("targetInfo cannot be null");currentPairingId=null,self._currentPlayer=player,(currentTargetInfo=targetInfo)&&targetInfo.Id!==previousTargetInfo?.Id&&console.log("Active player: "+JSON.stringify(targetInfo)),previousPlayer&&self.endPlayerUpdates(previousPlayer),player&&self.beginPlayerUpdates(player),triggerPlayerChange(self,player,targetInfo,previousPlayer,previousTargetInfo)}function formatIncludesValue(format,value){if(format.startsWith("-")){if((format=format.substring(1)).toLowerCase().split(",").includes(value))return}else if(!format.toLowerCase().split(",").includes(value))return;return 1}function getSavedMaxStreamingBitrate(apiClient,mediaType){apiClient=(apiClient=apiClient||connectionManager.currentApiClient()).getSavedEndpointInfo()||{};return appSettings.maxStreamingBitrate(apiClient.IsInNetwork,mediaType)}function getDeliveryMethod(subtitleStream){return subtitleStream.DeliveryMethod||(subtitleStream.IsExternal?"External":"Embed")}function canPlayerSeek(player){if(!player)throw new Error("player cannot be null");var streamInfo=getPlayerData(player).streamInfo;if(streamInfo&&(streamInfo.url||"").toLowerCase().includes(".m3u8"))return!0;return player.seekable?player.seekable():!("Transcode"===self.playMethod(player))&&player.duration()}function changeStream(player,ticks,params,progressEventName){if(canPlayerSeek(player)&&null==params)return player.currentTime(parseInt(ticks/1e4)),Promise.resolve();let signal=(new AbortController).signal,liveStreamId=(params=params||{},getPlayerData(player).streamInfo.liveStreamId),lastMediaInfoQuery=getPlayerData(player).streamInfo.lastMediaInfoQuery,playSessionId=self.playSessionId(player),currentItem=self.currentItem(player);return player.getDeviceProfile(currentItem,{isRetry:!1===params.EnableDirectPlay}).then(function(deviceProfile){let audioStreamIndex=null==params.AudioStreamIndex?getPlayerData(player).audioStreamIndex:params.AudioStreamIndex,subtitleStreamIndex=null==params.SubtitleStreamIndex?getPlayerData(player).subtitleStreamIndex:params.SubtitleStreamIndex,currentMediaSource=self.currentMediaSource(player),apiClient=connectionManager.getApiClient(currentItem.ServerId),maxBitrate=(ticks=ticks&&parseInt(ticks),params.MaxStreamingBitrate||self.getMaxStreamingBitrate(player)),currentPlayOptions=currentItem.playOptions||{};return getPlaybackInfo(player,apiClient,currentItem,deviceProfile,maxBitrate,ticks,!0,currentMediaSource.Id,audioStreamIndex,subtitleStreamIndex,playSessionId,liveStreamId,params.EnableDirectPlay,params.EnableDirectStream,params.AllowVideoStreamCopy,params.AllowAudioStreamCopy,signal).then(function(result){if(result.ErrorCode)return Promise.reject({errorCode:result.ErrorCode});currentMediaSource=result.MediaSources[0];result=createStreamInfo(apiClient,currentItem.MediaType,currentItem,currentMediaSource,result.PlaySessionId,ticks);return result.fullscreen=currentPlayOptions.fullscreen,result.lastMediaInfoQuery=lastMediaInfoQuery,result.url?(getPlayerData(player).subtitleStreamIndex=subtitleStreamIndex,getPlayerData(player).audioStreamIndex=audioStreamIndex,getPlayerData(player).maxStreamingBitrate=maxBitrate,((apiClient,player,playSessionId,streamInfo,progressEventName,signal)=>getPlayerData(player).streamInfo&&playSessionId?apiClient.stopActiveEncodings(playSessionId).then(function(){return setSrcIntoPlayer(apiClient,player,streamInfo,progressEventName,playSessionId,signal)}):setSrcIntoPlayer(apiClient,player,streamInfo,progressEventName,null,signal))(apiClient,player,playSessionId,result,progressEventName,signal)):Promise.reject({errorCode:"NoCompatibleStream",skipToNextItem:!0})})})}function setSrcIntoPlayer(apiClient,player,streamInfo,progressEventName,previousPlaySessionId,signal){return normalizePlayOptions(streamInfo),getPlayerData(player).streamInfo=streamInfo,player.play(streamInfo,signal).then(function(){streamInfo.started=!0,"subtitletrackchange"===progressEventName||"audiotrackchange"===progressEventName?events.trigger(player,progressEventName):sendProgressUpdate(player,progressEventName||"timeupdate"),previousPlaySessionId&&apiClient.stopActiveEncodings(previousPlaySessionId)},function(err){return console.log("setSrcIntoPlayer error: "+err?.toString()),previousPlaySessionId&&apiClient.stopActiveEncodings(previousPlaySessionId),streamInfo.started=!1,onPlaybackError.call(player,err,{type:err&&err.name?err.name:"mediadecodeerror",streamInfo:streamInfo,returnPromise:!0})})}function updateResultSetStartingPoint(result,firstItem,options,isQueueing){let startIndex=-1;for(let i=0,length=result.Items.length;i<length;i++)if(result.Items[i].Id===firstItem.Id){startIndex=i;break}return-1!==startIndex&&(isQueueing?(result.Items=result.Items.slice(startIndex),result.TotalRecordCount=result.Items.length):options.startIndex=startIndex),result}function mapToId(i){return i.Id}function translateItemsForPlayback(items,options,showLoading,isQueueing,signal){let firstItem=items[options.startIndex||0],promise;var serverId=firstItem.ServerId,queryOptions=options.queryOptions||{};if("Program"===firstItem.Type)promise=getItemsForPlayback(serverId,{Ids:firstItem.ChannelId},signal);else if("Chapter"===firstItem.Type)options.mediaSourceId=firstItem.MediaSourceId,options.serverId=firstItem.ServerId,promise=getItemsForPlayback(serverId,{Ids:firstItem.ItemId},signal);else if(1<items.length&&(items=>{for(let i=0,length=items.length;i<length;i++){var item=items[i];if(item.PlaylistItemId)return;if(item.IsFolder)return 1;switch(item.Type){case"MusicAlbum":case"MusicArtist":case"Genre":case"MusicGenre":case"GameGenre":case"Studio":case"Person":return 1}}})(items)&&connectionManager.getApiClient(firstItem).isMinServerVersion("4.8.0.30"))promise=getItemsForPlayback(serverId,{Ids:items.map(mapToId).join(",")},signal);else if("Playlist"===firstItem.Type)promise=((item,signal)=>{var serverId=item.ServerId,item=item.Id;let sortBy=userSettings.itemSortBy(item)||"default";var sortOrder=(sortBy="default"===sortBy?"ListItemOrder":sortBy)?userSettings.itemSortOrder(item):null;return getItemsForPlayback(serverId,{ParentId:item,SortBy:sortBy,SortOrder:sortOrder},signal)})(firstItem,signal);else if("BoxSet"===firstItem.Type)promise=((item,signal)=>{var serverId=item.ServerId,itemId=item.Id;let sortBy=userSettings.itemSortBy(itemId)||"default";return"default"===sortBy&&(sortBy="DisplayOrder"),item=(sortBy=connectionManager.getApiClient(item).isMinServerVersion("4.8.0.16")?sortBy:null)?userSettings.itemSortOrder(itemId):null,getItemsForPlayback(serverId,{ParentId:itemId,SortBy:sortBy,SortOrder:item},signal)})(firstItem,signal);else if("MusicArtist"===firstItem.Type)promise=getItemsForPlayback(serverId,{ArtistIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"Album,ParentIndexNumber,IndexNumber",MediaTypes:"Audio"},signal);else if("Photo"===firstItem.MediaType&&1===items.length&&firstItem.ParentId)promise=getItemsForPlayback(serverId,{ParentId:firstItem.ParentId,Filters:"IsNotFolder",Recursive:!1,SortBy:"SortName",MediaTypes:"Photo,Video"},signal).then(function(result){let index=result.Items.map(function(i){return i.Id}).indexOf(firstItem.Id);return-1===index&&(index=0),options.startIndex=index,Promise.resolve(result)});else if("PhotoAlbum"===firstItem.Type)promise=getItemsForPlayback(serverId,{ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!1,SortBy:"SortName",MediaTypes:"Photo,Video"},signal),options.autoplay=!0;else if("MusicGenre"===firstItem.Type)promise=getItemsForPlayback(serverId,{GenreIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"Album,ParentIndexNumber,IndexNumber",ParentId:options.parentId},signal);else if("Genre"===firstItem.Type)promise=getItemsForPlayback(serverId,{GenreIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Video",ParentId:options.parentId},signal);else if("Tag"===firstItem.Type)promise=getItemsForPlayback(serverId,{TagIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Video",ParentId:options.parentId},signal);else if("Studio"===firstItem.Type)promise=getItemsForPlayback(serverId,{StudioIds:firstItem.Id,Filters:"IsNotFolder",Recursive:!0,SortBy:"SortName",MediaTypes:"Video",ParentId:options.parentId},signal);else if("MusicAlbum"!==firstItem.Type||!firstItem.SupportsResume||options.shuffle||0===options.startPositionTicks||queryOptions&&queryOptions.Filters)if("MusicAlbum"===firstItem.Type)promise=getItemsForPlayback(serverId,mergePlaybackQueries({ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0},queryOptions),signal);else if("Series"!==firstItem.Type||options.shuffle||0===options.startPositionTicks||queryOptions&&queryOptions.Filters){if(firstItem.IsFolder)promise=getItemsForPlayback(serverId,mergePlaybackQueries({ParentId:firstItem.Id,Filters:"IsNotFolder",Recursive:!0},queryOptions),signal);else if("Audio"===firstItem.Type&&firstItem.AlbumId&&firstItem.SupportsResume&&1===items.length&&!getPlayer(firstItem,options).isExternalPlayer){serverId=connectionManager.getApiClient(firstItem.ServerId);promise=serverId.getItems(serverId.getCurrentUserId(),{Fields:PlaybackItemFields,ParentId:firstItem.AlbumId,Recursive:!0,IncludeItemTypes:"Audio"},signal).then(function(episodesResult){return updateResultSetStartingPoint(episodesResult,firstItem,options,isQueueing)})}else if("Episode"===firstItem.Type&&1===items.length&&!isQueueing&&!getPlayer(firstItem,options).isExternalPlayer){let apiClient=connectionManager.getApiClient(firstItem.ServerId);promise=apiClient.getCurrentUser({signal:signal}).then(function(user){return firstItem.SeriesId?apiClient.getEpisodes(firstItem.SeriesId,{IsVirtualUnaired:!1,IsMissing:!1,UserId:apiClient.getCurrentUserId(),Fields:PlaybackItemFields},signal).then(function(episodesResult){return(episodesResult=updateResultSetStartingPoint(episodesResult,firstItem,options,isQueueing)).AutoPlay=user.Configuration.EnableNextEpisodeAutoPlay,episodesResult}):Promise.resolve(null)})}}else promise=getItemsFromSeriesForPlayback(firstItem,signal);else promise=getItemsFromAudioBookForPlayback(firstItem,signal);return promise?(options.fullscreen&&showLoading&&loading.show(),promise.then(function(result){return result&&result.Items?result:{Items:items}})):Promise.resolve({Items:items})}function playFromFetchedItems(options,items,showLoading,signal){return translateItemsForPlayback(items,options,showLoading,null,signal).then(function(translatedResult){return((items,options,autoplay,signal)=>{let playStartIndex=options.startIndex,firstItem=(null==playStartIndex&&(playStartIndex=options.shuffle&&items.length?((min,max)=>Math.floor(Math.random()*(max-min+1)+min))(0,items.length):0),items[playStartIndex]);if(firstItem||(playStartIndex=0,firstItem=items[playStartIndex]),!firstItem)return Promise.reject("NoPlayableItems");let firstItemApiClient=connectionManager.getApiClient(firstItem.ServerId);return firstItemApiClient.getCurrentUser({signal:signal}).then(function(user){return null==options.startPositionTicks&&(options.startPositionTicks=firstItem.UserData&&firstItem.UserData.PlaybackPositionTicks||0,options.startPositionTicks)&&(user=1e7*(user.Configuration.ResumeRewindSeconds||0),options.startPositionTicks=Math.max(0,options.startPositionTicks-user)),((items,firstItem,firstItemApiClient,playStartIndex,options,autoplay,signal)=>getIntros(firstItem,firstItemApiClient,options,signal).then(function(introsResult){introsResult=introsResult.Items;introsResult.length&&playStartIndex&&(items=items.slice(playStartIndex),playStartIndex=0);let introPlayOptions;firstItem.playOptions=truncatePlayOptions(options),introPlayOptions=introsResult.length?{fullscreen:firstItem.playOptions.fullscreen}:firstItem.playOptions,self._isBackgroundPlaybackHack=!1===introPlayOptions.fullscreen;for(let i=0,length=(items=introsResult.concat(items)).length;i<length;i++)items[i].playOptions||(items[i].playOptions=copyPlayOptionsForNextItem(options));introPlayOptions.items=items,introPlayOptions.startIndex=playStartIndex,introPlayOptions.command="play";let itemToPlay=items[playStartIndex];return playInternal(itemToPlay,introPlayOptions,function(){self._playQueueManager.setPlaylist(items),self._playQueueManager.autoplay=!1!==autoplay,setPlaylistState(itemToPlay.PlaylistItemId,playStartIndex),options.shuffle&&self._playQueueManager.setShuffle(!0)},signal)}))(items,firstItem,firstItemApiClient,playStartIndex,options,autoplay,signal)})})(translatedResult.Items,options,translatedResult.AutoPlay,signal).catch(function(err){onUnhandledPlaybackFailure(err,signal)})})}function getCurrentTicks(player){if(!player)throw new Error("player cannot be null");let playerTime;playerTime=player.isLocalPlayer?Math.floor(1e4*(player.currentTime()||0)):Math.floor(player.currentTime()||0);player=getPlayerData(player).streamInfo;return player&&(playerTime+=player.transcodingOffsetTicks||0),playerTime}function playPhotos(options,setAsCurrentPlayer,signal){var playStartIndex=options.startIndex||0;let startItem=options.items[playStartIndex],player=getPlayer(startItem,options);return loading.hide(),player.play(options,signal).then(function(){onPlaybackStarted(player,options,{item:startItem},null,!1,setAsCurrentPlayer)})}function setPlaylistState(playlistItemId,index){isNaN(index)||self._playQueueManager.setPlaylistState(playlistItemId,index)}function playInternal(item,playOptions,onPlaybackStartedFn,signal){return normalizePlayOptions(playOptions),((item,playOptions)=>new Promise(function(resolve,reject){var options,interceptors=pluginManager.ofType("preplayintercept");interceptors.sort(function(a,b){return(a.order||0)-(b.order||0)}),interceptors.length?(loading.hide(),(options=Object.assign({},playOptions)).mediaType=item.MediaType,options.item=item,function runNextPrePlay(interceptors,index,options,resolve,reject){if(index>=interceptors.length)return void resolve();let interceptor=interceptors[index];interceptor.intercept(options).then(function(){runNextPrePlay(interceptors,index+1,options,resolve,reject)},reject)}(interceptors,0,options,resolve,reject)):resolve()}))(item,playOptions).then(function(){playOptions.fullscreen&&loading.show();var mediaType=item.MediaType;return!isServerItem(item)||ApiClient.isLocalItem(item)?playAfterBitrateDetect(getSavedMaxStreamingBitrate(connectionManager.getApiClient(item),mediaType),item,playOptions,onPlaybackStartedFn,signal):((apiClient,mediaType,signal)=>["Video","Audio"].includes(mediaType||"")?apiClient.getEndpointInfo(signal).then(function(endpointInfo){return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork,mediaType)?apiClient.detectBitrate(signal).then(function(bitrate){return appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork,mediaType,bitrate),Promise.resolve(bitrate)}):Promise.resolve(getSavedMaxStreamingBitrate(apiClient,mediaType))},function(){return Promise.resolve(getSavedMaxStreamingBitrate(apiClient,mediaType))}):Promise.resolve(getSavedMaxStreamingBitrate(apiClient,mediaType)))(connectionManager.getApiClient(item),mediaType,signal).then(function(bitrate){return playAfterBitrateDetect(bitrate,item,playOptions,onPlaybackStartedFn,signal)})},onInterceptorRejection)}function onUnhandledPlaybackFailure(err,signal){err=err||{},loading.hide();var errorCode=err.errorCode||"NoCompatibleStream";"intercept-cancel"===errorCode||signal.aborted||showPlaybackErrorMessage(self,err,errorCode,!0,err.skipToNextItem),events.trigger(self,"playbackcancelled"),Promise.reject(err)}function onInterceptorRejection(){return Promise.reject({errorCode:"intercept-cancel"})}function playAfterBitrateDetect(maxBitrate,item,playOptions,onPlaybackStartedFn,signal){var activePlayer=self._currentPlayer;if("Photo"===item.MediaType&&activePlayer)return playPhotos(playOptions,!1,signal);let startPosition=playOptions.startPositionTicks,player=getPlayer(item,playOptions),apiClient=isServerItem(item)?connectionManager.getApiClient(item):null,streamInfo=createStreamInfo(apiClient,item.MediaType,item,null,null,startPosition);streamInfo.fullscreen=playOptions.fullscreen;let promise;return promise=activePlayer?((activePlayer,newPlayer,newItem)=>{let state=self.getPlayerState(activePlayer),promise;stopPlaybackProgressTimer(activePlayer);var player=activePlayer;return events.off(player,"stopped",onPlaybackStopped),promise=activePlayer===newPlayer?activePlayer.stop(!1):activePlayer.stop(!0),console.log("onPlaybackChanging"),promise.then(function(){var streamInfo=getPlayerData(activePlayer).streamInfo,nextMediaType=(getPlayerData(activePlayer).streamInfo=null,bindStopped(activePlayer),newItem.MediaType);return state.NextMediaType=nextMediaType,onPlaybackStopped.call(activePlayer,{},{errorCode:"Aborted",playNext:!1,reportNext:!0,resetPlayQueue:!1,playerState:state,streamInfo:streamInfo})})})(activePlayer,player,item):Promise.resolve(),isServerItem(item)?"Photo"===item.MediaType?playPhotos(playOptions,null==activePlayer,signal):"Game"===item.MediaType||"Book"===item.MediaType?((options,signal)=>{var playStartIndex=options.startIndex||0;let player=getPlayer(playStartIndex=options.items[playStartIndex],options),playOptions=(loading.hide(),{item:playStartIndex,mediaType:playStartIndex.MediaType});return player.play(playOptions,signal).then(function(){onPlaybackStarted(player,options,playOptions,null,!1)})})(playOptions,signal):Promise.all([promise,player.getDeviceProfile(item)]).then(function(responses){player&&player.isLocalPlayer&&enableLocalPlaylistManagement(player)&&onPlaybackRequested(player,playOptions,streamInfo);var fullscreen,responses=responses[1],mediaSourceId=playOptions.mediaSourceId,audioStreamIndex=playOptions.audioStreamIndex,subtitleStreamIndex=playOptions.subtitleStreamIndex;return player&&!enableLocalPlaylistManagement(player)?(fullscreen=streamInfo.fullscreen,((player,items,deviceProfile,maxBitrate,apiClient,startPositionTicks,mediaSourceId,audioStreamIndex,subtitleStreamIndex,startIndex,shuffle,fullscreen)=>(shuffle&&(startIndex=0,subtitleStreamIndex=audioStreamIndex=mediaSourceId=startPositionTicks=null),setStreamUrls(items,deviceProfile,maxBitrate,apiClient,startPositionTicks).then(function(){return loading.hide(),player.play({items:items,startPositionTicks:startPositionTicks||0,mediaSourceId:mediaSourceId,audioStreamIndex:audioStreamIndex,subtitleStreamIndex:subtitleStreamIndex,startIndex:startIndex,fullscreen:fullscreen,shuffle:shuffle}).then(function(){onPlayQueueStartedFromSelfManagingPlayer.call(player,{})})})))(player,playOptions.items,responses,maxBitrate,apiClient,startPosition,mediaSourceId,audioStreamIndex,subtitleStreamIndex,playOptions.startIndex,playOptions.shuffle,fullscreen)):(playOptions.items=null,((player,apiClient,deviceProfile,maxBitrate,item,startPosition,mediaSourceId,audioStreamIndex,subtitleStreamIndex,signal)=>getPlaybackInfo(player,apiClient,item,deviceProfile,maxBitrate,startPosition,!0,mediaSourceId,audioStreamIndex,subtitleStreamIndex,null,null,null,null,null,null,signal).then(function(playbackInfoResult){return playbackInfoResult.ErrorCode?Promise.reject({errorCode:playbackInfoResult.ErrorCode}):getOptimalMediaSource(apiClient,item,playbackInfoResult.MediaSources,signal).then(function(mediaSource){return mediaSource?mediaSource.RequiresOpening&&!mediaSource.LiveStreamId?getLiveStream(player,apiClient,item,playbackInfoResult.PlaySessionId,deviceProfile,maxBitrate,startPosition,mediaSource,null,null,signal).then(function(openLiveStreamResult){return supportsDirectPlay(apiClient,item,openLiveStreamResult.MediaSource,signal).then(function(result){return openLiveStreamResult.MediaSource.enableDirectPlay=result,{mediaSource:openLiveStreamResult.MediaSource,playSessionId:playbackInfoResult.PlaySessionId}})}):{mediaSource:mediaSource,playSessionId:playbackInfoResult.PlaySessionId}:Promise.reject({errorCode:"NoCompatibleStream"})})}))(player,apiClient,responses,maxBitrate,item,startPosition,mediaSourceId,audioStreamIndex,subtitleStreamIndex,signal).then(function(mediaSourceInfo){let mediaSource=mediaSourceInfo.mediaSource;return"disc"===mediaSource.Container?(loading.hide(),Promise.reject({errorCode:"PlaceHolder",skipToNextItem:!0})):(Object.assign(streamInfo,createStreamInfo(apiClient,item.MediaType,item,mediaSource,mediaSourceInfo.playSessionId,startPosition)),getPlayerData(player).maxStreamingBitrate=maxBitrate,onPlaybackStartedFn(),player.play(streamInfo,signal).then(function(){"Audio"!==item.MediaType&&playOptions.fullscreen&&!player.isExternalPlayer||loading.hide(),onPlaybackStarted(player,playOptions,streamInfo,mediaSource)},function(err){return console.log("player.play error: "+err),onPlaybackStarted(player,playOptions,streamInfo,mediaSource).then(function(){return signal.aborted?onPlaybackStopped.call(player,err,{errorCode:"Aborted",playNext:!1,reportNext:!0,resetPlayQueue:!1}):onPlaybackError.call(player,err,{type:err&&err.name?err.name:"mediadecodeerror",streamInfo:streamInfo,returnPromise:!0,resetPlayQueue:!1})})}))}))}):promise.then(function(){return((player,playOptions,streamInfo,onPlaybackStartedFn,signal)=>(onPlaybackRequested(player,playOptions,streamInfo),onPlaybackStartedFn(),player.play(streamInfo,signal).then(function(){loading.hide(),onPlaybackStarted(player,playOptions,streamInfo)},function(err){throw loading.hide(),self.stop(player),err})))(player,playOptions,streamInfo,onPlaybackStartedFn,signal)})}function createStreamInfo(apiClient,type,item,mediaSource,playSessionId,startPosition){if(item&&!isServerItem(item))return createStreamInfoFromUrlItem(item);let mediaUrl,contentType,transcodingOffsetTicks=0,playerStartPositionTicks=startPosition;var originalMediaSource=mediaSource,liveStreamId=(mediaSource=mediaSource||{MediaStreams:[]}).LiveStreamId;let playMethod="Transcode";var directOptions,mediaSourceContainer=(mediaSource.Container||"").toLowerCase(),prefix=("Video"!==type&&"Audio"!==type||(contentType=getMimeType(type.toLowerCase(),mediaSourceContainer),mediaSource.enableDirectPlay)?(mediaUrl=mediaSource.Path,playMethod="DirectPlay"):mediaSource.StreamUrl?(playMethod="Transcode",mediaUrl=mediaSource.StreamUrl):mediaSource.SupportsDirectStream?(mediaUrl=mediaSource.DirectStreamUrl?apiClient.getUrl(mediaSource.DirectStreamUrl):(directOptions={Static:!0,mediaSourceId:mediaSource.Id,deviceId:apiClient.deviceId(),api_key:apiClient.accessToken()},mediaSource.ETag&&(directOptions.Tag=mediaSource.ETag),mediaSource.LiveStreamId&&(directOptions.LiveStreamId=mediaSource.LiveStreamId),prefix="Video"===type?"Videos":"Audio",mediaSourceContainer=mediaSourceContainer.toLowerCase().replace("m4v","mp4"),apiClient.getUrl(prefix+"/"+item.Id+"/stream."+mediaSourceContainer,directOptions)),playMethod="DirectStream"):mediaSource.SupportsTranscoding&&(mediaUrl=apiClient.getUrl(mediaSource.TranscodingUrl),"hls"===mediaSource.TranscodingSubProtocol?contentType="application/x-mpegURL":(playerStartPositionTicks=null,contentType=getMimeType(type.toLowerCase(),mediaSource.TranscodingContainer),mediaUrl.toLowerCase().includes("copytimestamps=true")||(transcodingOffsetTicks=startPosition||0))),!mediaUrl&&mediaSource.SupportsDirectPlay&&(mediaUrl=mediaSource.Path,playMethod="DirectPlay"),{url:mediaUrl,mimeType:contentType,transcodingOffsetTicks:transcodingOffsetTicks,playMethod:playMethod,playerStartPositionTicks:playerStartPositionTicks,item:item,mediaSource:originalMediaSource,textTracks:getTextTracks(apiClient,item,mediaSource),tracks:getTextTracks(apiClient,item,mediaSource),mediaType:type,liveStreamId:liveStreamId,playSessionId:playSessionId});return prefix}function getTextTracks(apiClient,item,mediaSource){var textStreams=mediaSource.MediaStreams.filter(function(s){return"Subtitle"===s.Type}).filter(function(s){return"External"===s.DeliveryMethod}),tracks=[];for(let i=0,length=textStreams.length;i<length;i++){var textStream=textStreams[i];let textStreamUrl;textStreamUrl=ApiClient.isLocalItem(item)||mediaSource.IsLocal?textStream.Path:textStream.IsExternalUrl?textStream.DeliveryUrl:apiClient.getUrl(textStream.DeliveryUrl),tracks.push({url:textStreamUrl,language:textStream.Language,isDefault:textStream.Index===mediaSource.DefaultSubtitleStreamIndex,index:textStream.Index,format:textStream.Codec})}return tracks}function getPlayer(item,playOptions,forceLocalPlayers){let serverItem=isServerItem(item);return getAutomaticPlayers(self,forceLocalPlayers).filter(function(p){if(canPlayerPlayMediaType(p,item.MediaType)){if(serverItem)return!p.canPlayItem||p.canPlayItem(item,playOptions);if(item.Url&&p.canPlayUrl)return p.canPlayUrl(item.Url)}return!1})[0]}function queue(options,mode,player){if(!(player=player||self._currentPlayer))return self.play(options);let signal=(new AbortController).signal;if(options.items)return translateItemsForPlayback(options.items,options,null,!0,signal).then(function(translatedResult){return queueAll(translatedResult.Items,mode,player)});if(options.serverId)return getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")},signal).then(function(result){return translateItemsForPlayback(result.Items,options,null,!0,signal).then(function(translatedResult){return queueAll(translatedResult.Items,mode,player)})});throw new Error("serverId required!")}function queueAll(items,mode,player){if(items.length){if(!player.isLocalPlayer)return"next"===mode?player.queueNext({items:items}):player.queue({items:items});if(player&&!enableLocalPlaylistManagement(player)){let apiClient=connectionManager.getApiClient(items[0].ServerId);return player.getDeviceProfile(items[0]).then(function(profile){return setStreamUrls(items,profile,self.getMaxStreamingBitrate(player),apiClient,0).then(function(){return"next"===mode?player.queueNext(items):player.queue(items)})})}"next"===mode?(self._playQueueManager.autoplay=!0,self._playQueueManager.queueNext(items)):self._playQueueManager.queue(items),events.trigger(player,"playlistitemadd")}return Promise.resolve()}function startPlaybackProgressTimer(player){stopPlaybackProgressTimer(player),player._progressInterval=new MethodTimer({onInterval:function(){sendProgressUpdate(this,"timeupdate",null,null,!0)}.bind(player),timeoutMs:1e4,type:"interval"})}function stopPlaybackProgressTimer(player){player._progressInterval&&(player._progressInterval.destroy(),player._progressInterval=null)}function onPlaybackRequested(player,playOptions,streamInfo,mediaSource,setCurrentPlayer){if(!player)throw new Error("player cannot be null");!1!==setCurrentPlayer&&setCurrentPlayerInternal(player);setCurrentPlayer=getPlayerData(player),streamInfo.isInitialRequest=!0,streamInfo.playbackStartTimeTicks=1e4*Date.now(),setCurrentPlayer.streamInfo=streamInfo,mediaSource?(setCurrentPlayer.audioStreamIndex=mediaSource.DefaultAudioStreamIndex,setCurrentPlayer.subtitleStreamIndex=mediaSource.DefaultSubtitleStreamIndex,null==setCurrentPlayer.subtitleStreamIndex&&(setCurrentPlayer.subtitleStreamIndex=-1)):(setCurrentPlayer.audioStreamIndex=null,setCurrentPlayer.subtitleStreamIndex=null),playOptions.command,mediaSource=self.getPlayerState(player,streamInfo.item,streamInfo.mediaSource);events.trigger(player,"playbackrequest",[mediaSource]),events.trigger(self,"playbackrequest",[player,mediaSource])}function onPlaybackStarted(player,playOptions,streamInfo,mediaSource,enableProgressTimer,setCurrentPlayer){if(!player)throw new Error("player cannot be null");!1!==setCurrentPlayer&&setCurrentPlayerInternal(player);setCurrentPlayer=getPlayerData(player),streamInfo.isInitialRequest=null,(setCurrentPlayer.streamInfo=streamInfo).playbackStartTimeTicks=1e4*Date.now(),mediaSource?(setCurrentPlayer.audioStreamIndex=mediaSource.DefaultAudioStreamIndex,setCurrentPlayer.subtitleStreamIndex=mediaSource.DefaultSubtitleStreamIndex,null==setCurrentPlayer.subtitleStreamIndex&&(setCurrentPlayer.subtitleStreamIndex=-1)):(setCurrentPlayer.audioStreamIndex=null,setCurrentPlayer.subtitleStreamIndex=null),mediaSource="play"===playOptions.command,setCurrentPlayer=self.getPlayerState(player,streamInfo.item,streamInfo.mediaSource);let promise;return!1!==enableProgressTimer&&(promise=reportPlayback(self,setCurrentPlayer,player,mediaSource,setCurrentPlayer.NowPlayingItem.ServerId,"reportPlaybackStart")),mediaSource&&events.trigger(self,"playqueuestart",[player,setCurrentPlayer]),events.trigger(player,"playbackstart",[setCurrentPlayer]),events.trigger(self,"playbackstart",[player,setCurrentPlayer]),!(streamInfo.started=!0)!==enableProgressTimer&&startPlaybackProgressTimer(player),promise||Promise.resolve()}function onPlayQueueStartedFromSelfManagingPlayer(e,item,mediaSource){item=self.getPlayerState(this,item,mediaSource);events.trigger(self,"playqueuestart",[this,item])}function onPlaybackStartedFromSelfManagingPlayer(e,item,mediaSource){setCurrentPlayerInternal(this);item=self.getPlayerState(this,item,mediaSource);events.trigger(this,"playbackstart",[item]),events.trigger(self,"playbackstart",[this,item])}function onPlaybackStoppedFromSelfManagingPlayer(e,playerStopInfo){stopPlaybackProgressTimer(this);var state=self.getPlayerState(this,playerStopInfo.item,playerStopInfo.mediaSource),nextMediaType=playerStopInfo.nextMediaType,playbackStopInfo={player:this,state:state,nextMediaType:nextMediaType};state.NextMediaType=nextMediaType,getPlayerData(this).streamInfo=null,isServerItem(playerStopInfo.item)&&(state.PlayState.PositionTicks=1e4*(playerStopInfo.positionMs||0)),events.trigger(this,"playbackstop",[state]),events.trigger(self,"playbackstop",[playbackStopInfo]),nextMediaType||(this.destroy(),removeCurrentPlayer(this))}function onPlaybackError(e,error){var errorType=error.type,errorType=(console.log("playbackmanager playback error type: "+(errorType||"")),error.streamInfo||getPlayerData(this).streamInfo);if(errorType){var currentlyPreventsVideoStreamCopy=errorType.url.toLowerCase().includes("allowvideostreamcopy=false"),currentlyPreventsAudioStreamCopy=errorType.url.toLowerCase().includes("allowaudiostreamcopy=false");if(((streamInfo,currentlyPreventsVideoStreamCopy,currentlyPreventsAudioStreamCopy)=>!(!streamInfo.mediaSource.SupportsTranscoding||currentlyPreventsVideoStreamCopy&&currentlyPreventsAudioStreamCopy))(errorType,currentlyPreventsVideoStreamCopy,currentlyPreventsAudioStreamCopy))return changeStream(this,getCurrentTicks(this)||errorType.playerStartPositionTicks,{EnableDirectPlay:!1,EnableDirectStream:!1,AllowVideoStreamCopy:"Transcode"!==errorType.playMethod&&null,AllowAudioStreamCopy:!currentlyPreventsAudioStreamCopy&&!currentlyPreventsVideoStreamCopy&&null})}return onPlaybackStopped.call(this,e,{errorCode:"NoCompatibleStream",returnPromise:error.returnPromise})}function onPlaybackStopped(e,playerStopInfo){var playerData=getPlayerData(this);stopPlaybackProgressTimer(this);let state=(playerStopInfo=playerStopInfo||{}).playerState||self.getPlayerState(this),streamInfo=playerStopInfo.streamInfo||playerData.streamInfo,isCurrentPlayer=(playerData.streamInfo=null,this===self.getCurrentPlayer()),nextItemToReport=isCurrentPlayer&&(!1!==playerStopInfo.playNext||playerStopInfo.reportNext)?self._playQueueManager.getNextItemInfo():null,nextItem=isCurrentPlayer&&!1!==playerStopInfo.playNext?self._playQueueManager.getNextItemInfo():null,currentItem=streamInfo?.item;currentItem&&isServerItem(currentItem)&&!1===this.supportsProgress&&state.PlayState&&!state.PlayState.PositionTicks&&(state.PlayState.PositionTicks=currentItem.RunTimeTicks,nextItemToReport=null,nextItem=null),!1!==this.supportsProgress&&!this.isExternalPlayer||(nextItemToReport=null,nextItem=null);var playerData=nextItemToReport?nextItemToReport.item.MediaType:null,playbackStopInfo={player:this,state:state,nextMediaType:playerData};state.NextMediaType=playerData,!1!==playerStopInfo.resetPlayQueue&&!nextItem&&isCurrentPlayer&&self._playQueueManager.reset();let reportPlaybackPromise;currentItem&&isServerItem(currentItem)&&(reportPlaybackPromise=reportPlayback(self,state,this,!nextItemToReport,currentItem.ServerId,"reportPlaybackStopped")),events.trigger(this,"playbackstop",[state]),events.trigger(self,"playbackstop",[playbackStopInfo]);playerData=nextItemToReport&&nextItemToReport.item.playOptions||getDefaultPlayOptions();return(nextItemToReport?getPlayer(nextItemToReport.item,playerData):null)!==this&&(this.destroy(),removeCurrentPlayer(this)),(reportPlaybackPromise||Promise.resolve()).then(function(){if(isCurrentPlayer){if(playerStopInfo.errorCode)return playerStopInfo.returnPromise?Promise.reject(playerStopInfo):void showPlaybackErrorMessage(self,null,playerStopInfo.errorCode,!streamInfo||streamInfo.fullscreen,nextItem);var runtimeTicks,positionTicks;nextItem?!1!==self._playQueueManager.autoplay||"Episode"!==currentItem?.Type?self.nextTrack():!1!==self._playQueueManager.autoplay||"Episode"!==currentItem?.Type||userSettings.enableNextVideoInfoOverlay()||self.stop():streamInfo&&isServerItem(currentItem)&&"TvChannel"===currentItem.Type&&(runtimeTicks=(streamInfo.mediaSource||{}).RunTimeTicks,console.log("channel runtimeTicks: "+runtimeTicks),runtimeTicks)&&(positionTicks=state.PlayState?.PositionTicks,console.log("channel positionTicks: "+positionTicks),Math.ceil(positionTicks||0)/1e4+5e3>=Math.floor(runtimeTicks/1e4))&&(console.log("restarting live channel"),self.play({ids:[currentItem.Id],serverId:streamInfo.item.ServerId}))}})}function bindStopped(player){enableLocalPlaylistManagement(player)&&(events.off(player,"stopped",onPlaybackStopped),events.on(player,"stopped",onPlaybackStopped))}function onPlaybackTimeUpdate(e){sendProgressUpdate(this,"timeupdate")}function onAudioTrackChange(e){sendProgressUpdate(this,"audiotrackchange")}function onSubtitleTrackChange(e){sendProgressUpdate(this,"subtitletrackchange")}function onPlaybackPause(e){sendProgressUpdate(this,"pause")}function onPlaybackUnpause(e){sendProgressUpdate(this,"unpause")}function onPlaybackVolumeChange(e){sendProgressUpdate(this,"volumechange")}function onRepeatModeChange(e){sendProgressUpdate(this,"repeatmodechange")}function onShuffleChange(e){sendProgressUpdate(this,"shufflechange"),events.trigger(this,"playlistitemmove",[])}function onSubtitleOffsetChange(e){sendProgressUpdate(this,"subtitleoffsetchange")}function onPlaybackRateChange(e){sendProgressUpdate(this,"playbackratechange")}function onPlaylistItemMove(e){sendProgressUpdate(this,"playlistitemmove",!0)}function onPlaylistItemRemove(e,info){sendProgressUpdate(this,"playlistitemremove",!0,{PlaylistItemIds:info?info.PlaylistItemIds:null})}function onPlaylistItemAdd(e){sendProgressUpdate(this,"playlistitemadd",!0)}function onPlayerShutdown(e){removeCurrentPlayer(this)}function initMediaPlayer(player){players.push(player),players.sort(function(a,b){return(a.priority||0)-(b.priority||0)}),!1!==player.isLocalPlayer&&(player.isLocalPlayer=!0),player.currentState={},player.getVolume&&player.setVolume||(player=>{player.getVolume=function(){return player.volume()},player.setVolume=function(val){return player.volume(val)}})(player),enableLocalPlaylistManagement(player)?(events.on(player,"error",onPlaybackError),events.on(player,"timeupdate",onPlaybackTimeUpdate),events.on(player,"audiotrackchange",onAudioTrackChange),events.on(player,"subtitletrackchange",onSubtitleTrackChange),events.on(player,"pause",onPlaybackPause),events.on(player,"unpause",onPlaybackUnpause),events.on(player,"volumechange",onPlaybackVolumeChange),events.on(player,"repeatmodechange",onRepeatModeChange),events.on(player,"shufflechange",onShuffleChange),events.on(player,"subtitleoffsetchange",onSubtitleOffsetChange),events.on(player,"playbackratechange",onPlaybackRateChange),events.on(player,"playlistitemmove",onPlaylistItemMove),events.on(player,"playlistitemremove",onPlaylistItemRemove),events.on(player,"playlistitemadd",onPlaylistItemAdd)):player.isLocalPlayer&&(events.on(player,"itemstarted",onPlaybackStartedFromSelfManagingPlayer),events.on(player,"itemstopped",onPlaybackStoppedFromSelfManagingPlayer),events.on(player,"playqueuestarted",onPlayQueueStartedFromSelfManagingPlayer),events.on(player,"audiotrackchange",onAudioTrackChange),events.on(player,"subtitletrackchange",onSubtitleTrackChange),events.on(player,"subtitleoffsetchange",onSubtitleOffsetChange),events.on(player,"playbackratechange",onPlaybackRateChange),events.on(player,"playlistitemmove",onPlaylistItemMove),events.on(player,"playlistitemremove",onPlaylistItemRemove),events.on(player,"playlistitemadd",onPlaylistItemAdd),events.on(player,"shutdown",onPlayerShutdown)),player.isLocalPlayer&&bindToFullscreenChange(player),bindStopped(player)}function sendProgressUpdate(player,progressEventName,reportPlaylist,additionalData,isAutomated){if(!player)throw new Error("player cannot be null");var playerData=getPlayerData(player);let item;if("timeupdate"===progressEventName&&(item=self.currentItem(player))?.ServerId){var apiClient=connectionManager.getApiClient(item);if(apiClient){var ticks=getCurrentTicks(player);if(apiClient.shouldSkipProgressReport(progressEventName,ticks))return}}apiClient=self.getPlayerState(player,item);apiClient.NowPlayingItem&&(ticks=apiClient.NowPlayingItem.ServerId,(playerData=playerData.streamInfo)&&playerData.started||!enableLocalPlaylistManagement(player))&&reportPlayback(self,apiClient,player,reportPlaylist,ticks,"reportPlaybackProgress",progressEventName,additionalData,isAutomated)}this._playQueueManager=new PlayQueueManager,self.currentItem=function(player){return(player=player||self._currentPlayer)?player.currentItem?player.currentItem():(player=getPlayerData(player)).streamInfo?player.streamInfo.item:null:null},self.currentMediaSource=function(player){if(player)return player.currentMediaSource?player.currentMediaSource():(player=getPlayerData(player)).streamInfo?player.streamInfo.mediaSource:null;throw new Error("player cannot be null")},self.playMethod=function(player){if(player)return player.playMethod?player.playMethod():(player=getPlayerData(player)).streamInfo?player.streamInfo.playMethod:null;throw new Error("player cannot be null")},self.playSessionId=function(player){if(player)return player.playSessionId?player.playSessionId():(player=getPlayerData(player)).streamInfo?player.streamInfo.playSessionId:null;throw new Error("player cannot be null")},self.getPlayerInfo=function(player){var target;return(player=player||self._currentPlayer)?(target=currentTargetInfo||{},{name:player.name,isLocalPlayer:player.isLocalPlayer,id:target.id,playerName:target.playerName,deviceName:target.deviceName,playableMediaTypes:target.playableMediaTypes,supportedCommands:target.supportedCommands}):null},self.setActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)return self._currentPlayer&&self._currentPlayer.isLocalPlayer?void 0:void setCurrentPlayerInternal(null,null);if(!(player="string"==typeof player?players.filter(function(p){return p.name===player})[0]:player))throw new Error("null player");setCurrentPlayerInternal(player,targetInfo)},self.isPairing=function(){return self._isPairing},self.trySetActivePlayer=function(player,targetInfo){if("localplayer"===player||"localplayer"===player.name)self._currentPlayer&&self._currentPlayer.isLocalPlayer,self._isPairing=!1;else{if(!(player="string"==typeof player?players.filter(function(p){return p.name===player})[0]:player))throw new Error("null player");var promise;currentPairingId===targetInfo.id?self._isPairing=!1:(currentPairingId=targetInfo.id,promise=player.tryPair?player.tryPair(targetInfo):Promise.resolve(),self._isPairing=!0,events.trigger(self,"pairing"),promise.then(function(){self._isPairing=!1,events.trigger(self,"paired"),setCurrentPlayerInternal(player,targetInfo)},function(){self._isPairing=!1,events.trigger(self,"pairerror"),currentPairingId===targetInfo.id&&(currentPairingId=null)}))}},self.getTargets=function(){var promises=players.filter(displayPlayerIndividually).map(getPlayerTargets);return Promise.all(promises).then(function(responses){let targets=[];for(let i=0;i<responses.length;i++){var subTargets=responses[i];for(let j=0;j<subTargets.length;j++)targets.push(subTargets[j])}return targets=targets.sort(sortPlayerTargets)})},self.getPlaylist=function(options,player){return(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.getPlaylist(options):Promise.resolve(self._playQueueManager.getPlaylistResult(options))},self.isPlaying=function(player){return(player=player||self._currentPlayer)&&player.isPlaying?player.isPlaying():player&&enableLocalPlaylistManagement(player)?null!=getPlayerData(player).streamInfo:null!=player&&null!=player.currentSrc()},self.isPlayingMediaType=function(mediaTypes,player){var streamInfo;return player=player||self._currentPlayer,Array.isArray(mediaTypes)||(mediaTypes=[mediaTypes]),player&&player.isPlaying?0<mediaTypes.filter(function(mediaType){return player.isPlaying(mediaType)}).length:!!self.isPlaying(player)&&(streamInfo=(streamInfo=getPlayerData(player).streamInfo)?streamInfo.mediaType:null)&&mediaTypes.includes(streamInfo)},self.isPlayingLocally=function(mediaTypes,player){return!(!(player=player||self._currentPlayer)||!player.isLocalPlayer)&&self.isPlayingMediaType(mediaTypes,player)},self.isPlayingVideo=function(player){return self.isPlayingMediaType(["Video"],player)},self.isPlayingAudio=function(player){return self.isPlayingMediaType(["Audio"],player)},self.getPlayers=function(){return players},self.canPlay=function(item){switch(item.Type){case"PhotoAlbum":case"MusicGenre":case"Genre":case"Season":case"Series":case"BoxSet":case"MusicAlbum":case"MusicArtist":case"Playlist":case"CollectionFolder":case"Movie":case"MusicVideo":case"Trailer":case"Video":case"TvChannel":case"Audio":return!0;case"Episode":return"Virtual"!==item.LocationType;case"Tag":case"Folder":case"Studio":case"GameSystem":case"Person":return!1;case"Program":return item.EndDate&&item.StartDate?!(Date.now()>Date.parse(item.EndDate)||Date.now()<Date.parse(item.StartDate)):!1;default:if("playlists"===item.CollectionType)return!0;if("Virtual"===item.LocationType)return!1}return null!=getPlayer(item,getDefaultPlayOptions())},self.changeAudioStream=function(player){if((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.changeAudioStream();if(!player)return Promise.resolve();var currentMediaSource=self.currentMediaSource(player),mediaStreams=[];let i,length;for(i=0,length=currentMediaSource.MediaStreams.length;i<length;i++)"Audio"===currentMediaSource.MediaStreams[i].Type&&mediaStreams.push(currentMediaSource.MediaStreams[i]);if(mediaStreams.length<=1)return Promise.resolve();var currentStreamIndex=self.getAudioStreamIndex(player);let indexInList=-1;for(i=0,length=mediaStreams.length;i<length;i++)if(mediaStreams[i].Index===currentStreamIndex){indexInList=i;break}let nextIndex=indexInList+1;return nextIndex=-1===(nextIndex=nextIndex>=mediaStreams.length?0:nextIndex)?-1:mediaStreams[nextIndex].Index,self.setAudioStreamIndex(nextIndex,player)},self.changeSubtitleStream=function(player){if(!(player=player||self._currentPlayer))return Promise.resolve();var currentMediaSource=self.currentMediaSource(player),mediaStreams=[];let i,length;for(i=0,length=currentMediaSource.MediaStreams.length;i<length;i++)"Subtitle"===currentMediaSource.MediaStreams[i].Type&&mediaStreams.push(currentMediaSource.MediaStreams[i]);if(!mediaStreams.length)return Promise.resolve();var currentStreamIndex=self.getSubtitleStreamIndex(player);let indexInList=-1;for(i=0,length=mediaStreams.length;i<length;i++)if(mediaStreams[i].Index===currentStreamIndex){indexInList=i;break}let nextIndex=indexInList+1;return nextIndex=-1===(nextIndex=nextIndex>=mediaStreams.length?-1:nextIndex)?-1:mediaStreams[nextIndex].Index,self.setSubtitleStreamIndex(nextIndex,player)},self.getAudioStreamIndex=function(player){return(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.getAudioStreamIndex():getPlayerData(player).audioStreamIndex},self.isAudioStreamSupported=function(stream,mediaSource,deviceProfile){let audioCodec=(stream.Codec||"").toLowerCase(),container=(mediaSource.Container||"").toLowerCase();return!deviceProfile||0<(deviceProfile.DirectPlayProfiles||[]).filter(function(p){return"Video"===p.Type&&!(p.Container&&!formatIncludesValue(p.Container,container)||p.AudioCodec&&!formatIncludesValue(p.AudioCodec,audioCodec))}).length},self.setAudioStreamIndex=function(index,player){return(player=player||self._currentPlayer)&&!player.isLocalPlayer?player.setAudioStreamIndex(index):"Transcode"!==self.playMethod(player)&&player.canSetAudioStreamIndex()?player.getDeviceProfile(self.currentItem(player)).then(function(profile){if(!((mediaSource,index,deviceProfile)=>{let mediaStream,i,length;var mediaStreams=mediaSource.MediaStreams;for(i=0,length=mediaStreams.length;i<length;i++)if("Audio"===mediaStreams[i].Type&&mediaStreams[i].Index===index){mediaStream=mediaStreams[i];break}return mediaStream&&self.isAudioStreamSupported(mediaStream,mediaSource,deviceProfile)})(self.currentMediaSource(player),index,profile))return changeStream(player,getCurrentTicks(player),{AudioStreamIndex:index},"audiotrackchange");player.setAudioStreamIndex(index),getPlayerData(player).audioStreamIndex=index,events.trigger(player,"audiotrackchange")}):changeStream(player,getCurrentTicks(player),{AudioStreamIndex:index},"audiotrackchange")},self.getMaxStreamingBitrate=function(player){var playerData;return(player=player||self._currentPlayer)&&player.getMaxStreamingBitrate?player.getMaxStreamingBitrate():(playerData=getPlayerData(player)).maxStreamingBitrate||(playerData=playerData.streamInfo?playerData.streamInfo.mediaType:null,getSavedMaxStreamingBitrate((player=self.currentItem(player))?connectionManager.getApiClient(player.ServerId):connectionManager.currentApiClient(),playerData))},self.enableAutomaticBitrateDetection=function(player){var playerData;return(player=player||self._currentPlayer)&&player.enableAutomaticBitrateDetection?player.enableAutomaticBitrateDetection():(playerData=(playerData=getPlayerData(player)).streamInfo?playerData.streamInfo.mediaType:null,player=((player=self.currentItem(player))?connectionManager.getApiClient(player.ServerId):connectionManager.currentApiClient()).getSavedEndpointInfo()||{},appSettings.enableAutomaticBitrateDetection(player.IsInNetwork,playerData))},self.setMaxStreamingBitrate=function(options,player){if((player=player||self._currentPlayer)&&player.setMaxStreamingBitrate)return player.setMaxStreamingBitrate(options);let apiClient=connectionManager.getApiClient(self.currentItem(player).ServerId);return apiClient.getEndpointInfo().then(function(endpointInfo){var playerData=getPlayerData(player);let mediaType=playerData.streamInfo?playerData.streamInfo.mediaType:null,promise;return(promise=options.enableAutomaticBitrateDetection?(appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork,mediaType,!0),apiClient.detectBitrate()):(appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork,mediaType,!1),Promise.resolve(options.maxBitrate))).then(function(bitrate){return appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork,mediaType,bitrate),changeStream(player,getCurrentTicks(player),{MaxStreamingBitrate:bitrate},"qualitychange")})})},self.isFullscreen=function(player){return!(player=player||self._currentPlayer).isLocalPlayer||player.isFullscreen?player.isFullscreen():fullscreenManager.isFullScreen()},self.toggleFullscreen=function(player){!(player=player||self._currentPlayer)||player.isLocalPlayer&&!player.toggleFullscreen?fullscreenManager.isFullScreen()?fullscreenManager.exitFullscreen():fullscreenManager.requestFullscreen():player.toggleFullscreen()},self.togglePictureInPicture=function(player){return(player=player||self._currentPlayer).togglePictureInPicture()},self.getSubtitleStreamIndex=function(player){if((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.getSubtitleStreamIndex();if(player)return getPlayerData(player).subtitleStreamIndex;throw new Error("player cannot be null")},self.getSubtitleStream=function(player){player=player||self._currentPlayer;var index=self.getSubtitleStreamIndex(player);return null==index||-1===index?null:getSubtitleStream(player,index)},self.setSubtitleStreamIndex=function(index,player,refreshMediaSource){if((player=player||self._currentPlayer)&&!player.isLocalPlayer)return player.setSubtitleStreamIndex(index,refreshMediaSource);var currentStream=self.getSubtitleStream(player),newStream=getSubtitleStream(player,index);if(currentStream||newStream||refreshMediaSource){let selectedTrackElementIndex=-1;var currentPlayMethod=self.playMethod(player);if(refreshMediaSource)return changeStream(player,getCurrentTicks(player),{SubtitleStreamIndex:index},"subtitletrackchange");if(currentStream&&!newStream){if("Encode"===getDeliveryMethod(currentStream)||"Embed"===getDeliveryMethod(currentStream)&&"Transcode"===currentPlayMethod)return changeStream(player,getCurrentTicks(player),{SubtitleStreamIndex:-1},"subtitletrackchange")}else if(!currentStream&&newStream){if("External"!==getDeliveryMethod(newStream)&&"Hls"!==getDeliveryMethod(newStream)&&"VideoSideData"!==getDeliveryMethod(newStream)&&("Embed"!==getDeliveryMethod(newStream)||"Transcode"===currentPlayMethod))return changeStream(player,getCurrentTicks(player),{SubtitleStreamIndex:index},"subtitletrackchange");selectedTrackElementIndex=index}else if(currentStream&&newStream){if("External"!==getDeliveryMethod(newStream)&&"Hls"!==getDeliveryMethod(newStream)&&"VideoSideData"!==getDeliveryMethod(newStream)&&("Embed"!==getDeliveryMethod(newStream)||"Transcode"===currentPlayMethod))return changeStream(player,getCurrentTicks(player),{SubtitleStreamIndex:index},"subtitletrackchange");if(selectedTrackElementIndex=index,"External"!==getDeliveryMethod(currentStream)&&"Hls"!==getDeliveryMethod(currentStream)&&"Embed"!==getDeliveryMethod(currentStream)&&"VideoSideData"!==getDeliveryMethod(currentStream))return changeStream(player,getCurrentTicks(player),{SubtitleStreamIndex:-1},"subtitletrackchange")}refreshMediaSource=player.setSubtitleStreamIndex(selectedTrackElementIndex);return getPlayerData(player).subtitleStreamIndex=index,events.trigger(player,"subtitletrackchange"),refreshMediaSource}},self.seek=function(ticks,player){return ticks=Math.max(0,ticks),(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.isLocalPlayer?player.seek((ticks||0)/1e4):player.seek(ticks):changeStream(player,ticks)},self.seekRelative=function(offsetTicks,player){return(player=player||self._currentPlayer)&&player.seekRelative&&(!enableLocalPlaylistManagement(player)||player.isLocalPlayer&&canPlayerSeek(player))?player.isLocalPlayer?player.seekRelative((offsetTicks||0)/1e4):player.seekRelative(offsetTicks):(offsetTicks=getCurrentTicks(player)+offsetTicks,this.seek(offsetTicks,player))},self.play=function(options){if(normalizePlayOptions(options),self._currentPlayer){if(!1===options.enableRemotePlayers&&!self._currentPlayer.isLocalPlayer)return Promise.reject();var firstItem;if(!self._currentPlayer.isLocalPlayer)return options.items?.length&&"Chapter"===options.items[0].Type&&(firstItem=options.items[0],options.mediaSourceId=firstItem.MediaSourceId,options.serverId=firstItem.ServerId,options.ids=[firstItem.ItemId],options.items=null),firstItem=this.newAbortSignal(),self._currentPlayer.play(options,firstItem)}if(options.items){let signal=this.newAbortSignal();return playFromFetchedItems(options,options.items,!0,signal)}{if(!options.serverId)throw new Error("serverId required!");let signal=this.newAbortSignal();return options.fullscreen&&loading.show(),getItemsForPlayback(options.serverId,{Ids:options.ids.join(",")},signal).then(function(result){return playFromFetchedItems(options,result.Items,!1,signal)})}},self.getPlayerState=function(player,item,mediaSource){if(!(player=player||self._currentPlayer))throw new Error("player cannot be null");if(!enableLocalPlaylistManagement(player)&&player.getPlayerState)return player.getPlayerState();item=item||self.currentItem(player),mediaSource=mediaSource||self.currentMediaSource(player);var state={PlayState:{}},currentPlayOptions=item?item.playOptions:null;return state.IsBackgroundPlayback=currentPlayOptions?!1===currentPlayOptions.fullscreen:self._isBackgroundPlaybackHack,player.isLocalPlayer&&(currentPlayOptions=getPlayerData(player).streamInfo)&&(state.IsInitialRequest=currentPlayOptions.isInitialRequest),player&&(state.PlayState.VolumeLevel=player.getVolume(),state.PlayState.IsMuted=player.isMuted(),state.PlayState.IsPaused=player.paused(),state.PlayState.RepeatMode=self.getRepeatMode(player),state.PlayState.Shuffle=self.getShuffle(player),state.PlayState.SubtitleOffset=self.getSubtitleOffset(player),state.PlayState.PlaybackRate=self.getPlaybackRate(player),state.PlayState.MaxStreamingBitrate=self.getMaxStreamingBitrate(player),state.PlayState.PositionTicks=getCurrentTicks(player),state.PlayState.PlaybackStartTimeTicks=self.playbackStartTime(player),state.PlayState.SubtitleStreamIndex=self.getSubtitleStreamIndex(player),state.PlayState.AudioStreamIndex=self.getAudioStreamIndex(player),state.PlayState.BufferedRanges=self.getBufferedRanges(player),state.PlayState.SeekableRanges=self.getSeekableRanges(player),state.PlayState.PlayMethod=self.playMethod(player),mediaSource&&(state.PlayState.LiveStreamId=mediaSource.LiveStreamId),state.PlayState.PlaySessionId=self.playSessionId(player),state.PlaylistItemId=self.getCurrentPlaylistItemId(player),state.PlaylistIndex=self.getCurrentPlaylistIndex(player),state.PlaylistLength=self.getCurrentPlaylistLength(player)),mediaSource&&(state.PlayState.MediaSourceId=mediaSource.Id,state.NowPlayingItem={RunTimeTicks:mediaSource.RunTimeTicks,Container:mediaSource.Container,Bitrate:mediaSource.Bitrate},state.PlayState.CanSeek=0<(mediaSource.RunTimeTicks||0)||canPlayerSeek(player)),item&&(state.NowPlayingItem=getNowPlayingItemForReporting(player,item,mediaSource)),state.MediaSource=mediaSource,state},self.duration=function(player){if((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)&&!player.isLocalPlayer)return player.duration();if(!player)throw new Error("player cannot be null");var mediaSource=self.currentMediaSource(player);if(mediaSource&&mediaSource.RunTimeTicks)return mediaSource.RunTimeTicks;let playerDuration=player.duration();return playerDuration&&(playerDuration*=1e4),playerDuration},self.getCurrentTicks=getCurrentTicks,self.getPlaybackMediaSources=function(item,options){let startPosition=(options=options||{}).startPositionTicks||0,mediaType=options.mediaType||item.MediaType,player=getPlayer(item,options,!0),apiClient=connectionManager.getApiClient(item);options=ApiClient.isLocalItem(item)?Promise.resolve():apiClient.getEndpointInfo();return Promise.all([options,player.getDeviceProfile(item)]).then(function(responses){var responses=responses[1],maxBitrate=getSavedMaxStreamingBitrate(connectionManager.getApiClient(item),mediaType);return getPlaybackInfo(player,apiClient,item,responses,maxBitrate,startPosition,!1,null,null,null,null,null).then(function(playbackInfoResult){return playbackInfoResult.MediaSources})})},self.setCurrentPlaylistItemAndIndex=function(newItem,newItemIndex,player){if(newItem){var newItemPlayOptions=newItem.playOptions||{};newItemPlayOptions.startPositionTicks=0,newItemPlayOptions.command="setCurrentPlaylistItem";let signal=this.newAbortSignal();return playInternal(newItem,newItemPlayOptions,function(){setPlaylistState(newItem.PlaylistItemId,newItemIndex)},signal).catch(function(err){onUnhandledPlaybackFailure(err,signal)})}return Promise.reject()},self.setCurrentPlaylistItem=function(playlistItemId,player){if((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.setCurrentPlaylistItem(playlistItemId);let newItem,newItemIndex;var playlist=self._playQueueManager.getPlaylist();for(let i=0,length=playlist.length;i<length;i++)if(playlist[i].PlaylistItemId===playlistItemId){newItem=playlist[i],newItemIndex=i;break}return newItem?self.setCurrentPlaylistItemAndIndex(newItem,newItemIndex,player):Promise.reject()},self.removeFromPlaylist=function(playlistItemIds,player){var removeResult;if(playlistItemIds)return(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.removeFromPlaylist(playlistItemIds):"empty"===(removeResult=self._playQueueManager.removeFromPlaylist(playlistItemIds)).result?self.stop(player):(removeResult=removeResult.isCurrentIndex,events.trigger(player,"playlistitemremove",[{PlaylistItemIds:playlistItemIds}]),removeResult?self.setCurrentPlaylistItem(self._playQueueManager.getPlaylist()[0].PlaylistItemId,player):Promise.resolve());throw new Error("Invalid playlistItemIds")},self.movePlaylistItem=function(playlistItemId,newIndex,player){return(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.movePlaylistItem(playlistItemId,newIndex):("noop"!==(playlistItemId=self._playQueueManager.movePlaylistItem(playlistItemId,newIndex)).result&&events.trigger(player,"playlistitemmove",[{playlistItemId:playlistItemId.playlistItemId,newIndex:playlistItemId.newIndex}]),Promise.resolve())},self.getCurrentPlaylistIndex=function(player){return((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player:self._playQueueManager).getCurrentPlaylistIndex()},self.getCurrentPlaylistLength=function(player){return((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player:self._playQueueManager).getCurrentPlaylistLength()},self.getCurrentPlaylistItemId=function(player){return((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player:self._playQueueManager).getCurrentPlaylistItemId()},self.channelUp=function(player){return player=player||self._currentPlayer,self.nextTrack(player)},self.channelDown=function(player){return player=player||self._currentPlayer,self.previousTrack(player)},self.nextTrack=function(player){var newItemInfo;return(player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.nextTrack():(newItemInfo=self._playQueueManager.getNextItemInfo())?(console.log("playing next track"),self.setCurrentPlaylistItemAndIndex(newItemInfo.item,newItemInfo.index,player)):Promise.resolve()},self.previousTrack=function(player){if((player=player||self._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.previousTrack();var newIndex=self.getCurrentPlaylistIndex(player)-1;if(0<=newIndex){var newItem=self._playQueueManager.getPlaylist()[newIndex];if(newItem)return self.setCurrentPlaylistItemAndIndex(newItem,newIndex,player)}return Promise.resolve()},self.queue=function(options,player){return queue(options,"",player)},self.queueNext=function(options,player){return queue(options,"next",player)},events.on(pluginManager,"registered",function(e,plugin){"mediaplayer"===plugin.type&&initMediaPlayer(plugin)}),pluginManager.ofType("mediaplayer").map(initMediaPlayer),self.onAppClose=function(){var player=this._currentPlayer;player&&player.isLocalPlayer&&enableLocalPlaylistManagement(player)&&this.isPlaying(player)&&(this._playQueueManager.reset(),onPlaybackStopped.call(player))},self.playbackStartTime=function(player){return(player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.playbackStartTime?player.playbackStartTime():null:(player=getPlayerData(player).streamInfo)?player.playbackStartTimeTicks:null},self.onControllingAppConnected=function(){var player=this._currentPlayer;player&&self.isPlaying(player)&&sendProgressUpdate(player,"controllerconnected",!0)}}function getFrameTicks(streamInfo){streamInfo=streamInfo?.mediaSource?.MediaStreams;if(streamInfo){streamInfo=streamInfo.find(e=>"Video"===e.Type),streamInfo=streamInfo?.RealFrameRate||streamInfo?.AverageFrameRate;if(streamInfo)return 1/streamInfo*1e3*1e4}return null}PlaybackManager.prototype.toggleAspectRatio=function(player){if(player=player||this._currentPlayer){var current=this.getAspectRatio(player),supported=this.getSupportedAspectRatios(player);let index=-1;for(let i=0,length=supported.length;i<length;i++)if(supported[i].id===current){index=i;break}++index>=supported.length&&(index=0),this.setAspectRatio(supported[index].id,player)}},PlaybackManager.prototype.setAspectRatio=function(val,player){(player=player||this._currentPlayer)&&player.setAspectRatio&&player.setAspectRatio(val)},PlaybackManager.prototype.getSupportedAspectRatios=function(player){return(player=player||this._currentPlayer)&&player.getSupportedAspectRatios?player.getSupportedAspectRatios():[]},PlaybackManager.prototype.getAspectRatio=function(player){if((player=player||this._currentPlayer)&&player.getAspectRatio)return player.getAspectRatio()},PlaybackManager.prototype.setBrightness=function(val,player){(player=player||this._currentPlayer)&&player.setBrightness(val)},PlaybackManager.prototype.getBrightness=function(player){if(player=player||this._currentPlayer)return player.getBrightness()},PlaybackManager.prototype.setVolume=function(val,player){(player=player||this._currentPlayer)&&player.setVolume(val)},PlaybackManager.prototype.getVolume=function(player){if(player=player||this._currentPlayer)return player.getVolume()},PlaybackManager.prototype.volumeUp=function(player){(player=player||this._currentPlayer)&&player.volumeUp()},PlaybackManager.prototype.volumeDown=function(player){(player=player||this._currentPlayer)&&player.volumeDown()},PlaybackManager.prototype.sendAbortSignal=function(){var controller=this._abortController;controller&&(this._abortController=null,controller.abort())},PlaybackManager.prototype.newAbortSignal=function(){this.sendAbortSignal();var controller=new AbortController;return(this._abortController=controller).signal},PlaybackManager.prototype.getCurrentPlayer=function(){return this._currentPlayer},PlaybackManager.prototype.currentTime=function(player){return!(player=player||this._currentPlayer)||enableLocalPlaylistManagement(player)||player.isLocalPlayer?this.getCurrentTicks(player):player.currentTime()},PlaybackManager.prototype.nextItem=function(player){var apiClient;return(player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player)?player.nextItem():(player=this._playQueueManager.getNextItemInfo())&&player.item?(apiClient=connectionManager.getApiClient(player.item.ServerId)).getItem(apiClient.getCurrentUserId(),player.item.Id,{ExcludeFields:"VideoChapters,VideoMediaSources,MediaStreams,People,Overview"}):Promise.reject()},PlaybackManager.prototype.canQueue=function(item){if(this._currentPlayer)switch(item.Type){case"Program":case"TvChannel":return!1;case"MusicAlbum":case"MusicArtist":return this.canPlay(item)&&this.canQueueMediaType("Audio");default:return this.canPlay(item)&&canPlayerPlayMediaType(this._currentPlayer,item.MediaType)}return!1},PlaybackManager.prototype.canQueueMediaType=function(mediaType){return!!this._currentPlayer&&canPlayerPlayMediaType(this._currentPlayer,mediaType)},PlaybackManager.prototype.isMuted=function(player){return!!(player=player||this._currentPlayer)&&player.isMuted()},PlaybackManager.prototype.setMute=function(mute,player){(player=player||this._currentPlayer)&&player.setMute(mute)},PlaybackManager.prototype.toggleMute=function(mute,player){(player=player||this._currentPlayer)&&(player.toggleMute?player.toggleMute():player.setMute(!player.isMuted()))},PlaybackManager.prototype.nextChapter=function(player){player=player||this._currentPlayer;let ticks=this.getCurrentTicks(player);var nextChapter=(this.currentMediaSource(player).Chapters||this.currentItem(player).Chapters||[]).filter(function(i){return i.StartPositionTicks>ticks})[0];nextChapter?this.seek(nextChapter.StartPositionTicks,player):this.nextTrack(player)},PlaybackManager.prototype.previousChapter=function(player){player=player||this._currentPlayer;let ticks=this.getCurrentTicks(player);ticks-=1e8,0===this.getCurrentPlaylistIndex(player)&&(ticks=Math.max(ticks,0));var previousChapters=(this.currentMediaSource(player).Chapters||this.currentItem(player).Chapters||[]).filter(function(i){return i.StartPositionTicks<=ticks});previousChapters.length?this.seek(previousChapters[previousChapters.length-1].StartPositionTicks,player):this.previousTrack(player)},PlaybackManager.prototype.fastForward=function(player){player=player||this._currentPlayer;var offsetTicks=1e4*userSettings.skipForwardLength();this.seekRelative(offsetTicks,player)},PlaybackManager.prototype.rewind=function(player){player=player||this._currentPlayer;var offsetTicks=0-1e4*userSettings.skipBackLength();this.seekRelative(offsetTicks,player)},PlaybackManager.prototype.frameStepForward=function(player){var offsetTicks=getFrameTicks((player=player||this._currentPlayer).streamInfo);offsetTicks&&this.seekRelative(offsetTicks+=1e4,player)},PlaybackManager.prototype.frameStepBack=function(player){var offsetTicks=getFrameTicks((player=player||this._currentPlayer).streamInfo);offsetTicks&&this.seekRelative(-1*(offsetTicks+=1e4),player)},PlaybackManager.prototype.seekPercent=function(percent,player){player=player||this._currentPlayer,console.log("seeking to "+percent+"%");var ticks=this.duration(player)||0;ticks*=percent/=100,ticks=parseInt(ticks),console.log("seeking to "+ticks+" ticks"),this.seek(ticks,player)},PlaybackManager.prototype.playTrailers=function(item){var player=this._currentPlayer;if(player&&player.playTrailers)return player.playTrailers(item);player=connectionManager.getApiClient(item);let instance=this;return player.getAllTrailers({LocalTrailers:0<(item.LocalTrailerCount||0),RemoteTrailers:0===(item.LocalTrailerCount||0)},item).then(function(result){return instance.play({items:result.Items})})},PlaybackManager.prototype.getSubtitleUrl=function(textStream,serverId){serverId=connectionManager.getApiClient(serverId);return textStream.IsExternalUrl?textStream.DeliveryUrl:serverId.getUrl(textStream.DeliveryUrl)},PlaybackManager.prototype.stop=function(player){return player=player||this._currentPlayer,this.sendAbortSignal(),player?(enableLocalPlaylistManagement(player)&&this._playQueueManager.reset(),player.stop(!0)):Promise.resolve()},PlaybackManager.prototype.getBufferedRanges=function(player){return(player=player||this._currentPlayer)&&player.getBufferedRanges?player.getBufferedRanges():[]},PlaybackManager.prototype.getSeekableRanges=function(player){return(player=player||this._currentPlayer)&&player.getSeekableRanges?player.getSeekableRanges():[]},PlaybackManager.prototype.playPause=function(player){if(player=player||this._currentPlayer)return player.playPause?player.playPause():player.paused()?this.unpause(player):this.pause(player)},PlaybackManager.prototype.paused=function(player){if(player=player||this._currentPlayer)return player.paused()},PlaybackManager.prototype.pause=function(player){(player=player||this._currentPlayer)&&player.pause()},PlaybackManager.prototype.unpause=function(player){(player=player||this._currentPlayer)&&player.unpause()},PlaybackManager.prototype.instantMix=function(item,player){if((player=player||this._currentPlayer)&&player.instantMix)return player.instantMix(item);var player=connectionManager.getApiClient(item),options={};options.UserId=player.getCurrentUserId(),options.Limit=QueueQueryLimit;let instance=this;return player.getInstantMixFromItem(item.Id,options).then(function(result){return instance.play({items:result.Items})})},PlaybackManager.prototype.shuffle=function(shuffleItem,player,queryOptions){return(player=player||this._currentPlayer)&&player.shuffle?player.shuffle(shuffleItem):((queryOptions=queryOptions||{}).items=[shuffleItem],queryOptions.shuffle=!0,this.play(queryOptions))},PlaybackManager.prototype.audioTracks=function(player){if((player=player||this._currentPlayer).audioTracks){var result=player.audioTracks();if(result)return result}return(this.currentMediaSource(player)?.MediaStreams||[]).filter(function(s){return"Audio"===s.Type})},PlaybackManager.prototype.subtitleTracks=function(player){if((player=player||this._currentPlayer).subtitleTracks){var result=player.subtitleTracks();if(result)return result}return(this.currentMediaSource(player)?.MediaStreams||[]).filter(function(s){return"Subtitle"===s.Type})},PlaybackManager.prototype.getSupportedCommands=function(player){var list;return!(player=player||this._currentPlayer)||player.isLocalPlayer?(list=["GoHome","GoToSettings","VolumeUp","VolumeDown","Mute","Unmute","ToggleMute","SetVolume","SetAudioStreamIndex","SetSubtitleStreamIndex","RefreshMediaSource","SetMaxStreamingBitrate","DisplayContent","GoToSearch","DisplayMessage","SetRepeatMode","SetShuffle","PlayMediaSource","PlayTrailers"],appHost.supports("fullscreenchange")&&list.push("ToggleFullscreen"),player&&player.supports&&(player.supports("PictureInPicture")&&list.push("PictureInPicture"),player.supports("SetBrightness")&&list.push("SetBrightness"),player.supports("SetAspectRatio")&&list.push("SetAspectRatio"),player.supports("SetSubtitleOffset")&&list.push("SetSubtitleOffset"),player.supports("SetPlaybackRate"))&&list.push("SetPlaybackRate"),list):(list=this.getPlayerInfo(player))?list.supportedCommands:[]},PlaybackManager.prototype.toggleRepeatMode=function(player){switch(player=player||this._currentPlayer,this.getRepeatMode(player)){case"RepeatNone":this.setRepeatMode("RepeatAll",player);break;case"RepeatAll":this.setRepeatMode("RepeatOne",player);break;case"RepeatOne":this.setRepeatMode("RepeatNone",player)}},PlaybackManager.prototype.setRepeatMode=function(value,player){if((player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.setRepeatMode(value);this._playQueueManager.setRepeatMode(value),events.trigger(player,"repeatmodechange")},PlaybackManager.prototype.getRepeatMode=function(player){return((player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player)?player:this._playQueueManager).getRepeatMode()},PlaybackManager.prototype.toggleShuffle=function(player){player=player||this._currentPlayer,this.setShuffle(!this.getShuffle(player),player)},PlaybackManager.prototype.setShuffle=function(value,player){if((player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player))return player.setShuffle(value);this._playQueueManager.setShuffle(value),events.trigger(player,"shufflechange")},PlaybackManager.prototype.getShuffle=function(player){return((player=player||this._currentPlayer)&&!enableLocalPlaylistManagement(player)?player:this._playQueueManager).getShuffle()},PlaybackManager.prototype.setSubtitleOffset=function(value,player){(player=player||this._currentPlayer).setSubtitleOffset&&(player.setSubtitleOffset(value),events.trigger(player,"subtitleoffsetchange"))},PlaybackManager.prototype.incrementSubtitleOffset=function(value,player){(player=player||this._currentPlayer).incrementSubtitleOffset&&(player.incrementSubtitleOffset(value),events.trigger(player,"subtitleoffsetchange"))},PlaybackManager.prototype.getSubtitleOffset=function(player){return(player=player||this._currentPlayer).getSubtitleOffset?player.getSubtitleOffset():0},PlaybackManager.prototype.getPlaybackRate=function(player){return(player=player||this._currentPlayer).getPlaybackRate?player.getPlaybackRate():1},PlaybackManager.prototype.setPlaybackRate=function(value,player){(player=player||this._currentPlayer).setPlaybackRate&&player.setPlaybackRate(value)},PlaybackManager.prototype.trySetActiveDeviceName=function(name){name=normalizeName(name);let instance=this;instance.getTargets().then(function(result){result=result.filter(function(p){return normalizeName(p.name)===name})[0];result&&instance.trySetActivePlayer(result.playerName,result)})},PlaybackManager.prototype.displayContent=function(options,player){(player=player||this._currentPlayer)&&player.displayContent&&player.displayContent(options)},PlaybackManager.prototype.beginPlayerUpdates=function(player){player.beginPlayerUpdates&&player.beginPlayerUpdates()},PlaybackManager.prototype.endPlayerUpdates=function(player){player.endPlayerUpdates&&player.endPlayerUpdates()},PlaybackManager.prototype.setDefaultPlayerActive=function(){this.setActivePlayer("localplayer")},PlaybackManager.prototype.removeActivePlayer=function(name){var playerInfo=this.getPlayerInfo();playerInfo&&playerInfo.playerName===name&&this.setDefaultPlayerActive()},PlaybackManager.prototype.removeActiveTarget=function(id){var playerInfo=this.getPlayerInfo();playerInfo&&playerInfo.id===id&&this.setDefaultPlayerActive()},PlaybackManager.prototype.sendCommand=function(cmd,player){switch(console.log("MediaController received command: "+cmd.Name),cmd.Name){case"SetPlaybackRate":this.setPlaybackRate(parseFloat(cmd.Arguments.PlaybackRate),player);break;case"SetSubtitleOffset":this.setSubtitleOffset(parseFloat(cmd.Arguments.SubtitleOffset),player);break;case"IncrementSubtitleOffset":this.incrementSubtitleOffset(parseFloat(cmd.Arguments.Increment),player);break;case"SetRepeatMode":this.setRepeatMode(cmd.Arguments.RepeatMode,player);break;case"SetShuffle":var shuffle=cmd.Arguments.Shuffle;this.setShuffle(!0===shuffle||"true"===(shuffle||"").toString().toLowerCase(),player);break;case"VolumeUp":this.volumeUp(player);break;case"VolumeDown":this.volumeDown(player);break;case"Mute":this.setMute(!0,player);break;case"Unmute":this.setMute(!1,player);break;case"ToggleMute":this.toggleMute(player);break;case"SetVolume":this.setVolume(cmd.Arguments.Volume,player);break;case"SetAspectRatio":this.setAspectRatio(cmd.Arguments.AspectRatio,player);break;case"SetBrightness":this.setBrightness(cmd.Arguments.Brightness,player);break;case"SetAudioStreamIndex":this.setAudioStreamIndex(parseInt(cmd.Arguments.Index),player);break;case"SetSubtitleStreamIndex":this.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index),player,cmd.Arguments.RefreshMediaSource);break;case"SetMaxStreamingBitrate":break;case"ToggleFullscreen":this.toggleFullscreen(player);break;default:player.sendCommand&&player.sendCommand(cmd)}};export default new PlaybackManager;