1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
define(["exports","./../emby-apiclient/connectionmanager.js","./../common/playback/playbackmanager.js","./../common/globalize.js","./../emby-apiclient/events.js","./../emby-elements/emby-button/paper-icon-button-light.js","./../common/dataformatter.js"],function(_exports,_connectionmanager,_playbackmanager,_globalize,_events,_paperIconButtonLight,_dataformatter){function init(instance,container){var parent=document.createElement("div"),button=(parent.classList.add("playerStats","hide"),parent.innerHTML='<div class="playerStats-content"><button type="button" is="paper-icon-button-light" class="playerStats-closeButton"><i class="md-icon"></i></button><div class="playerStats-stats scrollY hiddenScrollY-hover scrollY-mini"></div></div>',parent.querySelector(".playerStats-closeButton"));button&&button.addEventListener("click",function(){this.enabled(!1),_events.default.trigger(this,"close")}.bind(instance)),container.appendChild(parent),instance.element=parent}function getCategory(categories,type,name){for(var i=0,length=categories.length;i<length;i++){var _category=categories[i];if(_category.type===type)return _category}name={stats:[],name:name,type:type};return categories.push(name),name}function getStats(instance,player){var statsPromise=player.getStats?player.getStats():Promise.resolve({}),instance=function(instance,player){return Date.now()-(instance.lastSessionTime||0)<1e4?Promise.resolve(instance.lastSession):(player=_connectionmanager.default.getApiClient(_playbackmanager.default.currentItem(player).ServerId)).getSessions({deviceId:player.deviceId()}).then(function(sessions){return instance.lastSession=sessions[0]||{},instance.lastSessionTime=Date.now(),Promise.resolve(instance.lastSession)},function(){return Promise.resolve({})})}(instance,player);return Promise.all([statsPromise,instance]).then(function(responses){var playerStats=responses[0].categories||[],responses=responses[1],baseCategory={stats:function(session){for(var containerInfo,stats=[],playstate=session.PlayState||{},nowplayingItem=session.NowPlayingItem||{},session=session.TranscodingInfo||{},nowplayingItem=(nowplayingItem.Container&&(containerInfo=nowplayingItem.Container.toUpperCase(),nowplayingItem.Bitrate&&(containerInfo+=" ("+_dataformatter.default.bitrateToString(nowplayingItem.Bitrate)+")"),stats.push({label:containerInfo})),'<i class="md-icon playerStatsIcon autortl"></i>'),transcodeReasons=("Transcode"===playstate.PlayMethod?(containerInfo=[],session.SubProtocol&&"progressive"!==session.SubProtocol?containerInfo.push(session.SubProtocol.toUpperCase()):session.Container&&containerInfo.push(session.Container.toUpperCase()),session.Bitrate&&(playstate="(",session.Bitrate&&(playstate+=_dataformatter.default.bitrateToString(session.Bitrate)),session.Framerate&&(playstate+=" "+session.Framerate+" fps"),containerInfo.push(playstate+=")")),session.CurrentThrottle&&containerInfo.push('<span class="secondaryText">Throttling</span>'),nowplayingItem+=containerInfo.join(" ")):nowplayingItem+=_globalize.default.translate("HeaderDirectPlay"),stats.push({value:nowplayingItem}),session.TranscodeReasons||[]),i=0,length=transcodeReasons.length;i<length;i++)stats.push({value:_globalize.default.translate(transcodeReasons[i])});return stats}(responses),name:_globalize.default.translate("Stream")},categories=[];categories.push(baseCategory);for(var i=0,length=playerStats.length;i<length;i++){var category=playerStats[i];"audio"===category.type?category.name=_globalize.default.translate("Audio"):"video"===category.type&&(category.name=_globalize.default.translate("Video")),categories.push(category)}baseCategory=getCategory(categories,"video",_globalize.default.translate("Video")),Array.prototype.splice.apply(baseCategory.stats,[0,0].concat(function(session){for(var mediaStream,stats=[],playstate=session.PlayState||{},mediaStreams=(session.NowPlayingItem||{}).MediaStreams||[],videoStreamIndex=playstate.VideoStreamIndex,playstate=session.TranscodingInfo||{},i=0,length=mediaStreams.length;i<length;i++)if("Video"===mediaStreams[i].Type&&(null==videoStreamIndex||videoStreamIndex===mediaStreams[i].Index)){mediaStream=mediaStreams[i];break}if(mediaStream){var session=mediaStream.DisplayTitle||_globalize.default.translate("Video"),session=(playstate.VideoDecoderHwAccel&&(session+='<i class="md-icon playerStatsIcon playerStats-hwaccelIcon" title="'+_globalize.default.translate("HeaderHardwareAcceleratedDecoding")+" ("+(playstate.VideoDecoderHwAccel||_globalize.default.translate("Software"))+')"></i>'),stats.push({label:session}),[]),framerate=(mediaStream.Profile&&session.push(mediaStream.Profile),mediaStream.Level&&session.push(mediaStream.Level),mediaStream.BitRate&&session.push(_dataformatter.default.bitrateToString(mediaStream.BitRate)),mediaStream.AverageFrameRate||mediaStream.RealFrameRate),framerate=(framerate&&session.push(_dataformatter.default.numberToString(framerate,3)+" fps"),session.length&&stats.push({label:session.join(" ")}),'<i class="md-icon playerStatsIcon autortl"></i>');if(!1===playstate.IsVideoDirect?(framerate=(framerate=framerate+_globalize.default.translate("Transcode")+" (")+(playstate.VideoCodec||"").toUpperCase()+" ",playstate.VideoBitrate&&(framerate+=_dataformatter.default.bitrateToString(playstate.VideoBitrate)),framerate+=")",playstate.VideoEncoderHwAccel&&(framerate+='<i class="md-icon playerStatsIcon playerStats-hwaccelIcon" title="'+_globalize.default.translate("HeaderHardwareAcceleratedEncoding")+" ("+(playstate.VideoEncoderHwAccel||_globalize.default.translate("Software"))+')"></i>')):(framerate+=_globalize.default.translate("HeaderDirectPlay"),mediaStream.BitRate&&(framerate+=" ("+_dataformatter.default.bitrateToString(mediaStream.BitRate)+")")),stats.push({value:framerate}),!1===playstate.IsVideoDirect)for(var pipeline=playstate.VideoPipelineInfo||[],_i=0,_length=pipeline.length;_i<_length;_i++){var html,extra,step=pipeline[_i];"ToneMapping"!==step.StepType&&"Deinterlace"!==step.StepType&&"SubTitleBurnIn"!==step.StepType&&"SubtitleOverlay"!==step.StepType||(html="",html+='<i class="md-icon playerStatsIcon autortl"></i>',"ToneMapping"===step.StepType?html+=_globalize.default.translate("HeaderToneMapping"):"Deinterlace"===step.StepType?html+=_globalize.default.translate("Deinterlacing"):"SubTitleBurnIn"!==step.StepType&&"SubtitleOverlay"!==step.StepType||(html+=_globalize.default.translate("HeaderBurningInSubtitles")),extra=[],step.ParamShort?extra.push(step.ParamShort):step.Param?"Subtitles"!==step.Param&&extra.push(step.Param):step.FfmpegOptions&&extra.push(step.FfmpegOptions),extra.length&&(html+=' <span class="secondaryText">('+extra.join(" ")+")</span>"),stats.push({value:html}))}}return stats}(responses))),baseCategory=getCategory(categories,"audio",_globalize.default.translate("Audio"));return Array.prototype.splice.apply(baseCategory.stats,[0,0].concat(function(session){for(var mediaStream,stats=[],playstate=session.PlayState||{},mediaStreams=(session.NowPlayingItem||{}).MediaStreams||[],audioStreamIndex=playstate.AudioStreamIndex,playstate=session.TranscodingInfo||{},i=0,length=mediaStreams.length;i<length;i++)if("Audio"===mediaStreams[i].Type&&(null==audioStreamIndex||audioStreamIndex===mediaStreams[i].Index)){mediaStream=mediaStreams[i];break}return mediaStream&&(stats.push({label:mediaStream.DisplayTitle}),session=[],mediaStream.BitRate&&session.push(_dataformatter.default.bitrateToString(mediaStream.BitRate)),mediaStream.SampleRate&&session.push(mediaStream.SampleRate+" Hz"),session.length&&stats.push({label:session.join(" ")}),!(session='<i class="md-icon playerStatsIcon autortl"></i>')===playstate.IsAudioDirect?(session=(session=session+_globalize.default.translate("Transcode")+" (")+(playstate.AudioCodec||"").toUpperCase()+" ",playstate.AudioBitrate&&(session+=_dataformatter.default.bitrateToString(playstate.AudioBitrate)),session+=")"):(session+=_globalize.default.translate("HeaderDirectPlay"),mediaStream.BitRate&&(session+=" ("+_dataformatter.default.bitrateToString(mediaStream.BitRate)+")")),stats.push({value:session})),stats}(responses))),categories})}function renderPlayerStats(instance,player){var now=Date.now();now-(instance.lastRender||0)<700||(instance.lastRender=now,getStats(instance,player).then(function(stats){var elem=instance.element;elem&&!function(elem,categories){elem.querySelector(".playerStats-stats").innerHTML=categories.map(function(category){var categoryHtml="",stats=category.stats;stats.length&&category.name&&(categoryHtml=(categoryHtml=(categoryHtml+='<div class="playerStats-stat playerStats-stat-header"><div class="playerStats-stat-label">')+category.name+"</div>")+'<div class="playerStats-stat-value">'+(category.subText||"")+"</div></div>");for(var i=0,length=stats.length;i<length;i++){categoryHtml+='<div class="playerStats-stat">';var stat=stats[i];null!=stat.label&&(categoryHtml=(categoryHtml+='<div class="playerStats-stat-label">')+stat.label+"</div>"),null!=stat.value&&(categoryHtml=(categoryHtml+='<div class="playerStats-stat-value">')+stat.value+"</div>"),categoryHtml+="</div>"}return categoryHtml}).join("")}(elem,stats)}))}function unbindEvents(instance,player){instance=instance.onTimeUpdate;instance&&_events.default.off(player,"timeupdate",instance)}function PlayerStats(options){this.options=options,this.onTimeUpdate=function(){var options=this.options;options&&renderPlayerStats(this,options.player)}.bind(this),init(this,document.body),this.enabled(!0)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["css!modules/playerstats/playerstats.css"]),PlayerStats.prototype.enabled=function(enabled){if(null==enabled)return this._enabled;var player,options=this.options;options&&((this._enabled=enabled)?(this.element.classList.remove("hide"),enabled=this,player=options.player,(enabled=enabled.onTimeUpdate)&&_events.default.on(player,"timeupdate",enabled)):(this.element.classList.add("hide"),unbindEvents(this,options.player)))},PlayerStats.prototype.toggle=function(){this.enabled(!this.enabled())},PlayerStats.prototype.destroy=function(){var options=this.options,options=(options&&(this.options=null,unbindEvents(this,options.player)),this.element);options&&(options.parentNode.removeChild(options),this.element=null),this.onTimeUpdate=null},_exports.default=PlayerStats}); |